The problem was that the depth prepass was using the clip plane but not the shading pass. During the clipping stage, the triangle is converted to a quad clipped to the given clip plane. But this introduce subtle changes in the depth when this new geometry is rasterized. Since the shading pass was using an EQUAL depth test, the depth values from the shading pass were not always equal to the depth prepass. Enabling clipping in the shading vertex shader has a too small impact to require a dedicated shader.
40 lines
874 B
GLSL
40 lines
874 B
GLSL
|
|
uniform mat4 ModelViewProjectionMatrix;
|
|
uniform mat4 ModelMatrix;
|
|
uniform mat4 ModelViewMatrix;
|
|
uniform mat3 WorldNormalMatrix;
|
|
#ifndef ATTRIB
|
|
uniform mat3 NormalMatrix;
|
|
#endif
|
|
|
|
in vec3 pos;
|
|
in vec3 nor;
|
|
|
|
out vec3 worldPosition;
|
|
out vec3 viewPosition;
|
|
|
|
/* Used for planar reflections */
|
|
uniform vec4 ClipPlanes[1];
|
|
|
|
#ifdef USE_FLAT_NORMAL
|
|
flat out vec3 worldNormal;
|
|
flat out vec3 viewNormal;
|
|
#else
|
|
out vec3 worldNormal;
|
|
out vec3 viewNormal;
|
|
#endif
|
|
|
|
void main() {
|
|
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
|
|
viewPosition = (ModelViewMatrix * vec4(pos, 1.0)).xyz;
|
|
worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz;
|
|
viewNormal = normalize(NormalMatrix * nor);
|
|
worldNormal = normalize(WorldNormalMatrix * nor);
|
|
|
|
/* Used for planar reflections */
|
|
gl_ClipDistance[0] = dot(vec4(worldPosition, 1.0), ClipPlanes[0]);
|
|
|
|
#ifdef ATTRIB
|
|
pass_attrib(pos);
|
|
#endif
|
|
} |