c++ - 如果有一个几何着色器处于事件状态,如何将信息从顶点着色器传递到片段着色器?

标签 c++ opengl glsl shader geometry-shader

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

out vec3 normal; 

由片段着色器接收为:

in vec3 normal; 

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

最佳答案

顶点着色器的输出是几何着色器的输入,几何着色器的输出是片段着色器的输入。
几何着色器的输入将是图元顶点数长度的数组。 (参见 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;

关于c++ - 如果有一个几何着色器处于事件状态,如何将信息从顶点着色器传递到片段着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585794/

相关文章:

c++ - Opengl Precision Conversion Error 编译错误E0415

c++ - OpenGL:将 FBO 的深度纹理绑定(bind)到计算着色器

algorithm - 使用 GLSL 组成图 block 的纹理坐标

c++ - 将 double * 转换为 complex*

c++ - C++ NaN 和 Armadillo NaN 之间有什么区别?

c++ - C++11 程序可以使用 BlueZ 吗?

c++ - 头文件中函数原型(prototype)的语法

c++ - 现代 opengl 纹理金字塔

opengl - 如何提取OpenGL多边形光栅化?

iphone - GLSL ES 1.1 中卷积的高效邻域纹理访问