Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用OpenGL将体积数据渲染为3D纹理?_C++_Opengl_3d_Volume_Voxel - Fatal编程技术网

C++ 如何使用OpenGL将体积数据渲染为3D纹理?

C++ 如何使用OpenGL将体积数据渲染为3D纹理?,c++,opengl,3d,volume,voxel,C++,Opengl,3d,Volume,Voxel,我正在尝试使用GPU将一些3D形状渲染成3D纹理。我使用帧缓冲区对象来实现这一点。到目前为止,我发现唯一有效的方法是一次渲染一个3D纹理切片(或层) 例如,如果我想将球体绘制到3D纹理,我会将球体的适当横截面绘制到纹理的每一层 这在小分辨率或少量形状下工作良好,但随着分辨率或复杂性的增加,速度会迅速减慢 是否有更正确或更快的方法?我的目标是适中的旧硬件,所以我仅限于OpenGL 3.x。具体地说,我不能使用其中的一些。虽然我个人没有这样做,但我知道有一个例子可以为directX提供解决方案。它可

我正在尝试使用GPU将一些3D形状渲染成3D纹理。我使用帧缓冲区对象来实现这一点。到目前为止,我发现唯一有效的方法是一次渲染一个3D纹理切片(或层)

例如,如果我想将球体绘制到3D纹理,我会将球体的适当横截面绘制到纹理的每一层

这在小分辨率或少量形状下工作良好,但随着分辨率或复杂性的增加,速度会迅速减慢


是否有更正确或更快的方法?我的目标是适中的旧硬件,所以我仅限于OpenGL 3.x。具体地说,我不能使用其中的一些。

虽然我个人没有这样做,但我知道有一个例子可以为directX提供解决方案。它可以移植到OpenGL:,请参见第1.3.2节:生成密度值

简而言之,执行实例绘制,并将每个实例定向到纹理的不同层


您还可以复制所有三角形,并使用几何体着色器将它们发送到所有相关的切片。

好建议,但这似乎调用片段着色器的次数与我的方法相同(尽管它可能更有效,因为绘制调用更少)。现在,我决定在OpenGL 4.2中使用imageStore进行尝试。您可以将我最初的想法与片段平面结合起来,在片段着色器运行之前丢弃不需要的片段。这在HLSL中是可能的(因此我假设GLSL也支持它),并且通常与早期深度测试同时进行(作为选择要着色的片段的一部分)。在可用的情况下,在片段着色器中使用
imageStore
似乎是正确的答案。我可以简单地将形状渲染到一个平面(比如x-y平面),然后对于每个“碎片”,我可以计算形状的z间隔,并简单地
imageStore
3D纹理中的正确坐标,而不是为体积的每个切片绘制形状的横截面。如何在不允许这种控制的硬件上有效地实现这一点的问题仍然悬而未决。