C ++, OpenGL — геометрический шейдер

Я застрял с геометрическими шейдерами в программировании на OpenGL — c ++. Я хочу создать простой куб, повторяя 6 раз, рисуя одну повернутую стену. Вот мой вершинный шейдер (у каждого в преамбуле ядро ​​#version 330):

uniform mat4 MVP;
uniform mat4 ROT;
layout(location=0) in vec3 vertPos;
void main(){
vec4 pos=(MVP*ROT*vec4(vertPos,1));
pos.x/=1.5;
pos.y/=1.5;
gl_Position=pos;
}

Теперь геометрия шейдера:

layout (triangles) in;
layout (triangle_strip, max_vertices = 6) out;
out vec4 pos;
void main(void)
{
pos=vec4(1,1,1,1);
for (int i = 0; i < 3; i++)
{
vec4 offset=vec4(i/2.,0,0,0);
gl_Position = gl_in[i].gl_Position+offset;
EmitVertex();
}
EndPrimitive();
}

А теперь фрагмент шейдера:

uniform mat4 MVP;
in vec4 pos;
out vec3 color;
void main(){
vec3 light=(MVP*vec4(0,0,0,1)).xyz;
vec3 dd=pos.xyz-light;
float cosTheta=length(dd)*length(dd);
color=vec3(1,0,0);
}

Ну, есть мусор, я хотел также добавить заливку в мой куб, но у меня проблема с отправкой координат. Основная проблема в том, что здесь я получаю свой масштабированный квадрат (по матрице MVP), я даже могу повернуть его с помощью базового интерфейса (матрицы ROT), но когда я раскомментирую свою строку «+ смещение», я получаю некоторый беспорядок. Что я должен сделать, чтобы сделать чистые 6-кратные повторения?

0

Решение

Похоже, ошибка здесь, в вашем геометрическом шейдере.

gl_Position = gl_in[i].gl_Position+offset;

Это добавляет смещение … но добавляет смещение в пространстве клипа, что, вероятно, не то, что вы хотите. Добавьте смещение в ваш вершинный шейдер или сделайте перспективную проекцию в вашем геометрическом шейдере.

/* Passthrough vertex shader */
layout(location=0) in vec3 vertPos;
void main(){
gl_Position = vec4(vertPos, 1.0);
}

/* Geometry shader */
...
gl_Position = MVP * (ROT * (gl_in[i].gl_Position + offset));
EmitVertex();
...

Также я заметил нечто необычное в вашем вершинном шейдере.

pos.x/=1.5;
pos.y/=1.5;

Это необычно, потому что это линейное преобразование, которое следует непосредственно за умножением матрицы. Вероятно, было бы более простым умножить вашу матрицу MVP на следующую матрицу:

1/1.5     0     0     0
0 1/1.5     0     0
0     0     1     0
0     0     0     1

Это дало бы тот же результат с меньшим количеством шейдерного кода.

2

Другие решения


По вопросам рекламы [email protected]