55 lines
1.7 KiB
GLSL
55 lines
1.7 KiB
GLSL
uniform sampler2D m_Tex0;
|
|
uniform sampler2D m_Tex1;
|
|
uniform sampler2D m_Tex2;
|
|
uniform sampler2D m_Tex3;
|
|
uniform float m_TexScale;
|
|
|
|
in vec3 vWorldPos;
|
|
in vec3 vNormal;
|
|
in vec4 vMatWeights;
|
|
|
|
out vec4 outColor;
|
|
|
|
void main() {
|
|
vec3 blendWeights = abs(vNormal);
|
|
blendWeights = max(blendWeights - 0.2, 0.0);
|
|
blendWeights /= (blendWeights.x + blendWeights.y + blendWeights.z + 0.001);
|
|
|
|
vec2 uvX = vWorldPos.yz / m_TexScale;
|
|
vec2 uvY = vWorldPos.xz / m_TexScale;
|
|
vec2 uvZ = vWorldPos.xy / m_TexScale;
|
|
|
|
vec4 col = vec4(0.0);
|
|
|
|
float w0 = vMatWeights.r;
|
|
if (w0 > 0.001) {
|
|
col += w0 * (texture(m_Tex0, uvX) * blendWeights.x
|
|
+ texture(m_Tex0, uvY) * blendWeights.y
|
|
+ texture(m_Tex0, uvZ) * blendWeights.z);
|
|
}
|
|
float w1 = vMatWeights.g;
|
|
if (w1 > 0.001) {
|
|
col += w1 * (texture(m_Tex1, uvX) * blendWeights.x
|
|
+ texture(m_Tex1, uvY) * blendWeights.y
|
|
+ texture(m_Tex1, uvZ) * blendWeights.z);
|
|
}
|
|
float w2 = vMatWeights.b;
|
|
if (w2 > 0.001) {
|
|
col += w2 * (texture(m_Tex2, uvX) * blendWeights.x
|
|
+ texture(m_Tex2, uvY) * blendWeights.y
|
|
+ texture(m_Tex2, uvZ) * blendWeights.z);
|
|
}
|
|
float w3 = vMatWeights.a;
|
|
if (w3 > 0.001) {
|
|
col += w3 * (texture(m_Tex3, uvX) * blendWeights.x
|
|
+ texture(m_Tex3, uvY) * blendWeights.y
|
|
+ texture(m_Tex3, uvZ) * blendWeights.z);
|
|
}
|
|
|
|
vec3 lightDir = normalize(vec3(0.5, 1.0, 0.3));
|
|
float diff = max(dot(vNormal, lightDir), 0.0) * 0.7 + 0.3;
|
|
|
|
outColor = vec4(col.rgb * diff, col.a);
|
|
if (outColor.a < 0.1) discard;
|
|
}
|