gles2中的Mipmap出现空白

时间:2016-07-20 03:42:42

标签: c opengl-es-2.0

glGenTextures(1, &bigTex);
glBindTexture(GL_TEXTURE_2D, bigTex);
u32 mipmapLevel = max(0, (int)greaterOrEqualPowerOfTwoExponent(max(packing.bounds.x, packing.bounds.y)) - 4);
glTexImage2D(GL_TEXTURE_2D, mipmapLevel, GL_ALPHA, texSpan.x, texSpan.y, 0, GL_ALPHA, GL_UNSIGNED_BYTE, dat);
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

这似乎产生了空白(和不透明)纹理。通过将mipmapLevel设置为零来禁用mipmap会导致它正常呈现,但当然,没有mipmapping。

1 个答案:

答案 0 :(得分:0)

glImage2d的mipmap level参数并不意味着你的意思。它指定了dat的mipmap级别,而不是与bigTex关联的所需的最低mipmap级别,所以你要说的是你要定义bigTex的第五个mipmap级别。你永远不会看到bigTex的第五个mipmap级别,所以一切看起来都是空白的 - 因为你从未定义过更高的mipmap级别。

由于dat是最​​详细的级别(0),因此这是您定义的级别。所以摆脱mipmapLevel,然后做

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texSpan.x, texSpan.y, 0, GL_ALPHA, GL_UNSIGNED_BYTE, dat);

您已经看到这种方法有效,但您认为它会禁用mipmapping,因为降尺度效果不佳。此时,Mipmap应该生效。将GL_TEXTURE_MIN_FILTER设置为GL_LINEAR_MIPMAP_NEAREST而不是GL_LINEAR,然后输入glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);以获得良好的衡量标准,您将会看到。