1

私は最近、チームメンバーが数か月前に辞めたまま停滞したプロジェクトを引き継ぎました。スピードを上げようとしているときに、この頂点シェーダーに出くわしましたが、その機能を理解するのに苦労しています。

uniform int axes;
varying vec4 passcolor;

void main()
{
  // transform the vertex
  vec4 point;
  if (axes == 0) {
     point = gl_Vertex;
  } else if (axes == 1) {
     point = gl_Vertex.xzyw;

  } else if (axes == 2) {
     point = gl_Vertex.xwzy;

  } else if (axes == 3) {
      point = gl_Vertex.yzxw;

  } else if (axes == 4) {
     point = gl_Vertex.ywxz;

  } else if (axes == 5) {
     point = gl_Vertex.zwxy;
  }

  point.z = 0.0;
  point.w = 1.0;

  // eliminate w point
  gl_Position = gl_ModelViewProjectionMatrix * point;

 passcolor = gl_Color;
}

私がよりよく理解したい行は、次のような行です。

point = gl_Vertex.xwzy;

これを説明するドキュメントが見つからないようです。

誰かがこのシェーダーが何をしているのか簡単に説明できますか?

4

2 に答える 2

3

これを説明するドキュメントが見つからないようです。

GLSL 仕様は、スウィズル選択がどのように機能するかについて非常に明確です。

シェーダーが基本的に行っていることは、 から 2 つの軸を選択する鈍い方法ですvec4。の Z と W はpoint、選択後に上書きされることに注意してください。当然のことながら、次のように書き換えることができます。

vec2 point;
if (axes == 0) {
   point = gl_Vertex.xy;
} else if (axes == 1) {
   point = gl_Vertex.xz;
} else if (axes == 2) {
   point = gl_Vertex.xw;
} else if (axes == 3) {
   point = gl_Vertex.yz;
} else if (axes == 4) {
   point = gl_Vertex.yw;
} else if (axes == 5) {
   point = gl_Vertex.zw;
}

gl_Position = gl_ModelViewProjectionMatrix * vec4(point.xy, 0.0, 1.0);

したがって、入力頂点から 2 つの座標を選択するだけです。なぜこれを行う必要があるのか​​ 、私には言えません。

于 2011-10-06T02:34:08.110 に答える
2

の後の x、y、z、および w の順序。gl_Vertex の x、y、z、および w から point の x、y、z、および w へのマッピングを決定します。

これをスウィズリングと呼びます。point = gl_Vertexと同等point = gl_Vertex.xyzwです。point = gl_Vertex.yxzwx と y の値が入れ替わった gl_Vertex に相当する点が得られます。

于 2011-10-06T02:28:50.570 に答える