Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
0.8.4:default-material [2022/06/21 21:18] – [Register a texture variable] admin0.8.4:default-material [2023/01/31 14:07] (current) – [Changing Shaders at DesignTime] admin
Line 149: Line 149:
         - <6> [TGorillaGLSLSurfaceShaderExec]         - <6> [TGorillaGLSLSurfaceShaderExec]
         - <7> [TGorillaGLSLMergedColorOutputNode]         - <7> [TGorillaGLSLMergedColorOutputNode]
-        - <8> [TGorillaGLSLFragColorOutputNode+        - <8> [TGorillaGLSLBrightnessColorNode
-        - <9> [TGorillaGLSLColorClipNode+        - <9> [TGorillaGLSLFragColorOutputNode
-        - <10> [TGorillaGLSLFogApplyNode+        - <10> [TGorillaGLSLColorClipNode
-        - <11> [TGorillaGLSLWeightedBlendedOITNode]+        - <11> [TGorillaGLSLFogApplyNode] 
 +        - <12> [TGorillaGLSLWeightedBlendedOITNode]
 </file> </file>
 ===== Node Classes ===== ===== Node Classes =====
Line 303: Line 304:
   * **tex2D()**   * **tex2D()**
   * **tex2DProj()**   * **tex2DProj()**
-  * **tex3d()**+  * **tex3D()**
   * **texCube()**   * **texCube()**
   * **Texture_GetNormal()**   * **Texture_GetNormal()**
Line 402: Line 403:
 | SurfaceShader | TGorillaGLSLSurfaceShaderExec| Calls **SurfaceShader(LOCALS);** | | SurfaceShader | TGorillaGLSLSurfaceShaderExec| Calls **SurfaceShader(LOCALS);** |
 | SurfaceShader | TGorillaGLSLMergedColorOutputNode |It will compute the final **LOCALS.SumColor** depending if GORILLA_GLSL_DEFINE_LIGHTING, GORILLA_GLSL_DEFINE_SPECULARMAP, GORILLA_GLSL_DEFINE_SHADOW or GORILLA_GLSL_DEFINE_PBR are activated. | | SurfaceShader | TGorillaGLSLMergedColorOutputNode |It will compute the final **LOCALS.SumColor** depending if GORILLA_GLSL_DEFINE_LIGHTING, GORILLA_GLSL_DEFINE_SPECULARMAP, GORILLA_GLSL_DEFINE_SHADOW or GORILLA_GLSL_DEFINE_PBR are activated. |
 +| SurfaceShader | TGorillaGLSLBrightnessColorNode | It will multiply **_Brightness** value with **LOCALS.SumColor** (since v0.8.4.2322)|
 | SurfaceShader | TGorillaGLSLFragColorOutputNode | It will apply material alpha value to **LOCALS.Alpha** and finally write **vec4(LOCALS.SumColor, LOCALS.Alpha)** to //o_Albedo// render target. | | SurfaceShader | TGorillaGLSLFragColorOutputNode | It will apply material alpha value to **LOCALS.Alpha** and finally write **vec4(LOCALS.SumColor, LOCALS.Alpha)** to //o_Albedo// render target. |
 | SurfaceShader | TGorillaGLSLColorClipNode | If GORILLA_GLSL_DEFINE_USE_COLORCLIP is activated, it will discard the fragment if threshold was reached. | | SurfaceShader | TGorillaGLSLColorClipNode | If GORILLA_GLSL_DEFINE_USE_COLORCLIP is activated, it will discard the fragment if threshold was reached. |
Line 585: Line 587:
     /// </summary>     /// </summary>
     Options : FixedInt;     Options : FixedInt;
 +    
 +    /// <summary>
 +    /// Defines how much shading is applied to diffuse and specular color.
 +    /// </summary>
 +    ShadingIntensity : Single;
 +    /// <summary>
 +    /// Defines the brightness factor applied to the diffuse color.
 +    /// </summary>
 +    Brightness : Single;
  
     /// <summary>     /// <summary>
Line 603: Line 614:
     /// </summary>     /// </summary>
     FogEnd : Single; // default = 500.0     FogEnd : Single; // default = 500.0
- 
-    /// <summary> 
-    /// Due to memory alignment in GPU we need to adjust bytes here. 
-    /// It is important to use the untyped array of byte. 
-    /// </summary> 
-    Reserved0 : Array[0..7] of Byte; 
- 
     /// <summary>     /// <summary>
     /// Define the fog color used for computation.     /// Define the fog color used for computation.
Line 1292: Line 1296:
 ==== Calling an individual functions ==== ==== Calling an individual functions ====
  
-After we declared our user specific function, we want to call it in the shader. +After we've declared our user specific function, we want to call it in the shader. 
-For that we do again need a new node type. +For that we need a new node. Here the basic class //TGorillaNodeEntity// is quite perfect for the job.
-Here the easiest class TGorillaNodeEntity is quite perfect for the job.+
  
 Afterwards we have to attach the node to the node-builder again. Afterwards we have to attach the node to the node-builder again.
Line 1300: Line 1303:
  
 In our example we've written a function that returns the current texture color. In our example we've written a function that returns the current texture color.
-This is called base-color. The default shader declares a local variable "l_BaseColor" for that.+This is called base-color. The default shader declares a local variable "LOCALS.BaseColor" for that.
 If we set this, it will automatically be used in the color-light-summary. If we set this, it will automatically be used in the color-light-summary.
  
Line 1306: Line 1309:
 "FragmentShaderNode.SurfaceShader". "FragmentShaderNode.SurfaceShader".
  
-__Caution:__ The problem here is, that there is already a node (**TGorillaGLSLGetBaseColorNode**) that computes the "l_BaseColor" value. So we need to remove it and insert ours at this point, to ensure the correct order of operations.+__Caution:__ The problem here is, that there is already a node (**TGorillaGLSLGetBaseColorNode**) that computes the "LOCALS.BaseColor" value. So we need to replace it with our node. But we have to ensure the correct position in node hierarchy for a valid shader code output.
  
 <file pascal> <file pascal>
Line 1343: Line 1346:
  
  
 +==== Changing Shaders at DesignTime ====
  
 +Since 0.8.4 it's possible to modify your default shader at designtime, by using published properties *VertexShader* or *SurfaceShader*.
 +
 +Simply select your default material source, go to object inspector and open the text editor of the property. An empty GLSL function should be visible depending on the shader used.
 +
 +For VertexShader:
 +<file glsl>
 +void VertexShader(inout TLocals DATA){
 +
 +}
 +</file>
 +
 +For SurfaceShader (Fragment/Pixel-Shader):
 +<file glsl>
 +void SurfaceShader(inout TLocals DATA){
 +
 +}
 +</file>
 +
 +You can then modify or extend the shader functionality.
 +Please have a look a the section [[#tgorillaglobalsnode_globals|Shader-Variables]] for the available fields in TLocals structure.
 +
 +**NOTICE:** //Modifying the vertex position in vertex-shader all 3 fields "DATA.Position", "DATA.TransfVertexPos" and "DATA.WorldViewProjVertPos" need to be modified. Otherwise their basis might not be equal which leads to unexpected effects!//
 +
 +In the following example we've created a wobbling effect in the vertex shader:
 +
 +<file glsl>
 +vec2 DELPHI_HASH2(vec2 n){ 
 +    return fract(sin(n)*1399763.5453123);
 +}
 +
 +float DELPHI_NOISE(vec2 st){
 +    vec2 i = floor(st);
 +    vec2 f = fract(st);
 +
 +    vec2 u = f * f * (3.0 - 2.0 * f);
 +
 +    float a = dot(DELPHI_HASH2(i + vec2(0.0,0.0)), f - vec2(0.0, 0.0));
 +    float b = dot(DELPHI_HASH2(i + vec2(1.0,0.0)), f - vec2(1.0, 0.0));
 +    float c = dot(DELPHI_HASH2(i + vec2(0.0,1.0)), f - vec2(0.0, 1.0));
 +    float d = dot(DELPHI_HASH2(i + vec2(1.0,1.0)), f - vec2(1.0, 1.0));
 +
 +    return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
 +}
 +
 +vec3 DELPHI_WOBBLE(vec3 pos, float time, float intensity){
 +    return vec3(pos.x, pos.y + (DELPHI_NOISE(vec2(pos.x, pos.z) + time) * intensity), pos.z);
 +}
 +
 +void VertexShader(inout TLocals DATA){
 +  DATA.Position.xyz = DELPHI_WOBBLE(DATA.Position.xyz, _TimeInfo.y, 0.5);
 +
 +  DATA.TransfVertexPos = _ModelMatrix * DATA.Position;
 +  DATA.WorldViewProjVertPos = _ModelViewProjectionMatrix * DATA.Position;
 +}
 +</file>
 ===== Properties ===== ===== Properties =====