使用mipmap会导致垃圾纹理

时间:2011-02-19 18:42:29

标签: android opengl-es mipmaps

我在创建纹理时创建自己的mipmap,并且只要通过GL_LINEAR_MIPMAP_NEAREST(或任何MIPMAP)启用mipmap,纹理就会变得非常黑暗,模糊。如果我切换到GL_LINEAR,他们就没事了。

以下是我创建纹理的方法:

glGenTextures(1, &m_TextureId);
glBindTexture( GL_TEXTURE_2D, id );
int level = 0;

jobject mippedBitmap = srcBitmap;

while (width >= 2 && height >= 2) {
    jniEnv->CallStaticVoidMethod(s_GLUtilsClass, s_texImage2DMethodID,
                     GL_TEXTURE_2D, level, mippedBitmap, 0);

    width >>= 1;
    height >>= 1;
    level++;

    mippedBitmap = createScaledBitmap(jniEnv, srcBitmap, width, height, true);
}

为简洁起见,我省略了所有Bitmap.recycle()/ NewGlobalRef()调用。 createScaledBitmap显然是对Bitmap.createScaledBitmap()的JNI调用。

我还尝试了另一个版本的texImage2D,它采用了位图的格式和类型。我已经确认它总是RGBA。

编辑:要详细说明纹理 - 它们几乎是黑色的。我在明亮的颜色的mips上尝试了eraseColor(),它们仍然非常黑。

3 个答案:

答案 0 :(得分:2)

您显示的代码不会生成较低的mip级别(例如,1x1将丢失),因此您的纹理将不完整。这应该使渲染好像根本不存在纹理。从您的描述中不清楚这是否是您正在观察的内容。

在所有情况下,您应该将mipmap一直提供到1x1(对于非方形纹理,这需要对新纹理大小的计算进行一些更改以保持传递1,如4x1中所示 - > 2x1 - > 1x1)

答案 1 :(得分:2)

glGenerateMipmap可以更快,更方便地完成此任务。

答案 2 :(得分:0)

可能是Bitmap.createScaledBitmap没有更正伽玛的情况。有关创建经过伽马校正的mipmap的代码,请查看this thread