如果有几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

时间:2018-03-31 08:24:17

标签: c++ opengl glsl shader geometry-shader

在添加几何着色器之前,我在顶点着色器中声明了一个变量:

out vec3 normal; 

片段着色器收到:

in vec3 normal; 

但是,如果我向程序添加几何着色器,链接器会告诉我,normal还没有被声明为来自prvious stage的输出。但我不知道如何在几何着色器中接收或发送输出。

1 个答案:

答案 0 :(得分:1)

verrtex着色器的输出ar输入到几何着色器,geoemtry着色器的输出是片段着色器的输入。
几何着色器的输入将是基元顶点计数长度的数组。 (见Geometry Shader - Inputs)。

这意味着您必须在几何着色器中声明输入数组和输出:

in  vec3 normal[];
out vec3 geo_normal;

将输入传递给输出:

geo_normal = normal[i];
EmitVertex();

在片段着色器中声明输入:

in vec3 geo_normal;


<小时/> 一个选项是使用Layout Qualifiers

几何着色器:

in vec3 normal[]; // <---- array

out layout(location=1) vec3 geo_normal;  

geo_normal = normal[i];
EmitVertex();

片段着色器:

in layout(location=1) vec3 normal; // link by layout location 1 and not by name 


<小时/> 另一种选择是使用Interface Blocks

顶点着色器:

out TData
{
    vec3 normal;
} outData;

outData.normal = .....;

几何着色器:

in TData
{
    vec3 normal;
} inData[]; // <---- array

out TData
{
    vec3 normal;
} outData;

outData.normal = inData.normal[i];
EmitVertex();

片段着色器:

in TData
{
    vec3 normal;
} inData;

..... = inData.normal;