2013-05-10 52 views
1

我正在处理一个非常简单的程序,它将一个点数组传递给可编程管道以绘制一个立方体。我试图设置它,所以我可以改变每一帧的几何图形(基于某些外部输入),因此,对于照明,我需要在改变后重新计算面部法线。我正在做几何着色器作为练习。当它不应该改变GLSL几何值

我的着色如下:

顶点:

#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 

uniform mat4 MVP; 

void main(){  
    gl_Position = MVP * vec4(vertexPosition_modelspace,1); 
} 

几何:

#version 330 

precision highp float; 

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

out vec3 normal; 

void main(void) 
{ 
    for (int i = 0; i < gl_in.length(); i++) { 
     gl_Position = gl_in[i].gl_Position; 
     EmitVertex(); 
    } 

    EndPrimitive(); 

    normal = vec3(0,0,1); 
} 

片段:

#version 330 

in vec3 normal; 
out vec4 color; 

void main() 
{ 
    color = vec4(normal,1); 
} 

我试图计算法线(但我有pul因为调试的原因导出了这段代码),并且当我运行该程序时正常值出现了。 所以我把片段颜色设置为任何正常值。 (看看它是否确实是正常的。) 因此,无论出于何种原因,“正常”的价值无论在何种原因下都是在红色,绿色,白色和黑色之间翻转。 如果我只是在片段着色器中指定一个颜色矢量,那么该立方体在任何地方都会呈现该颜色。

为什么正常值的变化呢?

想法?

回答

4

normal的值是undefined

你有每个调用EmitVertex之前写几何着色器输出的所有。 GS不像立即模式渲染那样工作。

+1

谢谢你的回答。它解决了我的问题。在我所有关于几何着色器的阅读中,我从来没有看到任何告诉过我的东西。尽管这是我自己的无能。谢谢。 – APalmer 2013-05-10 13:55:45