阴影卷着色器优化(GLSL)

时间:2010-03-25 18:30:55

标签: optimization opengl shader shadow

我想知道是否有办法优化这个顶点着色器 如果顶点着色器位于阴影中,则该顶点着色器(在光方向上)将顶点投影到远平面 此着色器的目的是创建一个阴影体对象,用于包围对象本身的阴影。

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;
  }
}

1 个答案:

答案 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向量的无限长度相比)。