着色器适用于OpenGL中较旧的渲染方法?

时间:2011-10-04 21:53:04

标签: opengl shader

我在OpenGL中编写了一个关于水平渲染器的许多在线教程。我实际上使用顶点数组和范围绘制命令进行渲染。现在因为我希望每个像素点亮照明水平,我认为如果不是OpenGL的主要部分,那么着色器是一个很大的部分。

所以在这里,我采用的是“传统”渲染方法,不使用着色器,我想知道着色器如何适应事物的宏观。如果我重新使用着色器以利用OpenGL的最新功能,我的主渲染功能是否真的可以使用着色器完成?我可以将渲染留在代码中,只使用着色器进行照明吗?

我想要正确地做到这一点,而不是快速,所以我将继续阅读OpenGL Superbible并随时学习。

任何人都可以告诉我一切如何适合,以及这些旧的教程如Nehe和gametutorials实际上是否仍适用。

1 个答案:

答案 0 :(得分:1)

使用固定功能OpenGL粗略地遵循以下步骤:

  • 设置投影矩阵
  • 设置模型视图矩阵
  • 设置灯光参数
  • 将纹理绑定到纹理单元
  • 定义纹理环境操作
  • 设置几何体(顶点阵列/顶点缓冲区对象)
  • 问题绘制命令

使用着色器时,前5个步骤有所不同。着色器替换固定功能管道,该管道由在那里完成的设置控制。首先,你必须提供实现顶点转换和片段生成的着色器。这些着色器将其参数称为所谓的 Uniforms

你仍然使用矩阵,只是这次你通过制服而不是矩阵堆栈将它们传递给OpenGL(在OpengGL-2和OpenGL-3兼容性配置文件中,矩阵堆栈仍在那里,矩阵放入内置制服)。 / p>

纹理仍然绑定到纹理单元。使用采样器制服纹理单元传递到片段生成。整个纹理环境已被片段着色器取代。坦率地说:设置片段着色器要比摆弄一些对glTexEnvi的调用容易得多。

通过着色器进行照明,因此您将照明参数作为制服传递并在着色器中进行计算。

绘图命令虽然保持不变。

  

我的主渲染功能是否实际上是用着色器完成的

如果你的意思是,如果着色器会进行绘图调用:不!实际上,将不使用显示列表,选择模式和立即模式的旧OpenGL-1.1渲染器提升到OpenGL-3核心并不是那么困难。 (如果涉及显示列表,选择模式和立即模式......)