在顶点着色器中进行变换时,在OpenGL中选择对象



我对OpenGL很陌生,正在尝试实现一个简单的程序,在这个程序中我可以绘制立方体,用鼠标移动它们,然后删除它们。

以前,我通过在CPU上进行翻译来完成拖动操作。通过这种方式,我能够使用光线跟踪来挑选我想要的元素,因为顶点本身正在更新。

然而,我正试图将所有转换移动到GPU,并在这样做的过程中意识到,我将放弃对CPU上顶点的更新访问(因为CPU仍然认为这些顶点是未转换的顶点(。如何进行这种通信,这样我就不必在CPU和顶点着色器中手动进行转换了?

无论在哪里进行变换,通常都会有一个模型矩阵来描述场景中每个对象的位置。您也可以通过使用反向模型矩阵变换光线,将光线变换到每个对象的对象空间,而不是将每个对象变换到世界空间中,以便检查与世界空间光线的相交。

光线跟踪的一个常见问题是,随着场景变得越来越大,对每个对象的强力测试将变得越来越慢。您可以使用加速结构,如八叉树或边界体积层次来加快速度。在拾取时,一种完全不同的方法是渲染一个ID缓冲区,即一个与当前渲染帧具有相同分辨率的缓冲区,并为每个像素保存在该像素可见的对象的ID。然后,您可以简单地读回光标下像素的值,以找出您击中的对象,而无需进行任何光线跟踪。渲染ID缓冲区可以作为一个单独的过程来完成,或者可能只是作为一个额外的渲染目标添加到你已经在做的过程中,例如,预先填充深度缓冲区,或者在你只做一个过程的情况下,在渲染场景时。

最新更新