Opengl GLSL-采样三维纹理的体积

Opengl GLSL-采样三维纹理的体积,opengl,glsl,textures,Opengl,Glsl,Textures,我最近在OpenGL中使用3d纹理。 我意识到在使用3d纹理时,必须经常使用texture3d()。 这几乎是一个gpu杀手。glsl中是否有任何函数允许我对3d纹理的体积进行采样?因此,我不需要调用texture3D()32768次,而可以这样做: texture3DVolume(3dtexture, vec3(0.5, 0.5, 0.5), vec3(0.2, 0.2, 0.2)); 其中0.5 0.5 0.5采样,0.2 0.2 0.2的体积。否:正如您自己所注意到的,这将涉及对所有体积

我最近在OpenGL中使用3d纹理。 我意识到在使用3d纹理时,必须经常使用texture3d()。 这几乎是一个gpu杀手。glsl中是否有任何函数允许我对3d纹理的体积进行采样?因此,我不需要调用texture3D()32768次,而可以这样做:

texture3DVolume(3dtexture, vec3(0.5, 0.5, 0.5), vec3(0.2, 0.2, 0.2));

其中0.5 0.5 0.5采样,0.2 0.2 0.2的体积。

否:正如您自己所注意到的,这将涉及对所有体积进行采样

在二维中,可以使用面积汇总表。它使您能够仅使用4个样本计算“框”内矩阵的所有值之和;我想这个概念很容易扩展到3D

请注意,您将有一个非常昂贵的预处理步骤;你只能得到平均值和和,没有其他像几何平均值或中位数这样奇特的东西

以下是AMD关于不同用例的一些解释:


我想您也可以使用mipmap:要对2x2x2卷进行采样,请对1rst mipmap进行采样。。。但是,对于任意采样位置,这是不可行的。

您在片段着色器中做了什么,可以合理地访问纹理2^15次?在一次执行包含这么多信息的片段着色器时,您将要做什么?您希望此示例的结果是什么?该体积中所有值的平均值,中位数,总和?尼科尔·博拉斯:举个例子。我想在某个点上对半球进行采样。我怀疑3D版的面积汇总表是否是一个实用的解决方案。对于2D SAT,您(通常**)必须考虑求和值的最坏情况范围,因此对于单色源512x512 8bpp纹理,SAT中的每个存储值将需要额外18b,每个条目提供26b!例如,对于3D、8bp256^3纹理,您需要8+3x8=>32bpp。如果是RGB纹理,效果会差3倍。[**这方面有一些解决办法,但它们并不漂亮。]我想知道更多关于不漂亮的解决办法的信息。。。有参考文献吗?Crow的原始论文提出了一些建议,但最近的进展可能是Hensley等人的“快速求和面积表生成及其应用”,他们使用偏移浮点来防止数值爆炸。不确定精度的潜在损失是否是一个问题。感谢链接!事实上,我发现这种解决方法非常聪明和优雅。但8位绝对不够,16位也可能不够。