2016-07-09 3 views
-2

Это геометрический шейдер, который я сделал, который из моего понимания должен просто передать 3 вершины на фрагмент-шейдер? Когда я удаляю geom shader и передаю значения прямо в frag shader, он работает и отображает то, что я хочу. Я рисую местности с треугольниками, каждый вызов отрисовки проходит 6 вершин (2 треугольники) через, возможно, это что-то делать с ним, однако я не могу понять, что такоеГеометрия проходит через шейдер, не отображая ничего, однако просто использование шейдера frag и vert отображает то, что я рисую

#version 330 

layout(triangles) in; 
layout(triangle_strip, max_vertices = 3)out; 


in float gHeight; 
in vec4 gSurfacePosition; 
in float gTerrainHeight; 
in vec2 gTexCoords[3]; 
in vec4 gNormal[3]; 


out float oTerrainHeight; 
out float oHeight; 
out vec4 oNormal; 
out vec4 oSurfacePosition; 
out vec2 oTexCoords; 


void main() 
{ 

    oSurfacePosition=gSurfacePosition; 
    oHeight=gHeight; 
    oTerrainHeight=gTerrainHeight; 

    for(int i = 0; i < 3; i++) 
    { 
     gl_Position = gl_in[i].gl_Position; 

     oNormal = gNormal[i]; 
     oTexCoords = gTexCoords[i]; 

     EmitVertex(); 

    } 
} 
+0

Вы проверили ошибки компиляции? Потому что я уверен, что GS не может скомпилировать. И это, конечно, ничего не может сделать. –

+0

Да, он не предназначен для ВСЕХ, это просто проход, да, он компилируется. – galaban

ответ

1
in float gHeight; 
in vec4 gSurfacePosition; 
in float gTerrainHeight; 

Это должно не компилировать. Либо вы не правильно проверяли ошибки, либо ваша реализация на самом деле слаба на сообщения об ошибках.

Причина этого не должна компилироваться, потому что все GS inputs must be arrayed. Вы получаете одно входное значение за вершину в примитиве. Ваш GS принимает triangles в качестве входных данных, и поэтому он получает каждое входное значение как массив из 3 значений. Вы сделали это для некоторых входов, но вы не сделали этого для всех из них.

oSurfacePosition=gSurfacePosition; 
oHeight=gHeight; 
oTerrainHeight=gTerrainHeight; 

Это не делает то, что вы думаете. Каждый раз, когда вы звоните EmitVertex, value of all out variables becomes undefined. Поэтому каждый раз, когда вы хотите исправить новую вершину, вы должны указать и снова установить out. Даже если вы хотите написать одно и то же значение, вы должны установить его каждый раз.

+0

Ничего себе после прочтения этого через я понял, насколько глупым это было от меня, спасибо за исправление этого. Только что начали использовать GS сегодня, спасибо +1 – galaban