c - OpenGL:从栅格化中分离顶点处理



我有以下目标:

  1. 使用输入顶点数据执行顶点处理(顶点、镶嵌和/或几何着色器)。这应该从不同的网格特定缓冲区中获取所有对象空间顶点数据,将它们转换为世界空间并将其存储到单个世界网格缓冲区中。还可以使用几何着色器来分析世界空间中的网格(例如碰撞检测)。顶点数据和碰撞检测输出将被转换反馈到不同的缓冲区。

  2. 在另一个顶点处理阶段使用世界空间顶点数据,这将应用视图转换和透视投影。这将允许在"相机"周围移动,而无需重复潜在昂贵的对象到世界空间转换(例如实例化贝塞尔曲面)。在这个阶段,可以进行与相机相关的网格分析(例如,鼠标选择的光线三角形相交)。与之前一样,顶点数据和射线-三角形相交数据将被写入单独的缓冲区。

  3. 使用相机空间顶点数据栅格化网格并渲染到帧缓冲区。更新屏幕(例如调整窗口大小)只需要重复第三个步骤。移动相机只需要重复第二和第三遍。

将整个管道分成这3个阶段的要点是:

  • 为渲染和GPGPU做顶点处理(碰撞检测,射线三角形相交,…),从而避免重复。
  • 在没有进行世界空间更改时重用模型转换。

我的原型解决方案只将管道分为两个阶段(阶段1和阶段2现在合并)。我为每一个阶段都设计了两个程序。第一个只有一个顶点着色器和一个几何着色器,第二个只有一个通过顶点着色器和一个片段着色器。我成功地设置了所有必要的东西,使第一个舞台表演。我通过映射转换反馈缓冲区和查询转换反馈原语计数来测试这一点。我试着在几何着色器中改变顶点,结果也相应地反映了变化。我有两个顶点数组对象:一个用于输入顶点数据,另一个用于转换反馈输出顶点数据。

我的问题是:

当我尝试将转换反馈缓冲区绑定到GL_ARRAY_BUFFER绑定点并使用第二个顶点数组对象时,我一无所获。我使用OSX的OpenGL分析器通过设置断点来检查任何GL错误,但没有发生任何事情。我不会导致GL错误,我通过映射缓冲区获得反馈数据但我没有看到任何东西被渲染。我通过手动查询原始计数尝试了glDrawTransformFeedback()和glDrawArrays()。

注意:

我的代码库与Cocoa高度集成,并分布在许多文件中。我确实意识到我将不得不发布一些源代码,所以请告诉我你需要看到哪些部分,我会收集它们并以整洁的方式发布。

这个问题在一些重构之后自行解决了。我真的不知道怎么了。作为对遇到这种问题的人的建议,请密切关注绑定和状态。在使用完对象后,一定要解除对它们的绑定,并且一定要阅读函数的文档,以确保没有忘记绑定该函数需要的东西。

最新更新