Effects describe the graphical appearance of 3d objects and scenery in FlightGear. The main motivation for effects is to support OpenGL shaders and to provide different implementations for graphics hardware of varying capabilities. Effects are similar to DirectX effects files and Ogre3D material scripts. An effect is a property list. The property list syntax is extended with new "vec3d" and "vec4d" types to support common computer graphics values. Effects are read from files with a ".eff" extension or can be created on-the-fly by FlightGear at runtime. An effect consists of a "parameters" section followed by "technique" descriptions. The "parameters" section 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. [TO BE IMPLEMENTED] 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. The predicate is written in a little expression language that supports the following primitives: and, or, equal, less, less-equal glversion - returns the version number of OpenGL extension-supported - returns true if an OpenGL extension is supported property - returns the boolean value of a property A technique can consist of several passes. A pass is basically an Open Scene Graph StateSet. Ultimately all OpenGL and OSG modes and state attributes will be setable in a technique. The following are 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 - has several child properties: unit - The number of an OpenGL texture unit type - This is either an OpenGL texture type or the name of a builtin texture. Currently supported OpenGL types are 1d, 2d, 3d which have the following common parameters: image (file name) filter mag-filter wrap-s wrap-t wrap-r The following builtin types are supported: white - 1 pixel white texture noise - a 3d noise texture 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 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. Nodes that have the same name and property index -- set by the "n=" attribute in the property tag -- are recursively merged. Leaf property nodes from the child have precedence. This means that effects that inherit from the example 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, specular, emissive, shininess, and transparent fields of the material. Seperate effects are created for each texture variant of a 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. city 0.0 0.0 0.0 1.0 .5 .5 .5 1.0 0.3 0.3 0.3 1.0 0.0 0.0 0.0 1.0 1.2 city.png linear-mipmap-linear clamp clamp-to-edge normalized detail.png linear-mipmap-linear clamp clamp-to-edge normalized .05 0 0 1 1.5708 2.0 GL_ARB_shader_objects GL_ARB_shading_language_100 GL_ARB_vertex_shader GL_ARB_fragment_shader true material/ambient material/diffuse material/specular material/shininess 0 texture[0]/image texture[0]/filter texture[0]/wrap-s texture[0]/wrap-t texture[0]/internal-format 1 texture[1]/image texture[1]/filter texture[1]/wrap-s texture[1]/wrap-t texture[1]/internal-format bumpHeight float bump-height patternRotation float-vec4 pattern-rotation baseTexture sampler-2d 0 detailTexture sampler-2d 1 "Shaders/util.vert" "Shaders/foo.vert" "Shaders/foo.frag" true material/ambient material/diffuse material/specular 0 texture[0]/image texture[0]/filter texture[0]/wrap-s texture[0]/wrap-t texture[0]/internal-format