203 lines
6.9 KiB
XML
203 lines
6.9 KiB
XML
<?xml version="1.0" encoding="utf-8">
|
|
<!--
|
|
An effect consists of parameters and techniques. The "parameters"
|
|
section of an effect is a tree of values that describe, abstractly,
|
|
the graphical appearence of objects that use the effect. Techniques
|
|
refer to these parameters and use them to set OpenGL state or to
|
|
set parameters for shader programs. Parameters can be declared to
|
|
have a dynamic variance, which means that if their value is changed
|
|
the corresponding value in the technique will be changed too.
|
|
|
|
A technique can contain a predicate that describes the OpenGL
|
|
functionality required to support the technique. The first
|
|
technique with a valid predicate in the list of techniques is used
|
|
to set up the graphics state of the effect. A technique with no
|
|
predicate is always assumed to be valid.
|
|
|
|
A technique can consist of several passes, which are run in
|
|
sequence.
|
|
|
|
One feature not fully illustrated in the sample below is that
|
|
effects can inherit from each other. The parent effect is listed in
|
|
the "inherits-from" form. The child effect's property tree is
|
|
overlaid over that of the parent. This means that effects that
|
|
inherit from the example "default effect" below could be very
|
|
short, listing just new parameters and adding nothing to the
|
|
techniques section; alternatively, a technique could be altered or
|
|
customized in a child, listing (for example) a different shader
|
|
program. Terrain materials work in this way: for each material type
|
|
in materials.xml an effect is created that inherits from a single
|
|
default terrain effect. The parameters section of the effect is
|
|
filled in using the ambient, diffuse, etc. fields of the material.
|
|
|
|
Material animations will be implemented by creating a new effect
|
|
that inherits from one in a model, overriding the parameters that
|
|
will be animated.
|
|
|
|
Ultimately all OpenGL state will be setable in a technique. These
|
|
attributes and modes are currently implemented:
|
|
lighting - true, false
|
|
shade-model - flat, smooth
|
|
cull-face - front, back, front-back
|
|
rendering-hint - (OSG) opaque, transparent
|
|
render-bin - children: bin-number, bin-name
|
|
material - children: ambient, ambient-front, ambient-back, diffuse,
|
|
diffuse-front, diffuse-back, specular, specular-front,
|
|
specular-back, emissive, emissive-front, emissive-back, shininess,
|
|
shininess-front, shininess-back, color-mode
|
|
blend - true, false
|
|
alpha-test - true, false
|
|
texture-unit -
|
|
unit
|
|
texture2d
|
|
image (file name)
|
|
filter
|
|
mag-filter
|
|
wrap-s
|
|
wrap-t
|
|
wrap-r
|
|
environment
|
|
mode
|
|
color
|
|
program
|
|
vertex-shader
|
|
fragment-shader
|
|
uniform
|
|
name
|
|
type - float, float-vec3, float-vec4, sampler-1d, sampler-2d,
|
|
sampler-3d
|
|
polygon-mode
|
|
front - fill, line, point
|
|
back - fill, line, point
|
|
-->
|
|
<PropertyList>
|
|
<effect>
|
|
<name>city</name>
|
|
<!-- <inherits-from>another-effect</inherits-from> -->
|
|
<parameters>
|
|
<material>
|
|
<ambient type="vec4d">
|
|
0.0 0.0 0.0 1.0
|
|
</ambient>
|
|
<diffuse type="vec4d">
|
|
.5 .5 .5 1.0
|
|
</diffuse>
|
|
<specular type="vec4d">
|
|
0.3 0.3 0.3 1.0
|
|
</specular>
|
|
<emissive type="vec4d" variance="dynamic">
|
|
0.0 0.0 0.0 1.0
|
|
</emissive>
|
|
<shininess>1.2</shininess>
|
|
</material>
|
|
<texture n="0">
|
|
<texture2d>
|
|
<image>city.png</image>
|
|
<filter>linear-mipmap-linear</filter>
|
|
<!-- also repeat -->
|
|
<wrap-s>clamp</wrap-s>
|
|
<wrap-t>clamp-to-edge</wrap-t>
|
|
<!--
|
|
<wrap-r>clamp-to-border</wrap-r>
|
|
-->
|
|
<!-- float, signed-integer, integer -->
|
|
<internal-format>normalized</internal-format>
|
|
</texture2d>
|
|
</texture>
|
|
<texture n="1">
|
|
<texture2d>
|
|
<image>detail.png</image>
|
|
<filter>linear-mipmap-linear</filter>
|
|
<!-- also repeat -->
|
|
<wrap-s>clamp</wrap-s>
|
|
<wrap-t>clamp-to-edge</wrap-t>
|
|
<!--
|
|
<wrap-r>clamp-to-border</wrap-r>
|
|
-->
|
|
<!-- float, signed-integer, integer -->
|
|
<internal-format>normalized</internal-format>
|
|
</texture2d>
|
|
</texture>
|
|
<bump-height type="double">.05</bump-height>
|
|
<pattern-rotation type="vec4d">0 0 1 1.5708</pattern-rotation>
|
|
</parameters>
|
|
<technique>
|
|
<predicate>
|
|
<!-- This is the general way to test for shader support -->
|
|
<or>
|
|
<less-equal>
|
|
<value type="float">2.0</value>
|
|
<glversion/>
|
|
</less-equal>
|
|
<and>
|
|
<extension-supported>GL_ARB_shader_objects</extension-supported>
|
|
<extension-supported>GL_ARB_shading_language_100</extension-supported>
|
|
<extension-supported>GL_ARB_vertex_shader</extension-supported>
|
|
<extension-supported>GL_ARB_fragment_shader</extension-supported>
|
|
</and>
|
|
</or>
|
|
</predicate>
|
|
<pass>
|
|
<lighting>true</lighting>
|
|
<material>
|
|
<ambient><use>material/ambient</use></ambient>
|
|
<diffuse><use>material/diffuse</use></diffuse>
|
|
<specular><use>material/specular</use></specular>
|
|
<shininess><use>material/shininess</use></shininess>
|
|
</material>
|
|
<texture-unit>
|
|
<texture2d><use>texture[0]/texture2d</use></texture2d>
|
|
</texture-unit>
|
|
<texture-unit>
|
|
<texture2d><use>texture[1]/texture2d</use></texture2d>
|
|
</texture-unit>
|
|
<uniform>
|
|
<name>bumpHeight</name>
|
|
<type>float</type>
|
|
<use>bump-height</use>
|
|
</uniform>
|
|
<uniform>
|
|
<name>patternRotation</name>
|
|
<type>float-vec4</type>
|
|
<use>pattern-rotation</use>
|
|
</uniform>
|
|
<uniform>
|
|
<name>baseTexture</name>
|
|
<type>sampler-2d</type>
|
|
<value>0</value>
|
|
</uniform>
|
|
<uniform>
|
|
<name>detailTexture</name>
|
|
<type>sampler-2d</type>
|
|
<value>1</value>
|
|
</uniform>
|
|
<shader-program>
|
|
<!-- These two vertex shaders are linked together -->
|
|
<vertex-shader>
|
|
"Shaders/util.vert"
|
|
</vertex-shader>
|
|
<vertex-shader>
|
|
"Shaders/foo.vert"
|
|
</vertex-shader>
|
|
<fragment-shader>
|
|
"Shaders/foo.frag"
|
|
</fragment-shader>
|
|
</shader-program>
|
|
</pass>
|
|
</technique>
|
|
<!-- This technique is always valid -->
|
|
<technique>
|
|
<pass>
|
|
<lighting>true</lighting>
|
|
<material>
|
|
<ambient><use>material/ambient</use></ambient>
|
|
<diffuse><use>material/diffuse</use></diffuse>
|
|
<specular><use>material/specular</use></specular>
|
|
</material>
|
|
<texture-unit>
|
|
<texture2d><use>texture[0]/texture2d</use></texture2d>
|
|
</texture-unit>
|
|
</pass>
|
|
</technique>
|
|
</effect>
|
|
</PropertyList>
|