2011-06-01 68 views
12

我一直在使用OpenGL编写程序。最近,我开始学习OpenGL着色语言。我是新手;所以请在你的答案中详细说明。OpenGL着色语言不同类型的变量(限定符)

我的问题是:

  1. 什么是不同类型的变量(预选赛)在GLSL?
  2. 它们用于什么?
  3. 它们有什么不同?

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

+1

谢谢大家的回答。从一些在线资源中,我找到了关于两个限定符“in”和“out”的信息,它们也可以用于顶点 - 片段着色器通信。它们与“不同”限定符非常相似。他们是一个单独的“限定词”级别还是仅仅是“不同”限定词的替代? – Einiosaurus 2011-06-01 05:09:33

回答

21

在OpenGL中3+:

  • varying已被弃用
  • const是......嗯,常量!
  • uniform为每绘图调用(至多)如果使用glAttribDivisor和硬件instanciation
  • in是用于从前面的流水线级,至多即每个顶点(或每片段)值的输入,每原始out是用于输出到下一阶段

关于用于片段着色器输出:在OpenGL3和向上,大多数内置的片段着色器输出(如gl_FragColor,具有gl_FragDepth显着的例外)变量被弃用的并应予以更换用户定义的out变量。

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

所有你所能想约两个GLSL(“服务器”)端和OpenGL的细节(“客户”)侧,可以发现:

+0

太好了,非常感谢!只有一个小问题,片段着色器的下一个阶段是什么?如果你的片段着色器定义了一个“out”变量,那个变量的值被传递给哪个变量? – Einiosaurus 2011-06-01 08:33:55

+0

编辑我的答案,以澄清片段着色器输出的问题! – 2011-06-01 09:10:36

+0

“片段着色器的下一个阶段是什么?” - > 2011年没有,但每个人都期待“混合着色器”而不是丑陋的glBlendFunc。编辑:+1用精确页面引用规格。 – Calvin1602 2011-06-01 19:08:18

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