Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++ glGenerateMipmap不';不能在OpenGL中使用3D纹理_C++_Opengl - Fatal编程技术网

C++ glGenerateMipmap不';不能在OpenGL中使用3D纹理

C++ glGenerateMipmap不';不能在OpenGL中使用3D纹理,c++,opengl,C++,Opengl,我有几个3D纹理,我想自动为每个纹理生成一个mip贴图。纹理都是64x64x64,我希望生成的mip贴图最多为16x16x16 之后,我想使用textureLOD在各种mip级别之间执行插值 这就是我所尝试的: 我对每个主3d纹理都这样做 glGenTextures(1, &volumeTexture[i]); glBindTexture(GL_TEXTURE_3D, volumeTexture[i]); glTexImage3D(GL_T

我有几个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处的最高级别)

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

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

因为它似乎没有从任何较低的层次进行采样,而不是1+distance/10,我输入了一个手动编号,但我一直得到与从主纹理读取时相同的结果。我将lod设置为100,我希望什么也看不到,但是结果没有改变

在OpenGL 4.0中,有一个
textureQueryLod
函数来获得正确的mipmap级别。可能至少有助于调试…textureQueryLod似乎在任何地方都返回(0,1),而不管我指定的lod是什么,因此这意味着它不是mipmappingall@tigeradol你现在明白了吗?
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);