diff --git a/tutorials/shaders/shader_reference/shader_preprocessor.rst b/tutorials/shaders/shader_reference/shader_preprocessor.rst index fa2a85576..8f713cbfc 100644 --- a/tutorials/shaders/shader_reference/shader_preprocessor.rst +++ b/tutorials/shaders/shader_reference/shader_preprocessor.rst @@ -47,8 +47,8 @@ General syntax Defines the identifier after that directive as a macro, and replaces all successive occurrences of it with the replacement code given in the shader. Replacement is performed on a "whole words" basis, which means no replacement is -performed if the string is part of another string (without any spaces separating -it). +performed if the string is part of another string (without any spaces or +operators separating it). Defines with replacements may also have one or more *arguments*, which can then be passed when referencing the define (similar to a function call). @@ -56,6 +56,21 @@ be passed when referencing the define (similar to a function call). If the replacement code is not defined, the identifier may only be used with ``#ifdef`` or ``#ifndef`` directives. +If the *concatenation* symbol (``##``) is present in the replacement code then +it will be removed upon macro insertion, together with any space surrounding +it, and join the surrounding words and arguments into a new token. + +.. code-block:: glsl + + uniform sampler2D material0; + + #define SAMPLE(N) vec4 tex##N = texture(material##N, UV) + + void fragment() { + SAMPLE(0); + ALBEDO = tex0.rgb; + } + Compared to constants (``const CONSTANT = value;``), ``#define`` can be used anywhere within the shader (including in uniform hints). ``#define`` can also be used to insert arbitrary shader code at any location,