Changes between Version 11 and Version 12 of MaterialSystem


Ignore:
Timestamp:
Mar 15, 2015, 12:54:55 PM (9 years ago)
Author:
wraitii
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • MaterialSystem

    v11 v12  
    44
    55== Definitions ==
    6 
    76 * '''Models''' are a single mesh with a single material and texture. ([wiki:Actors#ActorXMLformat Actor XML] files define how meshes and materials and textures are combined to make models. Actors can use props to combine multiple models for use by a single unit, but props are completely independent as far as the rendering is concerned, so we don't need to worry about them further.)
    87
     
    1716 * '''Defines''' are name/value strings that modify the behaviour of shader programs, e.g. `USE_SPECULAR=1` to activate the code that computes specular lighting, as with `#define`/`#ifdef` in the C preprocessor. They can also influence the selection of shader techniques. Some defines come from the rendering engine; others from materials.
    1817
     18 * '''Texture Samplers''' are what define textures in shader programs. They are required by materials using a `<required_texture>` tag and are defined in the actors.
     19
    1920 * '''Materials''' combine a shader effect with various defines and uniforms that specialize its behavior.
    2021
     
    2425
    2526== Conditionals ==
    26 
    2727Various XML files can contain conditionals, which are typically attributes of the form `if="..."`. These are C-preprocessor-style boolean expressions that can use the current set of defines, e.g.:
     28
    2829{{{
    2930#!xml
     
    3233<whatever if="(FOO || !(BAR && BAZ)) && QUX > 100"/>
    3334}}}
    34 
    3535== Materials ==
    36 
    3736Located in [source:ps/trunk/binaries/data/mods/public/art/materials art/materials/]. Example:
     37
    3838{{{
    3939#!xml
     
    5050}}}
    5151Materials can contain:
     52
    5253 * (rarely used) `<alternative material="..." if="..."/>` - if the conditional expression is true, then this material will be replaced by the given alternative. This can be useful so e.g. alpha-blended materials can get replaced with alpha-tested materials depending on some configuration.
     54
     55
     56
    5357 * (required) `<shader effect="..."/>` - refers to one of the [source:ps/trunk/binaries/data/mods/public/shaders/effects effect XML files].
    5458 * (rarely used) `<alpha_blending/>` - required if using a shader effect that uses alpha-blending. (This causes the engine to render the model twice, in `ALPHABLEND_PASS_OPAQUE` and `ALPHABLEND_PASS_BLEND` passes, to get correct blending relative to transparent water.)
    5559 * (zero or more times) `<define name="..." value="..."/>` - specifies a name/value define that is used when loading the shader. The value is typically `"1"` to enable an effect.
    5660 * (zero or more times) `<uniform name="..." value="..."/>` - specifies a uniform value that is used when rendering models using this material. The value is between 1 and 4 space-separated decimal numbers, e.g. `value="16"` or `value="1.0 1.0 0.0 0.5"`.
     61 * (zero or more times) `<required_texture name="..." (define="...")/>` - specifies that this material requires a texture sampler of the same name. The name itself is only a hint at what this texture will be used for. `define` is used as a shortcut if this texture requires a "define" to be used. See existing materials.
    5762
    5863== Defines ==
    59 
    6064Defines can come from many places: first from the engine, and then from `<define>`s inside `<material>`, `<technique>`, `<pass>`, `<program>`, and from `#define` in the source files, in that order. At each stage, conditionals can refer to the defines from all earlier stages. If a name is defined that was already defined in an earlier stage, its value will be overridden. There's no way to undefine a name, but defining it to `0` should have the same effect. (Shader source files should use `#if` instead of `#ifdef` to correctly handle values of `0`.)
    6165
     
    8488
    8589Set per model by engine code:
     90
    8691 * `IGNORE_LOS` - `1` when the `Vision` component has the `AlwaysVisible` flag, meaning the LOS texture should not be used.
    8792
    8893Set by materials:
     94
    8995 * `USE_OBJECTCOLOR` - `1` when the `objectColor` uniform should be used.
    9096 * `USE_PLAYERCOLOR` - `1` when the `playerColor` uniform should be used. (Mutually exclusive with `USE_OBJECTCOLOR`.)
    9197 * `USE_SPECULAR` - `1` when specular lighting should be rendered. Requires the following uniforms:
    92   * `float specularPower` - sharpness of specular highlights.
    93   * `vec3 specularColor` - color and brightness (components can be larger than 1.0).
     98   * `float specularPower` - sharpness of specular highlights.
     99   * `vec3 specularColor` - color and brightness (components can be larger than 1.0).
    94100 * `USE_TRANSPARENT` - `1` when the texture's alpha channel should be output by the fragment shader.
    95101 * `DISABLE_RECEIVE_SHADOWS` - `1` when shadows should not be cast onto this object.
    96102
    97103== Shader effects and techniques ==
    98 
    99104Located in [source:ps/trunk/binaries/data/mods/public/shaders/effects shaders/effects/]. Example:
    100105
     
    140145</effect>
    141146}}}
    142 
    143147An `<effect>` contains one or more `<technique>`s. Each technique can have a set of requirements:
     148
    144149 * `<require context="..."/>` - an arbitrary conditional expression. (This can refer to defines that come from the material, or the current rendering mode, or the global rendering context.)
    145150 * `<require shaders="glsl"/>` - requires that GLSL shaders are supported and enabled.
    146151 * `<require shaders="arb"/>` - requires that ARB shaders are supported and enabled.
    147152 * `<require shaders="fixed"/>` - requires that fixed-function (OpenGL 1.3ish) rendering is supported and enabled.
     153
    148154Whenever a material tries to use an effect, the most preferred technique whose requirements are satisfied will be used. There must always be at least one usable technique in each effect. Typically, techniques that are defined earliest in the XML file will be preferred over techniques defined later. The exception is if the `preferglsl` config option (or `renderer.preferGLSL` in the console) is true, techniques requiring GLSL will always be more preferred than others; if `preferglsl` is false (the default), then ones requiring GLSL will always be less preferred.
    149155
    150156`<technique>` can also contain:
     157
    151158 * (zero or more) `<define name="..." value="..."/>` - add a new define which may be used by the technique's shader programs.
    152159 * (rarely used) `<sort_by_distance/>` - required if the technique includes a pass that uses non-commutative alpha-blending. (This causes the engine to sort models from furthest to nearest before rendering, to get correct alpha-blending behaviour.)
     
    156163
    157164Every pass is rendered with a shader program (via the `shader="..."` attribute). `<pass>` can also contain:
     165
    158166 * (zero or more) `<define name="..." value="..."/>` - add a new define which may be used by the pass's shader program.
    159167 * `<alpha func="..." ref="..."/>` - equivalent to `glAlphaFunc(func, ref)`. `ref` is a float. `func` can be one of `never`, `always`, `less`, `lequal`, `equal`, `gequal`, `greater`, `notequal`.
     
    163171
    164172== Shader programs ==
    165 
    166 GLSL shaders are in [source:ps/trunk/binaries/data/mods/public/shaders/glsl shaders/glsl/].
    167 ARB shaders are in [source:ps/trunk/binaries/data/mods/public/shaders/arb shaders/arb/].
    168 Fixed-function 'shaders' are in [source:ps/trunk/source/graphics/ShaderProgramFFP.cpp ShaderProgramFFP.cpp] and will be discussed later.
     173GLSL shaders are in [source:ps/trunk/binaries/data/mods/public/shaders/glsl shaders/glsl/]. ARB shaders are in [source:ps/trunk/binaries/data/mods/public/shaders/arb shaders/arb/]. Fixed-function 'shaders' are in [source:ps/trunk/source/graphics/ShaderProgramFFP.cpp ShaderProgramFFP.cpp] and will be discussed later.
    169174
    170175ARB shaders are defined by an XML file like:
     176
    171177{{{
    172178#!xml
     
    192198</program>
    193199}}}
    194 
    195200GLSL shaders are defined by an XML file like:
     201
    196202{{{
    197203#!xml
     
    211217</program>
    212218}}}
    213 
    214219`<program>` must contain a `<vertex file="...">` and `<fragment file="...">`, referring to the ARB/GLSL source files. The vertex and fragment shaders are loaded and linked to create the complete program.
    215220
     
    219224
    220225`<vertex>` can contain:
     226
    221227 * `<stream name="..."/>` - requests that the engine provide a stream of per-vertex data. `name` can be `pos`, `normal`, `color`, `uv0`, `uv1`, `uv2`, `uv3`. The semantics of the streams (especially the UVs) is controlled by the rendering engine. For performance, shaders should only request streams that they actually use.
    222228
    223229=== ARB shaders ===
    224 
    225230Vertex streams (activated via `<stream>`) are automatically bound to the standard ARB-shader attribute symbols: `vertex.position`, `vertex.normal`, `vertex.color`, `vertex.texcoord[0]` etc.
    226231
    227232`<vertex>` and `<fragment>` can both contain:
     233
    228234 * `<uniform name="..." loc="..." type="..."/>` - binds a name to a local parameter location. The ARB program can read these via "`PARAM sunColor = program.local[0];`" etc. `type` can be one of `float`, `vec2`, `vec3`, `vec4`, `mat2`, `mat3`, `mat4`, though it doesn't actually do anything since the only type supported by ARB programs is `vec4`.
    229235 * `<uniform name="..." loc="..." type="sampler..."/>` - binds a name to a texture unit. The ARB program can read these as `texture[0]` etc. `type` can be one of `sampler2D`, `sampler2DShadow`, `samplerCube`.
     
    232238
    233239=== GLSL shaders ===
    234 
    235240Unlike ARB shaders, the uniforms and texture units in GLSL shaders are determined automatically (via `glGetActiveUniform` etc), so you don't need to define them in the XML.
    236241
    237242We use a subset of GLSL that largely corresponds to GLSL ES 1.00 and non-deprecated GLSL 1.30 - in particular, there is no `gl_Vertex` or `gl_Normal` etc, only generic vertex attributes. Therefore, `<vertex>` must contain:
     243
    238244 * `<attrib name="..." semantics="..."/>` - defines a binding between a named attribute in the vertex shader, and vertex data semantics. The `semantics` can be one of:
    239   * `gl_Vertex`
    240   * `gl_Normal`
    241   * `gl_Color`
    242   * `gl_SecondaryColor`
    243   * `gl_FogCoord`
    244   * `gl_MultiTexCoord0` to `gl_MultiTexCoord7`
    245   * `CustomAttribute0` to `CustomAttribute2`
    246  E.g. the XML file says `<attrib name="a_vertex" semantics="gl_Vertex"/>`, and the GLSL file says "`attribute vec3 a_vertex;`".
     245   * `gl_Vertex`
     246   * `gl_Normal`
     247   * `gl_Color`
     248   * `gl_SecondaryColor`
     249   * `gl_FogCoord`
     250   * `gl_MultiTexCoord0` to `gl_MultiTexCoord7`
     251   * `CustomAttribute0` to `CustomAttribute2` E.g. the XML file says `<attrib name="a_vertex" semantics="gl_Vertex"/>`, and the GLSL file says "`attribute vec3 a_vertex;`".
    247252
    248253=== Fixed-function shaders ===
    249 
    250254'Fixed-function' refers to the OpenGL 1.3 era of `glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE)` multi-texturing. These aren't really shaders but we use the same API as for the ARB/GLSL shaders, to simplify the rendering code.
    251255
     
    253257
    254258== Shader source files ==
    255 
    256 ARB vertex/fragment program source files have extensions `.vp` and `.fp` in [source:ps/trunk/binaries/data/mods/public/shaders/arb shaders/arb/].
    257 GLSL vertex/fragment shader source files have extensions `.vs` and `.fs` in [source:ps/trunk/binaries/data/mods/public/shaders/glsl shaders/glsl/].
     259ARB vertex/fragment program source files have extensions `.vp` and `.fp` in [source:ps/trunk/binaries/data/mods/public/shaders/arb shaders/arb/]. GLSL vertex/fragment shader source files have extensions `.vs` and `.fs` in [source:ps/trunk/binaries/data/mods/public/shaders/glsl shaders/glsl/].
    258260
    259261All source files are passed through a custom preprocessor before being compiled. This recognises basic C preprocessor syntax (`#if`, `#ifdef`, `#define`, etc; unfortunately not `#elif`), and can refer to the defines from all the earlier XML files (passes, techniques, materials, rendering mode, global renderer context, etc).