2015-01-08 2 views
0

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

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-кратное повторение?

+1

ничего личного, но ПОЖАЛУЙСТА, НЕЗАВИСИМО ОТ ВАШЕГО КОДА – MightyPork

+0

Lol, даже мои друзья так говорят. У меня есть специальный скрипт, чтобы УДАЛИТЬ все отступы в моем коде, мне нравится его. –

+1

На самом деле? Это все * но * чисто! – MightyPork

ответ

2

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

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 

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

+0

На данный момент я дам вам разрешенный знак, но я должен проверить этот код. Спасибо! –

+0

Ehm, я думаю, это только совет, как сделать мой код более простым, но я все еще жду окончательного душа;) –

+0

Кроме того, я обнаружил, что изменение размера моего вектора можно сделать просто в вершинном шейдере, набрав gl_Position = vec4 (vertPos, 1.5); –

Смежные вопросы