12

iPhone (2G 以前) で OpenGL ES 1.1 を使用してテクスチャにレンダリングすることはできますか? テクスチャをレンダー バッファーとしてバインドする場合、POT サイズではないレンダー バッファーのサイズにする必要があります。ただし、OpenGL ES 1.1 ではテクスチャが POT である必要があります。

ES 1.1ではできないのでしょうか?

4

2 に答える 2

27

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 を使用しているため、この場合に役立つかどうかはわかりません。

于 2011-01-21T16:51:42.623 に答える
2

それは可能です。あなたがする必要があるのは、非 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 拡張機能を使用しました。 textureWidthtextureHeightは 2 の累乗で、renderWidthrenderHeightはレンダリングの幅と高さです。次にバインドするaFramebufferと、テクスチャに描画されます。

于 2011-01-21T15:32:11.030 に答える