2012-03-03 18 views
1

OpenGL ES 1.1テクスチャを作成しようとしています。画面にレンダリングされたオフスクリーンレンダリング画面上に空の矩形をレンダリングする

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

GLuint texFrambuffer; 
glGenFramebuffers(1, &texFrambuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, texFrambuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; 
if(status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"failed to make complete framebuffer object %x", status); 
    // this message doesn't appear, thus, framebuffer is complete 
} 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

GLfloat vertices[] = { 
    10.0f, 10.0f, 0.0f, 
    20.0f, 40.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDeleteFramebuffers(1, &texFrambuffer); 

がシーンにテクスチャをレンダリング:テクスチャ準備

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture); 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
GLshort texCoord[] = {0, 0, 0, 1, 1, 0, 1, 1}; 
GLfloat vertices2[] = {0.0, 0.0, 0.0, 31.0f, 31.0f, 0.0f, 31.0f, 31.0f}; 
glVertexPointer(2, GL_FLOAT, 0, vertices2); 
glTexCoordPointer(2, GL_SHORT, 0, texCoord); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glDisable(GL_TEXTURE_2D); 

完全なソースコードはのBitbucketで公開されています。https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m

あり、他のコンテンツが正しくレンダリングされます。問題はこのテクスチャのみであり、白い四角形としてレンダリングされます。

私は多くの例を研究しましたが、私が間違っていることをまだ理解できません。何が欠けている?


アップデート1:私はglClearColor()を設定し、texFrambufferがバインドされている間、これらの変更は、私のテクスチャに保存されているglClear()を呼び出す場合、私は、気づきました。したがって、glDrawArrays()および/または関連するものに問題があります。

texFrambufferのマトリックスモードと投影を設定する必要がありますか?


アップデート2:私はテクスチャに「メイン」フレームバッファからコンテンツをコピーするglCopyTexImage2Dを使用することも試してみました。

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.75f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
GLfloat vertices[] = { 
    0.0f, 0.0f, 0.0f, 
    20.0f, 32.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindTexture(GL_TEXTURE_2D, texture); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0); 
のBitbucketで入手可能

完全なソースコード:https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m

結果は同じです。塗りつぶされた矩形のみ。私の行列には間違いなく問題があるようです。

+0

あなたはglGenFramebuffersOES、glBindFramebufferOESなどを使用していません...コアではなくOES関数ですか? ES 1.1にはフレームバッファオブジェクトがコアに含まれていないため、拡張として使用できます。 –

+0

AppleがAPIを統合したようです。 OESを使用し、OESを使用しない方法を使用する違いはありません。 –

+0

あなたは一体どういう意味ですか? Appleのドキュメントにも書かれています:https://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW6フレームバッファオブジェクトはiOSの唯一のレンダリングターゲットです).GLES 1.1では、OES_framebuffer_object拡張を使用する必要があります。 –

答えて

0

問題は行列です。デフォルトでは、投影行列は同一性です。したがって、(-1、-1) - (+ 1、+ 1)の座標をビューポートに与えます。ほとんどの場合、(0,0) - (32,32)正方形への正射投影が必要です。