着色器与OpenGL中较旧的渲染方法相适应的地方在哪里?

着色器与OpenGL中较旧的渲染方法相适应的地方在哪里?,opengl,shader,Opengl,Shader,在许多在线教程之后,我用OpenGL编写了一个级别渲染器。实际上,我使用顶点数组和“范围绘制”命令进行渲染。现在,因为我想用逐像素照明来照亮关卡,我意识到着色器是OpenGL的一个重要组成部分,如果不是OpenGL的主要部分的话 因此,我在这里使用我的“传统”渲染方法,不使用着色器,我想知道着色器如何适应事物的大场景。如果我利用OpenGL的最新功能对其进行返工,那么我的主要渲染功能是否会使用着色器来完成?我可以将渲染保留在代码中,而只使用着色器进行照明吗 我想正确地做到这一点,而不是很快,所以

在许多在线教程之后,我用OpenGL编写了一个级别渲染器。实际上,我使用顶点数组和“范围绘制”命令进行渲染。现在,因为我想用逐像素照明来照亮关卡,我意识到着色器是OpenGL的一个重要组成部分,如果不是OpenGL的主要部分的话

因此,我在这里使用我的“传统”渲染方法,不使用着色器,我想知道着色器如何适应事物的大场景。如果我利用OpenGL的最新功能对其进行返工,那么我的主要渲染功能是否会使用着色器来完成?我可以将渲染保留在代码中,而只使用着色器进行照明吗

我想正确地做到这一点,而不是很快,所以我将继续通过OpenGL Superbible阅读,边读边学


有谁能教我如何适应一切,以及这些旧的在线教程(如Nehe和GameTootorials)是否仍然适用。

使用固定功能OpenGL大致遵循以下步骤:

  • 设置投影矩阵
  • 设置模型视图矩阵
  • 设置照明参数
  • 将纹理绑定到纹理单元
  • 定义纹理环境操作
  • 设置几何体(顶点阵列/顶点缓冲区对象)
  • 发出绘图命令
使用着色器时,前5个步骤有所不同。着色器替换固定的函数管道,该管道由在此处执行的设置控制。首先,您必须提供实现顶点变换和片段生成的着色器。这些着色器将其参数作为所谓的制服

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

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

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

但图形命令保持不变

我的主要渲染功能实际上会使用着色器完成吗


如果您的意思是,如果着色器将执行绘图调用:否!实际上,将一个不使用显示列表、选择模式和即时模式的旧OpenGL-1.1渲染器提升到OpenGL-3核心并不难。(如果涉及显示列表、选择模式和即时模式…

使用固定功能OpenGL大致遵循以下步骤:

  • 设置投影矩阵
  • 设置模型视图矩阵
  • 设置照明参数
  • 将纹理绑定到纹理单元
  • 定义纹理环境操作
  • 设置几何体(顶点阵列/顶点缓冲区对象)
  • 发出绘图命令
使用着色器时,前5个步骤有所不同。着色器替换固定的函数管道,该管道由在此处执行的设置控制。首先,您必须提供实现顶点变换和片段生成的着色器。这些着色器将其参数作为所谓的制服

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

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

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

但图形命令保持不变

我的主要渲染功能实际上会使用着色器完成吗


如果您的意思是,如果着色器将执行绘图调用:否!实际上,将一个不使用显示列表、选择模式和即时模式的旧OpenGL-1.1渲染器提升到OpenGL-3核心并不难。(如果涉及到显示列表、选择模式和即时模式…

在我看来,您的问题在于您并不真正了解着色器是什么或做什么。我建议处理一下这个想法。但是,我还是写了它们,所以请恕我直言。在我看来,你的问题在于你并不真正理解着色器是什么或做什么。我建议处理一下这个想法。但话说回来,我确实写过,所以请恕我直言。