Arbeiten aus dem URlaub
This commit is contained in:
20
ez-tree-jme/assets/Shaders/LeafPostShadow.frag
Normal file
20
ez-tree-jme/assets/Shaders/LeafPostShadow.frag
Normal file
@@ -0,0 +1,20 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform sampler2D m_ShadowMap0;
|
||||
uniform float m_ShadowIntensity;
|
||||
uniform sampler2D m_LeafMap;
|
||||
uniform bool m_HasLeafMap;
|
||||
|
||||
in vec4 shadowCoord;
|
||||
in vec2 texCoord;
|
||||
|
||||
void main() {
|
||||
// Transparente Blattbereiche empfangen keinen Schatten
|
||||
if (m_HasLeafMap && texture2D(m_LeafMap, texCoord).a < 0.5) discard;
|
||||
|
||||
vec3 coord = shadowCoord.xyz / shadowCoord.w;
|
||||
float mapDepth = texture2D(m_ShadowMap0, coord.xy).r;
|
||||
float lit = (coord.z > mapDepth + 0.001) ? (1.0 - m_ShadowIntensity) : 1.0;
|
||||
|
||||
gl_FragColor = vec4(lit, lit, lit, 1.0);
|
||||
}
|
||||
18
ez-tree-jme/assets/Shaders/LeafPostShadow.vert
Normal file
18
ez-tree-jme/assets/Shaders/LeafPostShadow.vert
Normal file
@@ -0,0 +1,18 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform mat4 g_WorldViewProjectionMatrix;
|
||||
uniform mat4 g_WorldMatrix;
|
||||
uniform mat4 m_LightViewProjectionMatrix0;
|
||||
|
||||
in vec3 inPosition;
|
||||
in vec2 inTexCoord;
|
||||
|
||||
out vec4 shadowCoord;
|
||||
out vec2 texCoord;
|
||||
|
||||
void main() {
|
||||
gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
|
||||
vec4 worldPos = g_WorldMatrix * vec4(inPosition, 1.0);
|
||||
shadowCoord = m_LightViewProjectionMatrix0 * worldPos;
|
||||
texCoord = inTexCoord;
|
||||
}
|
||||
15
ez-tree-jme/assets/Shaders/LeafPreShadow.frag
Normal file
15
ez-tree-jme/assets/Shaders/LeafPreShadow.frag
Normal file
@@ -0,0 +1,15 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform sampler2D m_LeafMap;
|
||||
uniform bool m_HasLeafMap;
|
||||
|
||||
in vec2 texCoord;
|
||||
|
||||
void main() {
|
||||
if (m_HasLeafMap) {
|
||||
vec4 tex = texture2D(m_LeafMap, texCoord);
|
||||
if (tex.a < 0.5) discard;
|
||||
}
|
||||
// Nur Tiefe schreiben — ColorWrite ist per ForcedRenderState deaktiviert
|
||||
gl_FragColor = vec4(1.0);
|
||||
}
|
||||
13
ez-tree-jme/assets/Shaders/LeafPreShadow.vert
Normal file
13
ez-tree-jme/assets/Shaders/LeafPreShadow.vert
Normal file
@@ -0,0 +1,13 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform mat4 g_WorldViewProjectionMatrix;
|
||||
|
||||
in vec3 inPosition;
|
||||
in vec2 inTexCoord;
|
||||
|
||||
out vec2 texCoord;
|
||||
|
||||
void main() {
|
||||
gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
|
||||
texCoord = inTexCoord;
|
||||
}
|
||||
29
ez-tree-jme/assets/Shaders/Tree.frag
Normal file
29
ez-tree-jme/assets/Shaders/Tree.frag
Normal file
@@ -0,0 +1,29 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform vec4 m_Diffuse;
|
||||
uniform sampler2D m_BarkMap;
|
||||
uniform bool m_HasBarkMap;
|
||||
|
||||
in vec2 texCoord;
|
||||
in vec3 worldNormal;
|
||||
|
||||
void main() {
|
||||
vec3 n = normalize(worldNormal);
|
||||
|
||||
// Sun at ~45° elevation from SE — good contrast on vertical cylinders
|
||||
vec3 sunDir = normalize(vec3(0.6, 0.7, 0.4));
|
||||
vec3 fillDir = normalize(vec3(-0.5, 0.3, -0.4));
|
||||
vec3 rimDir = normalize(vec3(-0.3, 0.5, 0.7));
|
||||
|
||||
float sun = max(dot(n, sunDir), 0.0);
|
||||
float fill = max(dot(n, fillDir), 0.0) * 0.22;
|
||||
float rim = max(dot(n, rimDir), 0.0) * 0.14;
|
||||
float sky = dot(n, vec3(0.0, 1.0, 0.0)) * 0.4 + 0.4; // [0.0, 0.8]
|
||||
float light = sun * 0.75 + fill + rim + sky * 0.09 + 0.05;
|
||||
|
||||
vec3 baseColor = m_HasBarkMap
|
||||
? texture2D(m_BarkMap, texCoord).rgb * m_Diffuse.rgb
|
||||
: m_Diffuse.rgb;
|
||||
|
||||
gl_FragColor = vec4(baseColor * clamp(light, 0.0, 1.0), m_Diffuse.a);
|
||||
}
|
||||
33
ez-tree-jme/assets/Shaders/Tree.vert
Normal file
33
ez-tree-jme/assets/Shaders/Tree.vert
Normal file
@@ -0,0 +1,33 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform mat4 g_WorldViewProjectionMatrix;
|
||||
uniform mat4 g_WorldMatrix;
|
||||
uniform float g_Time;
|
||||
uniform float m_WindStrength;
|
||||
uniform float m_WindSpeed;
|
||||
|
||||
in vec3 inPosition;
|
||||
in vec3 inNormal;
|
||||
in vec2 inTexCoord;
|
||||
in vec4 inColor; // R = Wind-Gewicht (0 = Wurzel, 1 = Spitze)
|
||||
|
||||
out vec2 texCoord;
|
||||
out vec3 worldNormal;
|
||||
|
||||
void main() {
|
||||
float windW = inColor.r;
|
||||
float t = g_Time * m_WindSpeed;
|
||||
|
||||
// Welt-Position für orts-abhängige Phase (verhindert synchrones Schwingen)
|
||||
vec4 worldPos = g_WorldMatrix * vec4(inPosition, 1.0);
|
||||
float phase = worldPos.x * 0.08 + worldPos.z * 0.06;
|
||||
|
||||
float swayX = sin(t + phase) * windW * m_WindStrength;
|
||||
float swayZ = cos(t * 0.73 + phase) * windW * m_WindStrength * 0.55;
|
||||
|
||||
vec3 animPos = inPosition + vec3(swayX, 0.0, swayZ);
|
||||
|
||||
gl_Position = g_WorldViewProjectionMatrix * vec4(animPos, 1.0);
|
||||
texCoord = inTexCoord;
|
||||
worldNormal = normalize((g_WorldMatrix * vec4(inNormal, 0.0)).xyz);
|
||||
}
|
||||
27
ez-tree-jme/assets/Shaders/TreeLeaf.frag
Normal file
27
ez-tree-jme/assets/Shaders/TreeLeaf.frag
Normal file
@@ -0,0 +1,27 @@
|
||||
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
||||
|
||||
uniform vec4 m_Diffuse;
|
||||
uniform sampler2D m_LeafMap;
|
||||
uniform bool m_HasLeafMap;
|
||||
|
||||
in vec2 texCoord;
|
||||
in vec3 worldNormal;
|
||||
|
||||
void main() {
|
||||
vec3 baseColor;
|
||||
|
||||
if (m_HasLeafMap) {
|
||||
vec4 tex = texture2D(m_LeafMap, texCoord);
|
||||
if (tex.a < 0.5) discard;
|
||||
baseColor = tex.rgb * m_Diffuse.rgb;
|
||||
} else {
|
||||
// Fallback: kreisförmiger Clip
|
||||
vec2 uv = texCoord * 2.0 - 1.0;
|
||||
if (dot(uv, uv) > 0.95) discard;
|
||||
float edge = 1.0 - dot(uv, uv);
|
||||
baseColor = m_Diffuse.rgb * (0.7 + 0.3 * edge);
|
||||
}
|
||||
|
||||
// Leaves transmit light — no directional shading, uniform brightness
|
||||
gl_FragColor = vec4(baseColor, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user