OpenGL着色语言不同类型的变量(限定符)

时间:2011-06-01 03:38:25

标签: opengl glsl shader fragment-shader vertex

我一直在用OpenGL编写程序。最近,我开始学习OpenGL着色语言。我是新手;所以请在答案中详细说明。

我的问题是:

  1. GLSL中有哪些不同类型的变量(限定符)?
  2. 它们用于什么?
  3. 他们彼此有什么不同?
  4. 我只熟悉从“顶点着色器”传递到片段着色器以在顶点之间进行插值的“变化”变量。除此之外,我什么都不知道。

3 个答案:

答案 0 :(得分:21)

在OpenGL 3+中:

  • varying已弃用
  • const用于......好吧,常量!
  • uniform适用于每次调用(最多)值
  • in用于来自前一个流水线阶段的输入,即每个原语的每个顶点(或每个片段)值,如果使用glAttribDivisor和硬件实例
  • out用于输出到下一阶段

关于片段着色器的输出:在OpenGL3及更高版本中,片段着色器输出的大多数内置变量(例如gl_FragColor,但有gl_FragDepth的明显例外)已弃用,应该是替换为用户定义的out变量。

如果要输出到默认的帧缓冲区,则无论您声明为片段着色器的输出,都会在颜色缓冲区中结束。如果您使用多个颜色缓冲区(即多个渲染目标)绑定了一个FBO,则需要通过out手动将每个glBindFragDataLocationIndexed变量绑定到正确的颜色缓冲区索引。

您可以找到关于GLSL('服务器')和OpenGL('客户')方面的所有详细信息:

答案 1 :(得分:3)

  • Uniform:每次绘制调用的常量数据,通常用于参数化着色器。
  • 变化:在VS和FS之间传输数据,沿着过程中的原语进行插值。
  • 属性:这是顶点属性数据,是顶点着色器的输入。它是为基元中的每个顶点指定的。

答案 2 :(得分:2)

查看教程:http://www.lighthouse3d.com/tutorials/glsl-tutorial/

有统一变量(所有线程都是静态的)

属性变量(每个顶点注入)

变化(如你所知)