テクスチャにレンダリングしようとしていて、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
が有効になっており、機能しています。
これを修正する方法に関するご提案はありますか?ありがとう!
"裏返し"の問題:前面に向いているプリミティブが選択されている場合、ファセットの法線を決定するために使用される頂点の順序付けに問題があります。私が何かを誤解していない限り、テクスチャリングの問題ではありません。 GL_CULL_FACEを有効にしていますか? – prideout
GL_CULL_FACEが有効になっていませんでした。これを有効にすると、全体的な外観が確実に向上します。オブジェクトの法線は今のところ正しい方法であるように見えますが、別の面で隠されているかどうかにかかわらず、隠されるべき正面に面する多くの面が表示されます。 三角形の巻き線に問題があることを示していますか?私はスクリプトを使ってBlenderから頂点をエクスポートしています。巻いたものが輸出されたときに巻いていることを確認します。私は画面に直接描画するとき、すべてが完璧に見えることを 注意(とGL_CULL_FACEがオフにされたりは違いはありません)。 –