顶点数据的转换。鼠标拣选算法

时间:2017-09-16 12:44:05

标签: opengl matrix shader transformation

在我的程序中,我有一个小发明,可以移动场景中的任何对象。我已经知道,存储任何转换的常用方法是在该对象的模型矩阵中存储转换,并直接在着色器中执行任何转换。但是在我的程序中,我实现了一个经典的光线拾取算法,它只适用于真正的转换数据。射线检测与实际(变换的)顶点位置的任何交叉点。解决这一冲突的常用方法如何:

  1. 立即将任何转换乘以CPU并存储转换后的数据。我认为这是一种清晰的方式,但它很昂贵:例如,我在100帧内将对象拖到屏幕上,每帧我将移动到矩阵的三角形转换为矩阵并将整数数据乘以。
  2. 将任何变换存储在矩阵中,直到鼠标拾取开始,然后按矩阵快速乘以顶点以准备拾取数据。这非常奇特,但有办法优化它。
  3. 哪种方式更高效。也许还有其他一些方法?

    罗宾逊的更新:

    我觉得你误解了我。或者我没有完全理解你。我有一个盒子和一个球体,我通过Gizmo(我编辑它们的模型矩阵)分别在1,0,0和0,1,0上移动它。他的模型矩阵现在不同了。在这里,我获得了射线拾取所需的数据 - 任何物体都有自己独立的位置。

    然后我将整个场景转换为眼睛空间(视图矩阵),然后剪切空间(投影矩阵)并渲染它。我的光线从视口返回到世界空间(取消投影视图和投影矩阵),并且应该与实际场景交互。我的光线变换而不是场景!

    我的问题是如何与真实地点未知的物体进行互动,直到物体呈现(或变换)为止?或者我可能不在正确的轨道上而且我应该采取不同的方式 - 每一步都将整个数据相乘(它很昂贵,请看我的第一个问题)。

1 个答案:

答案 0 :(得分:1)

你使用光线拾取技术上是"获取x,y屏幕坐标,将它们转换为NDC并将z设置为[-1,1]范围内的任何人;最后将它们全部转换回世界坐标"。

当您想要将光线从视点(相机)与"鼠标坐标相交时,这非常有用。并且你想在CPU端进行所有这些交集计算。
请注意,即使屏幕上没有任何内容,也可以进行,只需要鼠标坐标;好吧,加上视口和当前的转换,但你知道它们在任何glDrawxxx命令之前。

接下来,问题是:你打算用光线或交叉点做什么?

您可能希望修改某些属性(如颜色)或位置。对?
要修改多少个对象?如果它只是一堆,那么可以在CPU上修改要发送到GPU的数据。但是如果你有成千上万的对象,那就考虑一下硬件加速的方式:保持它们的坐标,但是将新的转换矩阵和属性发送给GPU,让它付出艰苦的努力。

如果您担心某些对象会像以前一样保留,但其他对象会被修改,请记住您可以绘制共享矩阵的对象组和其他统一单个glDrawxxx调用。如果您有不同的组,请使用几个不同制服的glDrawxxx调用,甚至是不同的着色器。