是否可以将着色器变量声明为输入和输出?

时间:2018-01-13 21:42:49

标签: opengl glsl

我正在使用顶点着色器和几何着色器。我的顶点着色器只是将其输入转发到几何着色器。

#version 330 core
layout (location = 0) in uint xy;
layout (location = 1) in uint znt;

out uint out_xy;
out uint out_znt;

void main()
{
    out_xy = xy;
    out_znt = znt;
}

是否可以将xyznt声明为输入和输出,这样我就不需要重命名它们了?

2 个答案:

答案 0 :(得分:3)

  

是否可以将着色器变量声明为输入和输出?

没有。变量名称是标识符,2个不同的变量必须具有不同的标识符。


GLSL - The OpenGL Shading Language 4.6; 3.7 Identifiers; page 18

  

标识符用于变量名称,函数名称,结构名称和字段选择器......

     

... 更一般地说,它是一个编译时错误   重新声明变量, ...


但是,当然可以声明具有实例名称的接口块。正如Nicol Bolas的回答所述。在这种情况下,可以通过接口块的实例名称和变量名称来访问变量。

但仍然无法使用没有实例名称的接口块,并且在实例块中重用变量名称。

请参阅GLSL - The OpenGL Shading Language 4.6; 4.3.9 Interface Blocks; page 54

  

如果未使用实例名称(实例名称),则在块内声明的名称将作用于全局级别,并且就像在块外部声明它们一样进行访问。如果使用实例名称(实例名称),则它将所有成员放在其自己的名称空间内的范围内,使用该字段访问   选择器(。)运算符(类似于结构)。

答案 1 :(得分:2)

你不能宣布"他们就是这样,但你可以使用interface blocks,这可以给你基本相同的东西:

//Vertex shader:

layout (location = 0) in uint xy;
layout (location = 1) in uint znt;

out VS
{
   uint xy;
   uint znt;
} to_gs;

void main()
{
    to_gs.xy = xy;
    to_gs.znt = znt;
}

//Geometry shader:

in VS
{
   uint xy;
   uint znt;
} from_vs[];

void main()
{
}

您必须在这些块上使用实例名称,以便GLSL知道您正在谈论的变量。但除此之外,它们的名称相同。这也允许您使用from_vs[X]从几何着色器中的基元中选择X个顶点,而不必将每个单独的输入变量声明为数组。