3

在我的 iOS 游戏中,我想在可用时使用 GL_APPLE_texture_2D_limited_npot 扩展来节省内存(游戏具有 NPOT 纹理,在我当前的实现中,我添加了一些填充以使它们具有两个的幂)。

我正在我的 iPad(第一代)中进行测试。到目前为止,我读到的每一篇文章都说所有支持 OpenGLES2(包括 iPad)的 iOS 设备也支持 GL_APPLE_texture_2D_limited_npot(这非常好,因为我的游戏使用的是 OpenGLES2)。我已经在我的 iPad 上进行了测试,它确实支持(如果我将 wrap 设置为 GL_CLAMP_TO_EDGE,我删除了填充并且图像工作),但是当我调用 glGetString(GL_EXTENSIONS) 时扩展不显示。编码:

const char *extensions = (const char *)glGetString(GL_EXTENSIONS);
std::cout << extensions << "\n";

结果是:

GL_OES_depth_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_texture_float GL_OES_texture_half_float GL_OES_vertex_array_object GL_EXT_blend_minmax GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_EXT_separate_shader_objects GL_EXT_shader_texture_lod GL_EXT_texture_filter_anisotropic GL_APPLE_framebuffer_multisample GL_APPLE_rgb_422 GL_APPLE_texture_format_BGRA8888 GL_APPLE_texture_max_level GL_IMG_read_format GL_IMG_texture_compression_pvrtc

为什么这个扩展不与 glGetString(GL_EXTENSIONS) 一起显示?检查它的正确方法是什么?所有 OpenGLES2 iOS 设备真的都支持吗?

4

1 回答 1

5

OpenGL ES 2.0 在规范中支持非 2 纹理的幂。无需扩展。这是规范:http ://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf (第69页):

如果 wt 和 ht 是指定的图像宽度和高度,并且如果 wt 或 ht 小于零,则生成错误 INVALID_VALUE。对于级别 0 到 k 的图像数组,二维纹理图像的最大允许宽度和高度必须至少为 2k-lod,其中 k 是 MAX_TEXTURE_SIZE 的以 2 为底的对数。lod 是图像阵列的细节层次。对于任何细节级别大于 k 的图像阵列,它可能为零。如果指定的图像太大而无法在任何条件下存储,则会生成错误 INVALID_VALUE。

没有关于二次幂限制的消息(即在 OpenGL ES 1.x 标准中)。

如果您阅读扩展规范 - http://www.khronos.org/registry/gles/extensions/APPLE/APPLE_texture_2D_limited_npot.txt,那么您会注意到它是根据 OpenGL ES 1.1 规范编写的。

于 2012-04-22T07:56:45.753 回答