1

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

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

1 回答 1

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

由于您投影到无穷大,因此不需要“100000.0”缩放因子,并且可以忽略“gl_ModelViewMatrix * gl_Vertex”偏移(与 lightDir 向量的无限长度相比)。

于 2014-03-27T05:48:36.843 回答