1

我正在使用一个非常简单的程序,它将一组点传递到可编程管道中以绘制一个立方体。我正在尝试对其进行设置,以便我可以每帧更改几何图形(基于一些外部输入),因此,对于照明,我需要在更改面部法线后重新计算它们。我在几何着色器中做它作为练习。

我的着色器如下:

顶点:

#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);
}

我试图计算法线(但出于调试原因,我已经提取了该代码)并且当我运行程序时,正常值被吓坏了。所以我将片段颜色设置为正常值。(看看它是否确实是正常的。)所以无论出于何种原因,“正常”的值在红色、绿色、白色和黑色之间翻转,我无法分辨。如果我只是在片段着色器中指定一个颜色向量,那么立方体在任何地方都可以使用该颜色进行渲染。

为什么正常值会发生变化?

想法?

4

1 回答 1

4

的值normal未定义的。

您必须在每次调用之前写入所有几何着色器输出。GS 不像即时模式渲染那样工作。EmitVertex

于 2013-05-10T02:31:48.913 回答