我想知道是否有办法优化这个顶点着色器 如果顶点着色器位于阴影中,则该顶点着色器(在光方向上)将顶点投影到远平面 此着色器的目的是创建一个阴影体对象,用于包围对象本身的阴影。
void main(void) {
vec3 lightDir = (gl_ModelViewMatrix * gl_Vertex
- gl_LightSource[0].position).xyz;
// if the vertex is lit
if ( dot(lightDir, gl_NormalMatrix * gl_Normal) < 0.01 ) {
// don't move it
gl_Position = ftransform();
} else {
// move it far, is the light direction
vec4 fin = gl_ProjectionMatrix * (
gl_ModelViewMatrix * gl_Vertex
+ vec4(normalize(lightDir) * 100000.0, 0.0)
);
if ( fin.z > fin.w ) // if fin is behind the far plane
fin.z = fin.w; // move to the far plane (needed for z-fail algo.)
gl_Position = fin;
}
}
答案 0 :(得分:1)
如果您不想触摸您的主要算法(正如Michael Daum在评论中所建议的那样),您可以替换代码的某些部分:
uniform mat4 infiniteProjectionMatrix;
if(...) {
...
} else {
gl_Position = infiniteProjectionMatrix * vec4(lightDir, 0.0);
}
其中infiniteProjectionMatrix是一个自定义投影矩阵,其中远平面已设置为无穷大(请参阅幻灯片7上的http://www.terathon.com/gdc07_lengyel.pdf),如下所示:
* 0 0 0
0 * 0 0
0 0 -1 *
0 0 -1 0
由于你投射到无限远,你不需要&#34; 100000.0&#34;缩放因子和&#34; gl_ModelViewMatrix * gl_Vertex&#34; offset可以忽略(与lightDir向量的无限长度相比)。