我最近接手了一个项目,几个月前,一个团队成员退出了一个停滞不前的项目。在试图让自己加速时,我遇到了这个顶点着色器,我很难理解它的作用:
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;
我似乎无法找到解释这一点的文档。
有人可以快速解释这个着色器在做什么吗?
答案 0 :(得分:3)
我似乎无法找到解释这一点的文档。
GLSL specification非常清楚swizzle selection如何运作。
着色器基本上做的是从vec4
中挑选两个轴的钝方法。请注意,选择后会覆盖point
的Z和W.根据所有权利,它可以改写为:
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);
所以它只是从输入顶点选择两个坐标。为什么它需要这样做,我不能说。
答案 1 :(得分:2)
之后的x,y,z和w的顺序。确定从gl_Vertex的x,y,z和w到点的x,y,z和w的映射。
这叫做混合。 point = gl_Vertex
相当于point = gl_Vertex.xyzw
。 point = gl_Vertex.yxzw
导致一个等于gl_Vertex的点,其中交换了x和y值。