我有一个 3D 纹理,我在其中写入数据并以这种方式将其用作片段着色器中的体素:
#extension GL_ARB_shader_image_size : enable
...
layout (binding = 0, rgba8) coherent uniform image3D volumeTexture;
...
void main(){
vec4 fragmentColor = ...
vec3 coords = ...
imageStore(volumeTexture, ivec3(coords), fragmentColor);
}
并且纹理是这样定义的
glGenTextures(1, &volumeTexture);
glBindTexture(GL_TEXTURE_3D, volumeTexture);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, volumeDimensions, volumeDimensions, volumeDimensions, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
然后当我必须使用它时
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, volumeTexture);
现在我的问题是我想要一个 mipmapped 版本而不使用 opengl 函数,因为我注意到它非常慢。所以我正在考虑同时在所有级别写入 3D 纹理,例如,最大分辨率为 512^3,当我在该 3dtex 中写入 1 voxel VALUE 时,我还为 256^3 写入 0.125*VALUE voxel 和 0.015625*VALUE 用于 126^3 等。由于我使用 imageStore,它使用原子性,所有值都将被写入并使用这些权重我会自动获得平均值(不完全像插值,但我可能会得到一个令人愉快的结果反正)。所以我的问题是,拥有多个 3dtexture 并同时写入所有这些的最佳方法是什么?