glGenerateMipmap 不适用于 OpenGL 中的 3D 纹理
glGenerateMipmap doesn't work with 3D textures in 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,我放了一个手动数字,但我一直得到相同的结果,我从主纹理读取时得到的。我设置了一个load值为100,我希望看到什么也没有,但结果没有改变
您需要将GL_TEXTURE_MIN_FILTER
设置为GL_LINEAR_MIPMAP_LINEAR
或其他mipmap设置!
相关文章:
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- 3D 纹理大小会影响程序输出,而不会引发错误
- 呈现为3D纹理
- 从 Vulkan 中的 R16_UINT-3D 纹理中采样片段着色器中的值
- 在OpenGL 2.1中,即使在2D空间(具有2D纹理),也可以安全使用3D TEX坐标
- 如何将纹理映射到 3D 对象
- 将2D图像映射到3D纹理
- 是否可以在opengl中使用深度缓冲区渲染3D纹理
- 将两个图像堆栈的非电源加载到 3D 纹理 OpenGL C++
- 如何在 3D 图形 OpenGL 中使用纹理
- OpenGL 3D 纹理问题
- Cocos2D-X 在 3D 中重复纹理
- 用于渲染 3D 球体的纹理坐标
- OpenGL 3.3:在3D场景上显示2D纹理的问题
- 3D纹理的OpenGL高斯内核
- glGenerateMipmap 不适用于 OpenGL 中的 3D 纹理
- 在OpenGL中添加3D球体和纹理
- CUDA中作为纹理的3D阵列写入和读取