OpenGL - 固定管线着色器默认值(使用着色器模拟固定管线)

5

有人能提供类似于固定管线的着色器吗?

我最需要的是片元着色器,因为我在网上找到了一个类似的顶点着色器。但如果你有一对,那也可以!

我想使用固定管线,但又需要着色器的灵活性,所以我需要类似的着色器,以便能够模仿固定管线的功能。

非常感谢!

我是新手,如果需要更多信息,请告诉我:D

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

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

就这些。这就是我想要复制固定管线的所有功能。有人能向我展示如何使用着色器复制这些功能的示例吗?


没有默认着色器,试图用一个着色器模拟旧的固定管线是非常糟糕的想法。 - derhass
有人可以向我展示类似的着色器吗?我想用两个着色器(frag和vert)来模拟它,但我在网上找到了一个类似的vert。 - John smith3
1
类似于什么?在FFP GL中,可以设置大量可能的状态,这将需要在着色器中使用不同的代码路径。想想仅仅纹理环境模式就有多少种。“我想使用固定管线,但又想要着色器的灵活性”根本没有任何有用的方式。 - derhass
模拟整个固定功能管线将会非常困难,如果考虑每个纹理单元应用的各种状态。例如,您可以为每个纹理单元设置一个纹理矩阵、一组纹理坐标等。在现代OpenGL实现中需要16个纹理图像单元,您很可能会在能够复制此行为之前用尽uniform和顶点属性插槽。 :) - Andon M. Coleman
1
我理解这个问题了,我更新了帖子并列出了我想要复制的确切函数集。 - John smith3
2个回答

5
你在这里遇到了一些问题,这些问题会使使用着色器实现更加困难。
首先,除了使用固定功能外,您还在使用即时模式。在您可以转换为使用着色器之前,应切换到顶点数组。如果您绝对需要以这种方式结构化软件,可以编写一个类,该类接受类似于glBegin(...)glEnd(...)之间的即时模式命令,并将它们推入顶点数组中。
至于glTranslatef(...)glOrtho(...),它们并没有什么特别之处。它们创建平移矩阵和正交投影矩阵,并将“当前”矩阵与此相乘。不清楚您使用的是哪种语言,但是替换这些函数的一个可能的选择可能来自使用像glm(C ++)这样的库。
最大的障碍将是摆脱固定功能流水线思维带来的“当前”状态心态。使用着色器时,您可以完全控制几乎每个状态,而且不必使用乘以“当前”矩阵或设置“当前”颜色的功能。您只需将所需的确切矩阵或颜色值传递给着色器即可。这是一种更好的方法来处理这些问题,这就是为什么我真诚地认为您应该完全放弃固定功能方法而不是试图模拟它。
这就是为什么您想“使用固定功能流水线但具有着色器的灵活性”实际上很少有意义。
话虽如此,在OpenGL兼容模式下,GLSL中有保留字,这些保留字指的是许多固定功能结构。它们包括gl_MultiTexCoord<N>gl_ModelViewProjectionMatrix等内容。它们可以用作过渡性辅助工具,但长期来看不应依赖于它们。

2

请参考这个问题: OpenGL固定功能着色器实现,其中他们指向了一些网络资源。


OpenGL ES 2书籍的第8章(顶点着色器)和第10章(片段着色器)包含了OpenGL ES 1.1固定功能管线的实现。

不幸的是,这些着色器似乎没有包含在书中的示例代码中。另一方面,阅读该书并输入代码肯定是值得的。


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