我在OpenGL中编写了一个关于水平渲染器的许多在线教程。我实际上使用顶点数组和范围绘制命令进行渲染。现在因为我希望每个像素点亮照明水平,我认为如果不是OpenGL的主要部分,那么着色器是一个很大的部分。
所以在这里,我采用的是“传统”渲染方法,不使用着色器,我想知道着色器如何适应事物的宏观。如果我重新使用着色器以利用OpenGL的最新功能,我的主渲染功能是否真的可以使用着色器完成?我可以将渲染留在代码中,只使用着色器进行照明吗?
我想要正确地做到这一点,而不是快速,所以我将继续阅读OpenGL Superbible并随时学习。
任何人都可以告诉我一切如何适合,以及这些旧的教程如Nehe和gametutorials实际上是否仍适用。
答案 0 :(得分:1)
使用固定功能OpenGL粗略地遵循以下步骤:
使用着色器时,前5个步骤有所不同。着色器替换固定功能管道,该管道由在那里完成的设置控制。首先,你必须提供实现顶点转换和片段生成的着色器。这些着色器将其参数称为所谓的 Uniforms 。
你仍然使用矩阵,只是这次你通过制服而不是矩阵堆栈将它们传递给OpenGL(在OpengGL-2和OpenGL-3兼容性配置文件中,矩阵堆栈仍在那里,矩阵放入内置制服)。 / p>
纹理仍然绑定到纹理单元。使用采样器制服纹理单元传递到片段生成。整个纹理环境已被片段着色器取代。坦率地说:设置片段着色器要比摆弄一些对glTexEnvi的调用容易得多。
通过着色器进行照明,因此您将照明参数作为制服传递并在着色器中进行计算。
绘图命令虽然保持不变。
我的主渲染功能是否实际上是用着色器完成的
如果你的意思是,如果着色器会进行绘图调用:不!实际上,将不使用显示列表,选择模式和立即模式的旧OpenGL-1.1渲染器提升到OpenGL-3核心并不是那么困难。 (如果涉及显示列表,选择模式和立即模式......)