3

私のiOSゲームでは、メモリを節約するために使用可能な場合はGL_APPLE_texture_2D_limited_npot拡張機能を使用したいと思います(ゲームにはNPOTテクスチャがあり、現在の実装では、2の累乗にするためにパディングを追加しています)。

iPad(第1世代)でテストしています。私がこれまで読んだことはすべて、OpenGLES2をサポートするすべてのiOSデバイス(iPadを含む)がGL_APPLE_texture_2D_limited_npotもサポートしていることを示しています(私のゲームはOpenGLES2を使用しているので非常に良いです)。iPadでテストしましたが、サポートされています(ラップを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)で表示されないのはなぜですか?それをチェックする適切な方法は何ですか?すべてのOpenGLES2iOSデバイスは本当にそれをサポートしていますか?

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 のいずれかが 0 より小さい場合、エラー INVALID_VALUE が生成されます。2 次元テクスチャ イメージの最大許容幅と高さは、レベル 0 から k までのイメージ配列の場合、少なくとも 2k-lod でなければなりません。ここで、k は MAX_TEXTURE_SIZE の対数底 2 です。lod は画像配列の詳細レベルです。k より大きい任意の詳細レベルのイメージ配列の場合はゼロになる場合があります。指定されたイメージが大きすぎて保存できない場合、エラー INVALID_VALUE が生成されます。

2 のべき乗の制限 (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 に答える