GLSL着色器变量类型之间的区别?

时间:2017-01-10 16:49:35

标签: opengl

当看到一些OpenGL示例时,有些人在着色器顶部声明它们时会使用以下类型的变量:

in out

和一些用途:

attribute varying uniform

有什么区别?它们是相互排斥的吗?

2 个答案:

答案 0 :(得分:2)

在现代OpenGL中,您有一系列着色器连接到管道。一个简单的管道将有一个顶点着色器和一个片段着色器。

对于管道中的每个着色器,in是该阶段的输入,out是该阶段的输出。一个阶段的out将与下一阶段的in匹配。

uniform可以在任何着色器中使用,并且对于整个绘制调用将保持不变。

如果你想要一个类比,可以把它想象成一个工厂。 inout是进出机器的传送带。 uniform是您打开机器以改变其工作方式的旋钮。

实施例

顶点着色器:

// Input from the vertex array
in vec3 VertPos;
in vec2 VertUV;

// Output to fragment shader
out vec2 TexCoord;

// Transformation matrix
uniform mat4 ModelViewProjectionMatrix;

片段着色器:

// Input from vertex shader
in vec2 TexCoord;

// Output pixel data
out vec4 Color;

// Texture to use
uniform sampler2D Texture;

较旧的OpenGL

在早期版本的OpenGL(2.1 / GLSL 1.20)中,使用了其他关键字而不是inout

  • attribute用于顶点着色器的输入。

  • varying用于顶点着色器输出和片段着色器输入。

  • 隐式声明片段着色器输出,您可以使用gl_FragColor而不是指定自己的。{/ p>

答案 1 :(得分:2)

attributevarying已从核心OpenGL中的GLSL 1.40及更高版本(桌面GL版本3.1)中删除。 OpenGL ES 2仍然使用它们,但已从ES 3.0代码中删除。

您仍然可以在兼容性配置文件中使用旧构造,但attribute仅映射到顶点着色器in puts。 varying映射到VS out看跌期权和FS in看跌期权。

uniform没有改变;它仍然意味着它总是有:外部世界设置的值在渲染操作期间固定。