4jcraft/4J.Render/shaders/vertex.vert
2026-03-30 02:04:44 -05:00

60 lines
1.8 KiB
GLSL

R"GLSL(
#version 330 core
layout(location=0) in vec3 aPos;
layout(location=1) in vec2 aUV0;
layout(location=2) in vec4 aColor;
layout(location=3) in vec3 aNormal;
layout(location=4) in ivec2 aLMraw;
uniform mat4 uMVP;
uniform mat4 uMV;
uniform mat3 uNormalMatrix;
uniform float uNormalSign;
uniform mat4 uTexMat0;
uniform vec4 uBaseColor;
uniform int uLighting;
uniform vec3 uLight0Dir;
uniform vec3 uLight1Dir;
uniform vec3 uLightDiffuse;
uniform vec3 uLightAmbient;
uniform vec3 uChunkOffset;
uniform int uFogMode;
uniform float uFogStart;
uniform float uFogEnd;
uniform float uFogDensity;
uniform vec4 uLMTransform;
uniform vec2 uGlobalLM;
out vec2 vUV0;
out vec2 vUV1;
out vec4 vColor;
out float vFogFactor;
void main() {
vec4 aPos4 = vec4(aPos + uChunkOffset, 1.0);
vec4 eyePos = uMV * aPos4;
gl_Position = uMVP * aPos4;
vUV0 = (uTexMat0 * vec4(aUV0, 0.0, 1.0)).xy;
vec2 lm = (aLMraw.x <= -500) ? uGlobalLM : vec2(aLMraw);
vUV1 = (lm / 256.0) * uLMTransform.xy + uLMTransform.zw;
bool sentinel = (aColor == vec4(0.0));
vec4 col = sentinel ? uBaseColor : aColor.abgr;
if (uLighting == 1) {
vec3 n = normalize(uNormalMatrix * aNormal) * uNormalSign;
float d0 = max(dot(n, uLight0Dir), 0.0);
float d1 = max(dot(n, uLight1Dir), 0.0);
vColor = vec4(col.rgb * (uLightAmbient + uLightDiffuse * (d0 + d1)), col.a);
} else {
vColor = col;
}
float eDist = length(eyePos.xyz);
if (uFogMode == 1) vFogFactor = clamp((uFogEnd - eDist) / max(uFogEnd - uFogStart, 1e-4), 0.0, 1.0);
else if (uFogMode == 2) vFogFactor = clamp(exp(-uFogDensity * eDist), 0.0, 1.0);
else if (uFogMode == 3) { float d = uFogDensity * eDist; vFogFactor = clamp(exp(-d*d), 0.0, 1.0); }
else vFogFactor = 1.0;
}
)GLSL";