使用 mipmap 会产生垃圾纹理

发布于 10-17 23:45 字数 870 浏览 8 评论 0原文

我在创建纹理时创建自己的 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。

编辑:详细说明纹理 - 它们实际上几乎是黑色的。我在具有明亮颜色的 mip 上尝试了擦除颜色(),但它们仍然非常暗。

I'm creating my own mipmaps when creating textures, and as soon as I enable mipmaps via GL_LINEAR_MIPMAP_NEAREST (or anything MIPMAP), the textures are just a very dark, blurry mess. If I switch to GL_LINEAR, they're fine.

Here's how I'm creating the texture:

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);
}

I've omitted all Bitmap.recycle()/NewGlobalRef() calls for brevity. createScaledBitmap is obviously a JNI call to Bitmap.createScaledBitmap().

I also tried the other version of texImage2D that takes the format and type of the bitmap. I've verified that it's always RGBA.

EDIT: To elaborate on the textures - they're really almost black. I tried eraseColor() on the mips with bright colors, and they're still extremely dark.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小…红帽2024-10-24 23:45:34

glGenerateMipmap 将使您更快、更方便地完成此任务。

glGenerateMipmap will do this task faster and much more convenient for you.

梦与时光遇2024-10-24 23:45:34

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

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

The code you're showing will not generate the lower mip levels (1x1 will be missing, e.g.), so your texture will be incomplete. That should make the rendering as if the texturing was not present at all. It's unclear from your description if this is what you're observing.

In all cases, you should provide the mipmaps all the way down to the 1x1 (and for non square textures, this requires some changes in the computation of the new texture size to keep passing 1, as in 4x1 -> 2x1 -> 1x1)

羅雙樹2024-10-24 23:45:34

Bitmap.createScaledBitmap 可能无法纠正伽玛值。查看此线程以获取创建伽玛校正的代码mip贴图

It may be the case that Bitmap.createScaledBitmap does not correct the gamma. Have a look at this thread for code to create gamma-corrected mipmaps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文