2011-10-04 65 views
1

我已经在OpenGL中编写了许多在线教程中的级别渲染器。我实际上使用顶点数组和范围绘制命令进行渲染。现在因为我想让每个像素点亮的点亮,所以我认识到着色器是一个很大的部分,如果不是这个时候OpenGL的主要部分。着色器在OpenGL中适合使用旧的渲染方法吗?

所以,我在这里用我的“传统”方法渲染无着色器,我想知道着色器如何适应事物的宏伟情况。如果我重新使用OpenGL的最新功能,我的主渲染函数是否会用着色器完成?我可以将代码保留在代码中,只需使用着色器进行照明?

我想正确地做到这一点,但速度并不快,所以我将继续阅读OpenGL Superbible并学习。

任何人都可以教我如何适应一切,如果这些像Nehe和gametutorials在线这些旧的教程实际上仍然适用。

+2

在我看来,你的问题是,你真的不明白着色器是什么或做什么。我会建议[阅读这些教程](http://www.arcsynthesis.org/gltut/)来理解这个想法。但是,我再一次写下了它们,所以拿一点盐来吧。 –

回答

1

使用的固定功能的OpenGL粗如下这些步骤:

  • 设置投影矩阵
  • 设置模型视图矩阵
  • 设置照明参数
  • 绑定纹理纹理单元
  • 定义纹理环境操作
  • 设置几何形状(顶点数组/顶点缓存对象)
  • 发行绘制命令

它是第5层的步骤,不同的,使用着色器时。着色器替换固定功能管道,由此处的设置进行控制。首先,formost必须提供实现顶点转换和片段生成的着色器。那些着色器将其参数称为制服

您仍然在使用矩阵,只有在这次通过制服而不是矩阵堆栈(在OpengGL-2和OpenGL-3兼容性配置文件中矩阵堆栈仍然存在并且矩阵放入内置制服)将它们交付给OpenGL时。

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

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

虽然绘图命令保持不变。

请问我的主要绘制函数实际上着色器

如果你的意思做,如果着色器将进行绘制来电:不!实际上,将不使用显示列表,选择模式和立即模式的旧版OpenGL-1.1渲染器提升到OpenGL-3内核并不难。 (如果显示列表,选择模式和立即模式参与,虽然...)