Opengl es 在光线跟踪器着色器中加载三角形顶点的更好方法

Opengl es 在光线跟踪器着色器中加载三角形顶点的更好方法,opengl-es,glsl,webgl,shader,webgl2,Opengl Es,Glsl,Webgl,Shader,Webgl2,目前,我正在尝试在WebGL 2中实现一个带有三角形网格的光线跟踪器。到目前为止,我正在将数据加载到缓冲区纹理中,然后按如下方式解包: for (int i = 0; i < vertsCount; i += 3) { a = texelFetch(uMeshData, ivec2(i, 0), 0); b = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(1, 0));

目前,我正在尝试在WebGL 2中实现一个带有三角形网格的光线跟踪器。到目前为止,我正在将数据加载到缓冲区纹理中,然后按如下方式解包:

for (int i = 0; i < vertsCount; i += 3) {

            a = texelFetch(uMeshData, ivec2(i, 0), 0);
            b = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(1, 0));
            c = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(2, 0));


            bool isHit = hitTriangleSecond(R_.orig, R_.dir, a.xyz, b.xyz, c.xyz, uvt, triangleNormal, intersect, z);;
            if (isHit) {

                if (z<mindist && z > 0.001) {
                    //weHitsomething    
                }
            }      
        } 
你知道问题在哪里。当我尝试加载一个包含许多三角形的网格时,它会变得太慢,特别是当我添加反射级别时,比如4次,因为我必须检查每个三角形,每个帧。。。所以不是最优的

我听说过边界框技术和一些树存储数据。但我不知道怎么做

如果有人能提供一些这方面的信息就好了。除此之外

我也在考虑第二个纹理,其中包含关于我加载的每个网格的一些信息,但texelfetch与具有索引的数组不同,因此可以知道光线照射的方向上的对象


因此,我的问题是如何检查光线方向上最近的三角形。

在WebGL中实现光线跟踪器是一项相当高级的任务。我建议从简单开始。例如,使用3D纹理并在每个单元/像素中存储多达4个三角形索引。你必须在纹理中进行光线行进,直到你碰到一个三角形。一旦有了三角形索引,就可以在代码中的第二个名为uMeshData的纹理中查找顶点

在初始化阶段,可以用Javascript构建3D纹理数据。稍后,您可能可以在GPU上实现这一点,方法是将三角形渲染到3D纹理的2D切片上,使用深度缓冲区选择距离每个像素最近的三角形


如果一个3D纹理单元/像素上重叠的三角形超过4个,则无法生成正确的结果。由于固定步长光线行进的冗余性,它也不是很有效,但至少可以使您朝着正确的方向移动。完成后,您可以尝试更高级的解决方案,这些解决方案可能涉及树,例如边界卷层次结构。

您好,谢谢您的回复。你能解释一下这个短语是什么意思吗?例如,使用3D纹理和每个单元格固定的最大三角形索引数,我编辑了答案以添加更多细节,让我知道它是否需要更多细节