Что делает этот вершинный шейдер? - PullRequest
1 голос
/ 06 октября 2011

Я недавно взял на себя проект, который оставил стагнацию члена команды, уволенного несколько месяцев назад.Пытаясь набрать скорость, я наткнулся на этот вершинный шейдер, и мне трудно понять, что он делает:

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;

Я не могу найти документацию, которая объясняет это.

Может кто-нибудь дать быстрое объяснение того, что делает этот шейдер?

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Я не могу найти документацию, объясняющую это.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * *.

То, что в основном делает шейдер, это тупой способ выбора двух осей из 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 голосов
/ 06 октября 2011

Порядок x, y, z и w после.определяет отображение из x, y, z и w gl_Vertex в x, y, z и w точки.

Это называется swizzling.point = gl_Vertex эквивалентно point = gl_Vertex.xyzw.point = gl_Vertex.yxzw приводит к точке, эквивалентной gl_Vertex с заменой значений x и y.

...