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