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

Opengl 是否可以将着色器变量声明为输入和输出?,opengl,glsl,shader,Opengl,Glsl,Shader,我同时使用顶点着色器和几何体着色器。我的顶点着色器只将其输入转发到几何体着色器 #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同时声明为输入和输出,这样我就不需要重命名它

我同时使用顶点着色器和几何体着色器。我的顶点着色器只将其输入转发到几何体着色器

#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
同时声明为输入和输出,这样我就不需要重命名它们了

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

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


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

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


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

但是仍然不可能使用没有实例名的接口块,也不可能在实例块内重用变量名

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

你不能用这种方式“声明”它们,但你可以使用,这可以给你本质上相同的东西:

//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
th顶点,而不必将每个单独的输入变量声明为数组。

简单回答:否。变量名称是标识符,两个不同的变量必须具有不同的标识符。