Opengl GLSL着色器变量类型之间的差异?

Opengl GLSL着色器变量类型之间的差异?,opengl,Opengl,当看到一些OpenGL示例时,有些示例在着色器顶部声明变量时使用以下类型的变量: in out 还有一些用途: 属性 变化 uniform 有什么区别?它们相互排斥吗?在现代OpenGL中,有一系列着色器连接到管道。简单管道将具有顶点着色器和片段着色器 对于管道中的每个着色器,in是该阶段的输入,out是该阶段的输出。一个阶段的out将与下一阶段的in匹配 uniform可以在任何着色器中使用,并在整个绘制调用中保持不变 如果你想打个比方,可以把它想象成一个工厂。in和out是进出机器的传送带。

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

in
out

还有一些用途:

属性
变化
uniform


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

在现代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 在较旧版本的OpenGL(2.1/GLSL 1.20)中,使用了其他关键字代替
In
out

  • 属性
    用于顶点着色器的输入

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

  • 片段着色器输出是隐式声明的,您可以使用
    gl\u FragColor
    而不是指定自己的


  • 属性
    变化
    已从核心OpenGL中的GLSL 1.40及以上版本(桌面GL版本3.1)中删除。OpenGL ES 2仍然使用它们,但已从ES 3.0代码中删除

    您仍然可以在兼容性配置文件中使用旧的构造,但是
    属性
    仅映射到
    中的顶点着色器
    <代码>可变
    映射到VS
    out
    put和FS
    in
    put


    统一
    没有改变;它仍然意味着它一直拥有的东西:外部世界设置的值,在渲染操作期间是固定的。

    已经回答了。那么“pass”变量呢?Tulon链接的旧stackoverflow页面中也缺少这些内容。只有顶点着色器可以将它们传递给像素着色器,反之亦然?你说的“传递”是什么意思?顶点着色器中的
    out
    变量与片段着色器中的
    in
    变量相匹配,这就是您所说的吗?啊,对不起,现在我仔细检查了源代码,这些是正常的in/out参数,只是名称有一个“pass\ux”前缀。