我有一个大型计划。我需要以这样的方式更改它,以便它使用OpenGL的非弃用功能。我已经能够在单独的程序上渲染圆柱体,球体等,但是当我尝试在大程序中合并圆柱体的代码时,我看不到预期的结果。我一直假设以下代码分别启用和禁用可编程管道:
glUseProgram(Program);
和
glUseProgram(0);
由于程序非常大,固定功能管道也是并行的。我相信固定功能管道正在干扰我的可编程管道。我相信这是因为,正如我已经提到的,我可以单独渲染一个圆柱体,但是,当我试图在大型程序中获取该代码时,我没有看到预期的结果。
我该怎么办?
答案 0 :(得分:0)
我在这里找到了很好的解释: http://www.jeffwofford.com/?p=635 在这里:https://www.opengl.org/discussion_boards/showthread.php/184409-Migration-from-Fixed-pipeline-to-Programmable-pipeline
第二个链接对mhagain的评论对我有所帮助。我在下面引用他:
好的,这里有两个步骤,我建议它会很多 如果你一次拿一个而不是试图做,你会更容易 两者同时进行。
第一步是从立即模式转移到缓冲对象。 第二步是从固定顶点和片段处理移动到 着色器。
我建议你先迈出第二步,然后再说明原因 有一个已经到位的着色器基础设施可以做一些 您将从立即模式转变的决定 缓冲对象更容易。
这并不像表面上看起来那么令人生畏。你可以,为 例如,端口到大致GL 2.1等效只是转换你的 顶点变换和光照,以及你的片段处理(即 glTexEnv调用)执行相同操作的着色器。一个现实的 这个阶段的目标是拥有一个功能相同的程序 不再使用端口末端的固定管道。试 在这个阶段增加额外的功能,IMO,为时过早。
执行此操作时,您应该可以禁用所有场景 绘图,然后一步一步地将它带回来。我做了几个 以前类似的端口,我通常更喜欢从2D GUI开始 代码作为绘图相对简单,只有去 是一小部分使用的着色器组合。所以禁用(即 注释掉除了你的2D GUI之外的所有绘图,然后写一个简单的 用你的正交矩阵转换位置的顶点着色器,写一个 输出平面颜色的简单片段着色器(白色或其他) 很容易看到确认它有效),将它们链接到一个 程序,glUseProgram它,并绘制。修复任何问题,然后加入 纹理。然后带上颜色。然后引入任何其他GUI效果 你可能有。很好,很慢,一步一步,你会得到 那里。
完成2D GUI后,您应该进行着色器加载 建立基础设施,你应该对如何有一个体面的理解 激活和切换着色器,你会知道制服,也许是一个 关于属性,你会知道如何在数据之间传递数据 着色器阶段。然后选择别的东西,取消评论,然后重复。 这次你会更快一点,因为你已经拥有了很多 基础工作完成。继续重复直到第一阶段 完成。
现在您可以开始移植到缓冲对象。再一次,它会是 如果你不试图同时跳过太多的GL_VERSION,会更容易 时间,所以坚持固定的顶点attribs(glVertexPointer, glTexCoordPointer等)现在。完成你的绘图程序和 将顶点数据划分为两个主要组:不变的数据 从帧到帧和数据。然后看第二组 更紧密:是否所有真正的数据确实发生了变化?例如,你可以 有一些关键帧动画,可以在顶点处理 着色器而不是一直更新数据;把它移回 第一组。你可能有一个粒子系统和粒子 可以通过发送不变的位置来处理移动 但在顶点着色器中应用简单的物理方程;第一组 再次。这就是为什么我建议先做着色器:如果你没有 然后你就无法使用这种方法。
对于绝对需要更改的数据,您有一些 选项。你可以继续使用立即模式:它仍然可以工作 与GL 2.1。您可以将其转换为客户端顶点数组。您可以 看看是否设置了缓冲区对象流。
完成此操作后,您应具备功能 相同的程序,不再使用固定管道和(可能 大多数情况下)不再使用立即模式。然后是时候跳到一个 更高的GL_VERSION,如果你愿意(你可能会认为你很满意 结果并称之为完成任务),或者你可以改为 喜欢添加一些额外的功能(你可能有一些每顶点 通过移动它可以获得更好质量的结果 每个片段;照明是一个经典的例子),优化一点,或 不管。