# Shader Syntax Overview
# Preprocessor
Wallpaper Engine uses a custom preprocessor to cull unused code and introspect a shader before compilation. The preprocessor is not a fullfledged C preprocessor and is lacking, for example, string conversion and concatenation. Conditionals should however work with boolean and logic operators, except for #elif, which isn't supported.
# The following define directives are applied based on context
- GLSL: Shader is being compiled as GLSL.
- HLSL: Shader is being compiled as HLSL.
- HLSL_SM40: Shader is being compiled for shader model 4.
- HLSL_GS40: Current renderer supports shader model 4 geometry shaders.
# The following directives make it easier to write a shader that supports GLSL and HLSL
- texSample2D (sampler, vec2 uvs) -> vec4: Sample a simple 2D texture. First parameter is a sampler constant and the second parameter a vec2 texture coordinate.
- texSample2DLod (sampler, vec2 uvs, float lod) -> vec4: Sample a simple 2D texture. First parameter is a sampler constant, the second parameter a vec2 texture coordinate and the third parameter a float to designate which mip maps get sampled.
- mix: Mix is the GLSL name for lerp in HLSL and accepted for both in Wallpaper Engine. So you should use mix to make the shader fully compatible.
- frac: frac is the HLSL name for fract in GLSL. So you should use frac to make the shader fully compatible.
- saturate: saturate is the HLSL name for clamp(x, 0, 1) in GLSL.
- atan2: atan2 is the HLSL name for atan in GLSL. So you should use atan2 to make the shader fully compatible.
- ddx: ddx is the HLSL name for dFdx in GLSL. So you should use ddx to make the shader fully compatible.
- ddy: ddy is the HLSL name for dFdy in GLSL. So you should use ddy to make the shader fully compatible.
# Type Casting
Since shaders are translated into HLSL, it is recommended to use the following casting macros for construction and casting. For example, when you want to cast a 4x4 matrix into 3x3 or when you want to create a vec3 from a single float.
- CAST2(): This will call vec2(x) in GLSL and do (float2)x in HLSL.
- CAST3(): This will call vec3(x) in GLSL and do (float3)x in HLSL.
- CAST4(): This will call vec4(x) in GLSL and do (float4)x in HLSL.
- CAST3X3(): This will call mat3(x) in GLSL and do (float3x3)x in HLSL.
# Shader Inputs and Outputs
Wallpaper Engine currently uses the old GLSL syntax based on attribute, varying, uniform and globals like gl_FragColor.
- An attribute is a hardcoded parameter that is provided by Wallpaper Engine per vertex.
- A varying can be freely defined by you. This is what the vertex shader outputs to the pixel shader and will be linearly interpolated between adjacent vertices of a primitive.
- Final global outputs like gl_FragColor are forwarded to the next stage to be immediately used for displaying the result of your shader.
# Vertex Shader
Vertex shaders for image/text layers currently only support the attributes a_Position and a_TexCoord.
# Input Attributes
- a_Position (
vec3
): The position in object space. - a_PositionVec4 (
vec4
) - a_Normal (
vec3
): The normal in object space. - a_Tangent4 (
vec4
): The tangent in object space with bitangent sign in w. - a_TexCoord (
vec2
): The basic texture coordinates. - a_TexCoordVec3 (
vec3
) - a_TexCoordVec4 (
vec4
) - a_TexCoordC1 (
vec2
) - a_TexCoordVec3C1 (
vec3
) - a_TexCoordVec4C1 (
vec4
) - a_TexCoordC2 (
vec2
) - a_TexCoordVec3C2 (
vec3
) - a_TexCoordVec4C2 (
vec4
) - a_TexCoordC3 (
vec2
) - a_TexCoordVec3C3 (
vec3
) - a_TexCoordVec4C3 (
vec4
) - a_TexCoordC4 (
vec2
) - a_TexCoordVec3C4 (
vec3
) - a_TexCoordVec4C4 (
vec4
) - a_TexCoordC5 (
vec2
) - a_TexCoordVec3C5 (
vec3
) - a_TexCoordVec4C5 (
vec4
) - a_Color (
vec4
)
# Fragment Shader
# Outputs
- gl_FragColor (
vec4
): The final output color for a given pixel.