我有以下目标:
使用输入顶点数据执行顶点处理(顶点,tessealation和/或几何着色器)。这应该从不同的网格特定缓冲区获取所有对象空间顶点数据,将它们转换为世界空间并将其存储到单个世界网格缓冲区中。还可以使用几何着色器来分析世界空间中的网格(例如,碰撞检测)。顶点数据和碰撞检测输出将被转换反馈到不同的缓冲区。
在另一个顶点处理阶段使用世界空间顶点数据,这将应用视图变换和透视投影。这将允许移动相机"不重复可能昂贵的对象到世界的空间变换(例如,实例化贝塞尔曲面)。在这个阶段,可以进行与摄像机相关的网格分析(例如,用于鼠标选择的光线 - 三角形交叉)。和以前一样,顶点数据和光线三角形交叉点数据将被写入单独的缓冲区。
使用相机空间顶点数据来栅格化网格并渲染到帧缓冲区中。更新屏幕(例如,调整大小的窗口)只需要重复第三遍。将相机移动到周围仅需要重复第二次和第三次通过。
将整个管道拆分为这三个阶段的重点是:
这就是我所拥有的:
我的原型解决方案只将管道分成两个阶段(阶段1和阶段2现在合并)。 我为每个阶段创建了两个程序。第一个只有顶点着色器和几何着色器,第二个只有一个直通顶点着色器和一个片段着色器。 我成功地设置了完成第一阶段所需的一切。我通过映射变换反馈缓冲区并查询变换反馈原语计数来测试它。我尝试弄乱几何着色器中的顶点,结果反映了相应的变化。 我有两个顶点数组对象:一个用于输入顶点数据,另一个用于变换反馈输出顶点数据。
这是我的问题:
当我尝试将变换反馈缓冲区绑定到GL_ARRAY_BUFFER绑定点并使用第二个顶点数组对象时,我什么也得不到。我使用OSX的OpenGL分析器通过在所有内容上设置断点来检查任何GL错误,并且没有任何反应。因此,我不会导致GL错误,我通过映射缓冲区获得反馈数据,但我看不到任何渲染的内容。我通过手动查询原始计数尝试了glDrawTransformFeedback()和glDrawArrays()。
注意:
我的代码库与Cocoa高度集成,分布在许多文件中。我确实知道我必须发布一些源代码,所以请告诉我你需要看哪些部分,我会收集它们并以一种简洁的方式发布它们。
答案 0 :(得分:0)
经过一些重构后,问题自行解决了。老实说,我不知道出了什么问题。作为对遇到此类问题的人的建议,请密切关注您的绑定和状态。在您使用它们之后始终取消绑定对象并始终阅读文档中的功能,以确保您不会忘记绑定此功能所需的内容。