1

我在创建纹理时创建了自己的 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(),但它们仍然非常暗。

4

3 回答 3

2

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

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

于 2011-02-19T21:09:01.843 回答
2

glGenerateMipmap将为您更快、更方便地完成这项任务。

于 2011-02-19T23:54:29.757 回答
0

可能是 Bitmap.createScaledBitmap 没有更正伽玛的情况。查看此线程以获取创建 gamma 校正的 mipmap 的代码

于 2011-02-19T18:50:59.180 回答