为什么mipmapping不适用于我的3D纹理? (OpenGL的)

时间:2016-02-09 13:23:58

标签: c++ opengl 3d textures mipmaps

所以我正在创建一个地形和纹理,我想使用一个3D纹理(深度3),它在每个z层上保存3个图像(512x512),这样我就可以在这些图层之间使用GPU插值基于一个因素:0/3 =图像1,1 / 3 =图像2,2 / 3 =图像3,以及下一级别(循环)插值之间的每个值。

只要我不在此3D纹理上启用mip贴图,这就完美无缺。当我启用它时,我的地形将获得相同的一个图像,除非我靠近,好像图像已从z层转移到mip-map图层。

我不明白这一点,有人能告诉我我做错了吗?

这是我生成纹理的地方:

glGenTextures(1, &m_textureId);
glBindTexture(GL_TEXTURE_3D, m_textureId);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 512, 512, 3, 0, GL_BGR, GL_UNSIGNED_BYTE, 0);

这是我为每个Z执行的步骤:

glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, Z, 512, 512, 1, GL_BGR, GL_UNSIGNED_BYTE, imageData);

在此之后,我做了:

glGenerateMipmap(GL_TEXTURE_3D);

在着色器中,我将纹理定义为:

uniform sampler3D tGround;

并简单地用以下方式对其进行抽样:

texture(tGround, vec3(texcoord, f));

其中texcoord是一个2D坐标,f是我们需要的层,只是基于此时的高度。

1 个答案:

答案 0 :(得分:2)

有一种方法可以做你想要的事情,但确实需要工作。并且您无法使用3D纹理来完成它。

您必须使用Array Textures。考虑2D阵列纹理的常用方法是作为一组相同大小的2D纹理。但您也可以将其视为3D纹理,其中每个mipmap级别具有相同数量的Z层。但是,还存在阵列层之间存在无混合的问题。

由于你想要混合,你需要合成它。但是使用着色器这很容易:

 $.ajax({
     type: "POST",
     url: "sample.php",
     data: {
         dtsignatory: signatoryidglobal
     },
     headers: {
         "Accept": "application/json; charset=utf-8"
     },
     contentType: "application/json; charset=utf-8",
 })