【问题标题】:OpenGL - Fixed pipeline shader defaults (Mimic fixed pipeline with shaders)OpenGL - 固定管线着色器默认值(使用着色器模拟固定管线)
【发布时间】:2013-09-14 20:36:22
【问题描述】:

谁能给我提供类似于Fixed function Pipeline的shader?

我最需要Fragment shader default,因为我在网上找到了一个类似的vertex shader。但如果你有一双应该没问题!

我想使用固定管线,但具有着色器的灵活性,所以我需要类似的着色器,这样我就可以模仿固定管线的功能。

非常感谢!

我是新来的,所以如果您需要更多信息,请告诉我:D

这是我想要复制的:(纹理单元 0)

  • glTranslatef 的功能
  • glColor4f 的功能
  • glTexCoord2f 的功能
  • glVertex2f 的功能
  • glOrtho 的功能(我知道它使用着色器在幕后做了一些神奇的事情)

就是这样。这就是我想从固定功能管道中复制的所有功能。谁能告诉我一个如何用着色器复制这些东西的例子?

【问题讨论】:

  • 没有默认着色器,尝试仅使用一个着色器来模拟旧的 ffp 是一个非常糟糕的主意。
  • 谁能给我看类似的着色器,我想用两个着色器,frag 和 vert 来模拟它,但我在网上找到了一个相似的 vert。
  • 类似于什么?可以在 FFP GL 中设置大量可能的状态,这将需要着色器中的不同代码路径。考虑使用所有纹理环境模式单独进行纹理处理。 “我想使用固定的管道,但要具有着色器的灵活性”只是不会以任何有用的方式工作。
  • 模拟整个固定功能管道将非常困难,例如,如果您考虑应用每个纹理单元的各种状态。您可以为每个纹理单元设置一个纹理矩阵、一组纹理坐标等。在您能够复制此行为之前,您很可能会用完制服和顶点属性槽,因为需要 16 个纹理图像单元必需 现代 OpenGL 实现 :)
  • 我了解问题所在,我用我想要复制的确切功能集更新了帖子。

标签: opengl shader pipeline fragment-shader vertex-shader


【解决方案1】:

这里有几个问题会使使用着色器实现这一点变得更加困难。

首先,除了使用固定功能特性之外,您还使用即时模式。在过渡到着色器之前,您应该切换到顶点数组。如果您绝对需要以这种方式构建您的软件,您可以编写一个类,该类接受位于 glBegin (...)glEnd (...) 之间的类似即时模式的命令,并将它们推送到顶点数组中。

至于glTranslatef (...)glOrtho (...),它们并没有什么特别之处。他们创建平移矩阵和正交投影矩阵,并将“当前”矩阵乘以这个矩阵。目前尚不清楚您使用的是什么语言,但这些函数的一种可能替代方法是使用像 glm (C++) 这样的库。

最大的障碍将是摆脱固定功能管道思维带来的“当前”状态心态。使用着色器,您几乎可以完全控制每个状态,并且您不必使用乘以“当前”矩阵或设置“当前”颜色的函数。您可以简单地将所需的确切矩阵或颜色值传递给着色器。这是解决这些问题的一种更好的方法,这就是为什么我真的认为您应该完全放弃固定功能方法而不是试图模仿它。

这就是为什么您希望“使用固定功能管道但拥有着色器的灵活性”从根本上说是没有意义的。

话虽如此,在 OpenGL 兼容模式下,GLSL 中有一些保留字指代许多固定功能结构。其中包括 gl_MultiTexCoord<N>gl_ModelViewProjectionMatrix 等。它们可以用作过渡性辅助工具,但从长远来看确实不应该依赖。

【讨论】:

    【解决方案2】:

    还有这个问题:OpenGL Fixed function shader implementation 他们指向一些网络资源。


    OpenGL ES 2 book 在第 8 章(顶点着色器)和第 10 章(片段着色器)中包含 OpenGL ES 1.1 固定函数管道的实现。

    不幸的是,这些着色器似乎没有包含在本书的示例代码中。另一方面,看书和敲代码当然是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多