iPhone (2G 以前) で OpenGL ES 1.1 を使用してテクスチャにレンダリングすることはできますか? テクスチャをレンダー バッファーとしてバインドする場合、POT サイズではないレンダー バッファーのサイズにする必要があります。ただし、OpenGL ES 1.1 ではテクスチャが POT である必要があります。
ES 1.1ではできないのでしょうか?
iPhone (2G 以前) で OpenGL ES 1.1 を使用してテクスチャにレンダリングすることはできますか? テクスチャをレンダー バッファーとしてバインドする場合、POT サイズではないレンダー バッファーのサイズにする必要があります。ただし、OpenGL ES 1.1 ではテクスチャが POT である必要があります。
ES 1.1ではできないのでしょうか?
OpenGL ES 1.1 は 2 のべき乗以外のテクスチャをサポートしていませんが、新しい iOS デバイス モデルには拡張子GL_APPLE_texture_2D_limited_npot
があり、次のように記述されています。
従来の OpenGL ES 1.X テクスチャリングは、2 のべき乗 (POT) 次元の画像に制限されていました。APPLE_texture_2D_limited_npot 拡張機能は、2D テクスチャのこれらのサイズ制限を緩和します。サポートされている場合、制限はキューブ マップと 3D テクスチャに対して引き続き適用されます。
この拡張によって導入される追加の手続き型または列挙型 API はありませんが、拡張文字列をエクスポートする実装により、アプリケーションは 2 の累乗である場合とそうでない場合がある 2D テクスチャ ディメンションを渡すことができます。
これらの制限を解除する OES_texture_npot がない場合、CLAMP_TO_EDGE 以外のミップマッピングもラップ モードも、NPOT 2D テクスチャと組み合わせてサポートされません。CLAMP_TO_EDGE ではないラップ モードまたは NEAREST または LINEAR ではない minfilter を持つ NPOT 2D テクスチャは、不完全と見なされます。そのようなテクスチャがテクスチャ ユニットにバインドされている場合、そのテクスチャ ユニットに対してテクスチャ マッピングが無効になっているように見えます。
次のコードを使用して、この拡張機能がデバイスでサポートされているかどうかを確認できます (Philip Rideout の優れたiPhone 3D プログラミングブックから抜粋)。
const char* extensions = (char*) glGetString(GL_EXTENSIONS);
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
これらのデバイスでは、適切なテクスチャ ラッピングを設定する限り、2 のべき乗でないテクスチャを使用できるはずです。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
残念ながら、 2 のべき乗でないテクスチャにレンダリングするこのサンプル アプリケーションは OpenGL ES 2.0 を使用しているため、この場合に役立つかどうかはわかりません。
それは可能です。あなたがする必要があるのは、非 POT より大きい次の 2 の累乗を取得することだけです。
次に、フレーム バッファを生成します。
GLuint aFramebuffer;
glGenFramebuffersOES(1, &aFramebuffer);
そしてテクスチャ:
GLuint aTexturebuffer;
glGenTextures(1, &aTexturebuffer);
次に、次のような同じテクスチャを実行します。
glBindTexture(GL_TEXTURE_2D, aTexturebuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glColor4ub(0, 0, 0, 255);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
int area[] = {0.0, 0.0, renderWidth, renderHeight};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, area);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, aFramebuffer);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, aTexturebuffer, 0);
ここでは draw_texture 拡張機能を使用しました。
textureWidth
とtextureHeight
は 2 の累乗で、renderWidth
とrenderHeight
はレンダリングの幅と高さです。次にバインドするaFramebuffer
と、テクスチャに描画されます。