我正在使用一个非常简单的程序,它将一系列点传递到可编程的pipline中以绘制一个立方体。我正在尝试设置它以便我可以每帧更改几何体(基于一些外部输入),因此,对于光照,我需要在更改后重新计算面法线。我在几何着色器中做它作为练习。
我的着色器如下:
顶点:
#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);
}
我正在尝试计算法线(但出于调试原因,我已经取出了代码),当我运行程序时,正常值就吓坏了。 所以我将片段颜色设置为正常值。 (看看它是否确实正常。) 所以无论出于何种原因,“正常”的价值在红色,绿色,白色和黑色之间翻转,我无从谈论。 如果我只是在片段着色器中指定一个颜色矢量,那么立方体就可以在任何地方呈现这种颜色。
为什么正常值会发生变化?
思想?
答案 0 :(得分:4)
normal
的值未定义。
在每次调用EmitVertex
之前,您必须写入几何着色器输出的所有。 GS不像立即模式渲染那样工作。