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

Mak*_*gan 5 c++ opengl shader glsl geometry-shader

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

out vec3 normal; 
Run Code Online (Sandbox Code Playgroud)

由片段着色器接收为:

in vec3 normal; 
Run Code Online (Sandbox Code Playgroud)

但是,如果我向程序添加几何着色器,链接器会告诉我法线尚未声明为前一阶段的输出。但我不确定如何在几何着色器中接收或发送输出。

Rab*_*d76 5

顶点着色器的输出是几何着色器的输入,几何着色器的输出是片段着色器的输入。
几何着色器的输入将是图元顶点计数长度的数组。(请参阅几何着色器 - 输入)。

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

in  vec3 normal[];
out vec3 geo_normal;
Run Code Online (Sandbox Code Playgroud)

将输入传递到输出:

geo_normal = normal[i];
EmitVertex();
Run Code Online (Sandbox Code Playgroud)

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

in vec3 geo_normal;
Run Code Online (Sandbox Code Playgroud)



一种选择是使用布局限定符

几何着色器:

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

out layout(location=1) vec3 geo_normal;  
Run Code Online (Sandbox Code Playgroud)

geo_normal = normal[i];
EmitVertex();
Run Code Online (Sandbox Code Playgroud)

片段着色器:

in layout(location=1) vec3 normal; // link by layout location 1 and not by name 
Run Code Online (Sandbox Code Playgroud)



另一种选择是使用接口块

顶点着色器:

out TData
{
    vec3 normal;
} outData;
Run Code Online (Sandbox Code Playgroud)

outData.normal = .....;
Run Code Online (Sandbox Code Playgroud)

几何着色器:

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

out TData
{
    vec3 normal;
} outData;
Run Code Online (Sandbox Code Playgroud)

outData.normal = inData.normal[i];
EmitVertex();
Run Code Online (Sandbox Code Playgroud)

片段着色器:

in TData
{
    vec3 normal;
} inData;
Run Code Online (Sandbox Code Playgroud)

..... = inData.normal;
Run Code Online (Sandbox Code Playgroud)