当看到一些OpenGL示例时,有些人在着色器顶部声明它们时会使用以下类型的变量:
in
out
和一些用途:
attribute
varying
uniform
有什么区别?它们是相互排斥的吗?
答案 0 :(得分:2)
在现代OpenGL中,您有一系列着色器连接到管道。一个简单的管道将有一个顶点着色器和一个片段着色器。
对于管道中的每个着色器,in
是该阶段的输入,out
是该阶段的输出。一个阶段的out
将与下一阶段的in
匹配。
uniform
可以在任何着色器中使用,并且对于整个绘制调用将保持不变。
如果你想要一个类比,可以把它想象成一个工厂。 in
和out
是进出机器的传送带。 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(2.1 / GLSL 1.20)中,使用了其他关键字而不是in
和out
:
attribute
用于顶点着色器的输入。
varying
用于顶点着色器输出和片段着色器输入。
隐式声明片段着色器输出,您可以使用gl_FragColor
而不是指定自己的。{/ p>
答案 1 :(得分:2)
attribute
和varying
已从核心OpenGL中的GLSL 1.40及更高版本(桌面GL版本3.1)中删除。 OpenGL ES 2仍然使用它们,但已从ES 3.0代码中删除。
您仍然可以在兼容性配置文件中使用旧构造,但attribute
仅映射到顶点着色器in
puts。 varying
映射到VS out
看跌期权和FS in
看跌期权。
uniform
没有改变;它仍然意味着它总是有:外部世界设置的值在渲染操作期间固定。