2009-10-30 7 views
7

テクスチャにレンダリングしようとしていて、iPhoneでOpenGL ESを使用してそのテクスチャを画面に描画しています。私は開始点としてthis questionを使用しており、AppleのデモEAGLViewのサブクラスで描画を行っています。OpenGL ESがテクスチャにレンダリングされてからテクスチャを描画します

インスタンス変数:

GLuint textureFrameBuffer; 
Texture2D * texture; 

は、フレームバッファとテクスチャを初期化するために、私はこれをやっている:

GLint oldFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); 

// initWithData results in a white image on the device (works fine in the simulator) 
texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"blank320.png"]]; 

// create framebuffer 
glGenFramebuffersOES(1, &textureFrameBuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 

// attach renderbuffer 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0); 

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    NSLog(@"incomplete"); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO); 

を今、私は単にいつものように画面に自分のシーンを描く場合は、それを

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// draw some triangles, complete with vertex normals 
[contentDelegate draw]; 
[self swapBuffers]; 

しかし、私は「textureFrameBuffer」にレンダリングする場合は、画面に「テクスチャ」を描き、その結果イム:正常に動作します年齢は逆さまになっており、「内側に」あります。つまり、3次元オブジェクトの法線が外側ではなく内側を指しているかのように見えます。各オブジェクトの最前面が透明で、背面の内側を見ることができます。

GLint oldFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// draw some polygons 
[contentDelegate draw]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glColor4f(1, 1, 1, 1); 
[texture drawInRect:CGRectMake(0, 0, 320, 480)];  
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 

[self swapBuffers]; 

私は(にTexture2DのdrawInRect方法で)に応じて座標(glTexCoordPointer)を並べ替えることにより、容易に十分な画像rightsideアップを反転させることができますが、それは、「インサイドアウト」の問題を解決しない:ここではコードです。

Texture2Dテクスチャを手動で作成したOpenGLテクスチャで置き換えようとしましたが、結果は同じでした。 PNG画像から読み込まれたTexture2Dを描画するとうまくいきます。

オブジェクトを描画する場合、各頂点には単位標準が指定されており、GL_NORMALIZEが有効です。

glVertexPointer(3, GL_FLOAT, 0, myVerts); 
glNormalPointer(GL_FLOAT, 0, myNormals); 
glDrawArrays(GL_TRIANGLES, 0, numVerts); 

すべてが画面に表示されるときに細かく描画されます。 GL_DEPTH_TESTが有効になっており、機能しています。

これを修正する方法に関するご提案はありますか?ありがとう!

+0

"裏返し"の問題:前面に向いているプリミティブが選択されている場合、ファセットの法線を決定するために使用される頂点の順序付けに問題があります。私が何かを誤解していない限り、テクスチャリングの問題ではありません。 GL_CULL_FACEを有効にしていますか? – prideout

+0

GL_CULL_FACEが有効になっていませんでした。これを有効にすると、全体的な外観が確実に向上します。オブジェクトの法線は今のところ正しい方法であるように見えますが、別の面で隠されているかどうかにかかわらず、隠されるべき正面に面する多くの面が表示されます。 三角形の巻き線に問題があることを示していますか?私はスクリプトを使ってBlenderから頂点をエクスポートしています。巻いたものが輸出されたときに巻いていることを確認します。私は画面に直接描画するとき、すべてが完璧に見えることを 注意(とGL_CULL_FACEがオフにされたりは違いはありません)。 –

答えて

3

興味深いのは、バックバッファに直接描画するときに別の結果が表示されていることです。あなたがiPhoneプラットフォーム上にいるので、バックバッファに描画しているときでも、です。はFBOに描画されます。

オフスクリーンFBOにデプスバッファが接続されていることを確認してください。初期化コードでは、のglBindFramebufferOES(...)の直後に次のスニペットを追加することができます。

+0

(以前のように)あなたが何かに上かもしれないが、それはまだ働いていない...それを行うとテクスチャを取り付けた後、glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OESを返します。 frameBufferにはカラーレンダリングバッファーが必要ですか? (すぐに試しましたが、運はまだありませんが、私はそれを続けます。)途中で助けてくれてありがとう、本当に感謝しています。 –

+0

ああ、私は(すべてはそれが必要な方法を描く)画像作品を表示し、その後glCopyTexSubImage2Dを使用して、私のイメージにコピーし、その後、バックバッファにレンダリングする、それだけで痛々しいほど遅いことを追加することを意味しました。私のバッファに何が間違っているかを理解することに戻る... –

+0

興味深い。はい、カラーレンダリングバッファを添付する必要があります。ところで が、これは関係ありませんが、あなたはそれが古いのiPhoneで動作するようにあなたのテクスチャオブジェクトは2のべき乗の大きさを持っていることを確認したい場合があります。 幸い! – prideout

関連する問題