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
Last revisionBoth sides next revision
0.8.4:default-material [2022/06/21 21:16] – [Register a user-specific UniformBuffer] admin0.8.4:default-material [2023/01/31 14:07] – [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 1151: Line 1155:
 Registering textures in shader is a little but different, but quite easy. Registering textures in shader is a little but different, but quite easy.
  
-Because the default material manages a pool of textures, we simply have to add a texture to and the component will do the rest for us.+Because the default material manages a pool of textures, we only have to add a texture to it, and the component will do the rest for us.
  
 Working further with our //TMyMaterial//, we need also a //TMyMaterialSource// to overwrite the protected **DoCreateDefaultBitmaps()** method. Working further with our //TMyMaterial//, we need also a //TMyMaterialSource// to overwrite the protected **DoCreateDefaultBitmaps()** method.
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 [[Shader-Variables|#tgorillaglobalsnode_globals]] 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 =====