2011-01-21 9 views
12

iPhone(2Gおよびそれ以前)でOpenGL ES 1.1を使用してテクスチャにレンダリングすることはできますか?レンダリングバッファとしてテクスチャをバインドする場合は、レンダリングバッファのサイズにする必要があります。これはPOTサイズではありません。しかし、OpenGL ES 1.1では、テクスチャをPOTにする必要があります。iPhoneの非2のテクスチャへのレンダリング

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

答えて

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にバインドすると、テクスチャが描画されます。

+0

残念ながら、動作しません。 glCheckFramebufferStatusOESはGL_FRAMEBUFFER_INCOMPLETE_DIMENSIONSを返します。 – GhassanPL

+0

@Kronikarz:レンダバッファも作成しましたか? 'glRenderbufferStorageOES(GL_RENDERBUFFER_OES、GL_RGBA8_OES、width、height);'のように、フレームバッファに接続しますか? –

+0

@ Kronikarz:私の経験では、サイズを切り上げることなく、POT以外のテクスチャにもレンダリングできるはずです。 –

26

の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テクスチャがサポートされている場合は、 の制限がそのまま残ります。

又は 電源であってもなくてもよい 拡張文字列をエクスポート 実装は アプリケーションが2Dテクスチャ 寸法に通過することを可能にすることを除いて、この 拡張によって導入追加の手順または enumerant APIはありません2つの。これらの制限を持ち上げるOES_texture_npot、 が存在しない場合には

、 ミップマッピングやラップでもないモードCLAMP_TO_EDGE以外 がNPOT 2Dテクスチャと一緒に をサポートしています。 CLAMP_TO_EDGEでないラップモード のNPOT 2Dテクスチャ、またはNEARESTでない ミニフィルタ、または LINEARは不完全とみなされます。 そのようなテクスチャがテクスチャ ユニットにバインドされている場合、そのテクスチャユニットに対してテクスチャマッピング が無効になっているかのようになります。

あなたはこの拡張機能は、(フィリップRideoutの優れたiPhone 3D Programming本から引き出される)お使いのデバイスでサポートされているかどうかを判断するために、次のコードを使用することができます。これらのデバイスで

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のべき乗のテクスチャにレンダリングする私が持っているthis example applicationは、OpenGLを使用していますES 2.0では、この場合に役立つかどうかはわかりません。

+9

拡張文字列内の拡張名を調べるには* strstr *を使用しないでください。これにより、同じ接頭辞で始まる別の拡張が誤って解釈されないようにすることはできません。あなたが* GL_ARB_shadow_ambient *を持っていれば、strstrを使って* GL_ARB_shadow *をチェックするとあなたが噛み付くと言います。私は、ソフトウェアアップデートがドライバに新しいGL拡張をもたらし、リリース後にコードを壊してしまったときに、かつては噛まれていました。 – rotoglup

+0

@rotoglup - それは大きなポイントです。私が言ったように、これはPhilip Rideoutの本から書かれたコードです。おそらくあなたは彼に本の正誤表のための何かを書くかもしれません。 –

+0

が完了しました。これに言及するには、Philipにメールを送ってください;) – rotoglup