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

13

我一直在使用OpenGL编写程序。最近,我开始学习OpenGL着色器语言。我是新手,请您详细回答以下问题:

  1. GLSL中有哪些不同类型的变量(修饰符)?
  2. 它们用于什么?
  3. 它们之间有何不同?

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


1
感谢大家的回答。从一些在线资源中,我找到了关于两个限定符“in”和“out”的信息,它们也可以用于顶点 - 片段着色器之间的通信。它们与“varying”限定符非常相似。它们是一种单独的限定符“类别”还是只是“varying”限定符的替代品? - Einiosaurus
3个回答

21
在OpenGL 3+中:
  • varying已过时
  • const用于常量!
  • uniform用于每个绘制调用(最多)的值
  • in用于从先前的管道阶段输入,即每个顶点(或片元)的值,如果使用glAttribDivisor和硬件实例化,则为每个原始体,
    注意:已被淘汰
  • out用于输出到下一个阶段

关于片元着色器的输出:在OpenGL3及以上版本中,大多数片元着色器输出的内置变量(例如gl_FragColor,特别是gl_FragDepth),都已经过时,应该替换为用户定义的out变量。

如果您要输出到默认帧缓冲区,则片元着色器中声明的任何输出将出现在颜色缓冲区中。如果您绑定了具有多个颜色缓冲区(即多个渲染目标)的FBO,则需要通过glBindFragDataLocationIndexed手动将每个out变量绑定到正确的颜色缓冲区索引。

有关GLSL('服务器')端和OpenGL('客户端')端的所有详细信息都可以在以下位置找到:

  • OpenGL规范,特别是第248-250页,用于片元着色器的颜色缓冲区输出。
  • GLSL规范,第38页及其后面,用于着色器输出。

太好了,非常感谢!只有一个小问题,片段着色器的下一个阶段是什么?如果您的片段着色器定义了一个“out”变量,那么该变量的值将传递到哪里? - Einiosaurus
修改了我的答案以澄清片段着色器输出问题! - Nicolas Lefebvre
"片段着色器的下一个阶段是什么?" -> 2011年没有,但每个人都期望使用“混合着色器”代替丑陋的glBlendFunc。编辑:引用具有精确页面的规格+1。 - Calvin1602
gl_FragColor从哪个版本开始被弃用了?谢谢 - André Puel

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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接