glGenerateMipmap不适用于OpenGL中的3D纹理

时间:2014-08-05 12:00:33

标签: c++ opengl

我有几个3D纹理,我想自动为每个纹理生成一个mip贴图。纹理都是64x64x64,我希望生成的mip贴图最高可达16x16x16。

之后我想使用textureLOD在各种mip级别之间执行插值。

这就是我的尝试:

我为每个主要的3D纹理

执行此操作
        glGenTextures(1, &volumeTexture[i]);
        glBindTexture(GL_TEXTURE_3D, volumeTexture[i]);
        glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, volumeDimensions, volumeDimensions, volumeDimensions, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
        glGenerateMipmap(GL_TEXTURE_3D);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
        glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_LOD_BIAS, 0.f);

        glBindTexture(GL_TEXTURE_3D, 0);
        glGenFramebuffers(1, &volumeFbo[i]);
        glBindFramebuffer(GL_FRAMEBUFFER, volumeFbo[i]);
        glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, volumeTexture[i], 0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);

然后,对于每个帧,我调用glClear来清空它们,然后调用填充3D纹理的着色器(它仅填充64 ^ 3处的最高级别)。

 layout (binding = 0, rgba8) coherent uniform image3D volumeTexture[N];
 ...
 imageStore(volumeTexture[n_tex], ivec3(coords1), vec4(fragmentColor.xyz, 1.0));

之后,在使用我调用的纹理之前:

for (int i = 0; i < N; ++i){
    glActiveTexture(GL_TEXTURE0 + i);
    glBindTexture(GL_TEXTURE_3D, volumeTexture[i]);
    glGenerateMipmap(GL_TEXTURE_3D);
}

最后,在我的着色器中,我有

layout (binding = 0) uniform sampler3D VolumeTexture[N];
...
vec4 color = textureLod(VolumeTexture[current_tex], texCoords, 1+distance/10);

因为它似乎没有从任何较低级别采样,而不是1 +距离/ 10我设置了一个手动数字,但我从主要纹理读取时得到的结果相同。我放了一个100的lod,我希望看到什么,但结果没有改变

0 个答案:

没有答案