我有几个 3D 纹理,我想为每个纹理自动生成一个 mip 贴图。纹理均为 64x64x64,我希望生成最大 16x16x16 的 mip 贴图。
之后我想使用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);
Run Code Online (Sandbox Code Playgroud)
然后,对于每个帧,我调用 glClear 来清空它们,然后调用填充 3D 纹理的着色器(它仅填充 64^3 的最高级别)。
layout (binding = 0, rgba8) coherent uniform image3D volumeTexture[N];
...
imageStore(volumeTexture[n_tex], ivec3(coords1), vec4(fragmentColor.xyz, 1.0));
Run Code Online (Sandbox Code Playgroud)
之后,在使用纹理之前我调用:
for (int i = 0; i < N; ++i){
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_3D, volumeTexture[i]);
glGenerateMipmap(GL_TEXTURE_3D);
}
Run Code Online (Sandbox Code Playgroud)
最后,在我的着色器中我有
layout (binding = 0) uniform sampler3D VolumeTexture[N];
...
vec4 color = textureLod(VolumeTexture[current_tex], texCoords, 1+distance/10);
Run Code Online (Sandbox Code Playgroud)
因为它似乎没有从任何较低的级别进行采样,所以我输入了一个手动数字,而不是 1+distance/10,但我不断得到与从主纹理读取时得到的相同结果。我设置了 100 的 lod,本来以为什么也看不到,但结果没有改变