在我的程序中,我有一个小发明,可以移动场景中的任何对象。我已经知道,存储任何转换的常用方法是在该对象的模型矩阵中存储转换,并直接在着色器中执行任何转换。但是在我的程序中,我实现了一个经典的光线拾取算法,它只适用于真正的转换数据。射线检测与实际(变换的)顶点位置的任何交叉点。解决这一冲突的常用方法如何:
哪种方式更高效。也许还有其他一些方法?
罗宾逊的更新:
我觉得你误解了我。或者我没有完全理解你。我有一个盒子和一个球体,我通过Gizmo(我编辑它们的模型矩阵)分别在1,0,0和0,1,0上移动它。他的模型矩阵现在不同了。在这里,我获得了射线拾取所需的数据 - 任何物体都有自己独立的位置。
然后我将整个场景转换为眼睛空间(视图矩阵),然后剪切空间(投影矩阵)并渲染它。我的光线从视口返回到世界空间(取消投影视图和投影矩阵),并且应该与实际场景交互。我的光线变换而不是场景!
我的问题是如何与真实地点未知的物体进行互动,直到物体呈现(或变换)为止?或者我可能不在正确的轨道上而且我应该采取不同的方式 - 每一步都将整个数据相乘(它很昂贵,请看我的第一个问题)。
答案 0 :(得分:1)
你使用光线拾取技术上是"获取x,y屏幕坐标,将它们转换为NDC并将z设置为[-1,1]范围内的任何人;最后将它们全部转换回世界坐标"。
当您想要将光线从视点(相机)与"鼠标坐标相交时,这非常有用。并且你想在CPU端进行所有这些交集计算。
请注意,即使屏幕上没有任何内容,也可以进行,只需要鼠标坐标;好吧,加上视口和当前的转换,但你知道它们在任何glDrawxxx命令之前。
接下来,问题是:你打算用光线或交叉点做什么?
您可能希望修改某些属性(如颜色)或位置。对?
要修改多少个对象?如果它只是一堆,那么可以在CPU上修改要发送到GPU的数据。但是如果你有成千上万的对象,那就考虑一下硬件加速的方式:保持它们的坐标,但是将新的转换矩阵和属性发送给GPU,让它付出艰苦的努力。
如果您担心某些对象会像以前一样保留,但其他对象会被修改,请记住您可以绘制共享矩阵的对象组和其他统一单个glDrawxxx调用。如果您有不同的组,请使用几个不同制服的glDrawxxx调用,甚至是不同的着色器。