我对OpenGL还是很陌生,并且正在尝试实现一个简单的程序,在该程序中,我可以绘制多维数据集,用鼠标四处移动并删除它们。
以前,我是通过在CPU上进行翻译来完成拖动操作的。这样,由于顶点本身正在更新,因此我可以使用光线跟踪来选择所需的元素。
但是,我试图将所有转换都移到GPU上,因此我意识到自己将放弃对CPU上顶点的更新访问权限(因为CPU仍然认为这些顶点是非顶点的,改造的)。如何进行这种通信,这样我就不必在CPU以及顶点着色器上手动进行转换?
答案 0 :(得分:1)
无论您在哪里进行转换,通常都会有一个模型矩阵来描述每个对象在场景中的位置。除了可以将每个对象转换为世界空间而不是检查是否与世界空间射线相交之外,还可以通过使用逆模型矩阵将射线转换为每个对象的对象空间来将其转换为每个对象的对象空间。
射线追踪的一个普遍问题是,随着您的场景变大,对每个对象的蛮力测试将变得越来越慢。您可以使用加速结构(例如Octree或Bounding Volume Hierarchy)来加快速度。完全不同的选择方法是渲染ID缓冲区,即与当前渲染的帧具有相同分辨率的缓冲区,并为每个像素保存在该像素处可见的对象的ID。然后,您可以简单地读回光标下方的像素值,以找出击中的对象,而无需进行任何光线追踪。渲染ID缓冲区可以单独进行,也可以作为其他渲染目标添加到您已经在进行的过程中,例如,预填充深度缓冲区,或者仅在渲染场景时才进行一次渲染