我正在使用顶点着色器和几何着色器。我的顶点着色器只是将其输入转发到几何着色器。
#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;
}
是否可以将xy
和znt
声明为输入和输出,这样我就不需要重命名它们了?
答案 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
个顶点,而不必将每个单独的输入变量声明为数组。