【问题标题】:OpenGL ES 2.0 texture not showing on some deviceOpenGL ES 2.0 纹理未在某些设备上显示
【发布时间】:2012-07-11 06:43:28
【问题描述】:

我找到了一个名为 Rajawali 的 Android 3D 图形框架,我正在学习如何使用它。我遵循了最基本的教程,它使用 1024x512 大小的 jpg 图像为纹理渲染一个 shpere 对象。它在 Galaxy Nexus 上运行良好,但在 Galaxy Player GB70 上却无法运行。

当我说它不起作用时,我的意思是对象出现但纹理没有渲染。最终,我更改了一些在创建纹理时用于 Rajawali 框架的参数并使其工作。这是我发现的。

原因来自设置GL_TEXTURE_MIN_FILTER 的位置。以下四个值中

GLES20.GL_LINEAR_MIPMAP_LINEAR
GLES20.GL_NEAREST_MIPMAP_NEAREST
GLES20.GL_LINEAR
GLES20.GL_NEAREST

仅当GL_TEXTURE_MIN_FILTER 未设置为使用 mipmap 的过滤器时才会渲染纹理。因此,当 GL_TEXTURE_MIN_FILTER 设置为最后两个时,它可以工作。

现在这里是我不理解和好奇的地方。当我将用作纹理的图像缩小到 512x512 时,GL_TEXTURE_MIN_FILTER 设置无关紧要。 min 过滤器的所有四个设置都有效。

所以我的问题是,对纹理使用最小滤镜时,对图像的尺寸有要求吗?比如我需要使用正方形的图像吗?其他的东西,比如 wrap 样式或 mag 过滤器的配置是否有问题?

或者它看起来像是设备的 OpenGL 实现错误?

【问题讨论】:

    标签: android opengl-es opengl-es-2.0 textures galaxy


    【解决方案1】:

    早上好,这是 2 纹理非幂的典型示例。

    由于多种原因,纹理的分辨率必须是 2 的幂,这是一个非常常见的错误,每个人都曾遇到过这个陷阱 :) 我也是。

    non power of 2 纹理在某些设备/GPU 上运行顺畅这一事实仅取决于 OpenGL 驱动程序的实现,有些 GPU 清楚地支持它们,有些则不支持,我强烈建议您按顺序使用 pow2 纹理能够保证所有设备上的功能。

    最后但同样重要的是,使用非 2 次幂纹理可能会导致 GPU 内存利用率出现灾难性场景,因为大多数接受非 2 次幂纹理的驱动程序需要在内存中将纹理重新缩放到最接近的更高幂2 因素。例如,具有 520X520 的纹理可能会导致实际的内存映射为 1024X1024。

    这是您不想要的,因为在现实世界中“尺寸很重要”,尤其是在移动设备上。

    您可以在 OpenGL Gold Book,OpenGL ES 2.0 中找到一个很好的解释:

    在 OpenGL ES 2.0 中,纹理可以有非二次幂 (npot) 方面。换句话说,宽度和高度不需要是 两个的幂。但是,OpenGL ES 2.0 确实对 如果纹理尺寸不是幂次方可以使用的环绕模式 二。也就是说,对于 npot 纹理,wrap 模式只能是 GL_CLAMP_TO_EDGE 和缩小过滤器只能是 GL_NEAREST 或 GL_LINEAR(换句话说,不是 mip-mapped)。扩展名 GL_OES_texture_npot 放宽了这些限制并允许换行模式 GL_REPEAT 和 GL_MIRRORED_REPEAT 并且还允许 npot 纹理 使用全套缩小过滤器进行 mipmap。

    我建议您评估这本书,因为它对该主题的报道相当不错。

    【讨论】:

    • 感谢您提供良好的学习资料来源。但我知道你提到的大部分事情。也许我没有把我的故事说得很清楚。
    • 我使用 1024*512 大小的图像作为纹理。纹理在 Galaxy Nexus 上渲染良好,但在 Galaxy Player 上没有渲染。纹理仅在以下两种情况下适用于 Galaxy Player。如果不对 GL_TEXTURE_MIN_FILTER(线性或最近)使用 mipmap 过滤器,或者我将尺寸缩小到 512x512(那么 GL_TEXTURE_MIN_FILTER 设置无关紧要)。而且由于 1024 和 512 都是 2 的幂的数字,我想换行模式真的无关紧要。至少我的理解是这样想的。
    • 如上所述,我也有一个大小为 2 次方的纹理 (1024 x 512),它显示的是黑色纹理。换行模式的改变对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多