【问题标题】:OpenGL Shading Language Different Types of Variable (Qualifiers)OpenGL着色语言不同类型的变量(限定符)
【发布时间】:2016-05-26 00:10:24
【问题描述】:

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

我的问题是:

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

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

【问题讨论】:

  • 谢谢大家的回答。从一些在线资源中,我找到了关于“in”和“out”两个限定符的信息,它们也可以用于 Vertex - Fragment Shaders 通信。它们与“可变”限定词非常相似。它们是单独的“类”限定词还是只是“变化”限定词的替代品?

标签: opengl glsl shader fragment-shader vertex


【解决方案1】:

在 OpenGL 3+ 中:

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

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

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

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

【讨论】:

  • 太好了,非常感谢!只是一个小问题,片段着色器的下一阶段是什么?如果您的 Fragment Shader 定义了一个“out”变量,那么该变量的值将传递到哪里?
  • 编辑了我的答案以澄清片段着色器输出的问题!
  • "片段着色器的下一个阶段是什么?" -> 2011 年没有,但每个人都期待“混合着色器”而不是丑陋的 glBlendFunc。编辑:+1 用于引用具有确切页面的规范。
  • 从哪个版本开始不推荐使用 gl_FragColor?谢谢
【解决方案2】:
  • Uniform:每次绘制调用的恒定数据,通常用于参数化着色器。
  • 变化:在 VS 和 FS 之间传输数据,在过程中沿图元进行插值。
  • 属性:这是顶点属性数据,顶点着色器的输入。它是为图元中的每个顶点指定的。

【讨论】:

    【解决方案3】:

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

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

    属性变量(按顶点注入)

    变化(如你所知)

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多