13

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

我的问题是:

  1. GLSL 中有哪些不同类型的变量(限定符)?
  2. 它们是用来做什么的?
  3. 它们彼此有何不同?

我只熟悉从顶点着色器传递到片段着色器以在顶点之间插值的“变化”变量。除此之外,我什么都不知道。

4

3 回答 3

21

在 OpenGL 3+ 中:

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

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

如果您要输出到默认帧缓冲区,那么您声明为片段着色器输出的任何内容都会在颜色缓冲区中结束。如果您已将 FBO 与多个颜色缓冲区(即多个渲染目标)绑定,则需要手动将每个out变量绑定到正确的颜色缓冲区索引glBindFragDataLocationIndexed

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

  • OpenGL 规范中,特别是第 248-250 页,用于片段着色器上的颜色缓冲区输出。
  • GLSL 规范中,第 38 页和上用于着色器输出。
于 2011-06-01T07:37:21.207 回答
2
  • Uniform:每次绘制调用的常量数据,通常用于参数化着色器。
  • 变化:在 VS 和 FS 之间传输数据,在过程中沿图元进行插值。
  • Attribute:这是顶点属性数据,Vertex Shader的输入。它是为图元中的每个顶点指定的。
于 2011-06-01T03:56:29.443 回答
1

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

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

属性变量(按顶点注入)

变化的(如你所知)

于 2011-06-01T03:43:31.727 回答