2016-06-28 34 views
1

スケーリングこの質問はある the original questionのフォローアップ、レンダリングされた画像は、拡大縮小にデフォルトのレンダリングバッファに戻って提供して表示する方法バージョン。のOpenGL ES FBO

-(void)setupFBO { 
glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 

glGenFramebuffers(1, &fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 
} 

最初のFBOにレンダリング:

-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect{ 

glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
glViewport (0, 0, 160, 144); 
glClearColor (1.0f, 0.0f, 0.0f, 0.5f); 
glClear (GL_COLOR_BUFFER_BIT); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex); 
glViewport(0, 0, 160, 144); 

glBindVertexArrayOES(_vertexArray); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

を私は結合FBOのコメントを解除した場合、四角が正しく表示され - ので、私はそのにVBOとVAOの問題はないと思います。メインビューに戻って結果を表示するために

試みは、画面に合わせてスケールアップ:

[((GLKView *) self.view) bindDrawable]; 
glViewport (0, 0, view.frame.size.width, view.frame.size.height); 
glClearColor (0.0f, 1.0f, 0.0f, 0.5f); 
glClear (GL_COLOR_BUFFER_BIT); 

//vb2 has the scaled vertex coordinates 
glBindBuffer(GL_ARRAY_BUFFER, vb2); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); 

//make sure we are not redrawing the same thing? the texture should be 
//a colored cube based on what the fbo rendered. 
glDisableVertexAttribArray(GLKVertexAttribColor); 

//create a buffer for the texture coordinates 
//should be moved in setup phase, but left in for testing 
glGenBuffers(1, &texBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, texBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*8, squareTex, GL_STATIC_DRAW); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0); 
//bind to the fbo texture 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

私が読んで続いてきたチュートリアルの一部

  1. OpenGL FBO Example
  2. Songho OGL FBO
  3. RTT

最終的に、私は(160x144ピクセル)のエミュレートされたGB画面が(高さ比を維持)シミュレータの全幅に表示します。

小さな正方形で始まり、ストレッチしてレトロな2乗ピクセル効果を実現しようとしています。

+0

使用しているOpenGL ESのバージョンは何ですか?少なくともES 2.0を必要とするコールだけでなく、ES 1.xでのみ有効なコールもあります。 –

+0

Es2、どちらが1.xのみですか?私が見つけたチュートリアルのほとんどは同じ呼び出しを持っています。 –

+0

'glEnable(GL_TEXTURE_2D)'はES 2.0では無効です。 –

答えて

1

ストレッチされたエフェクトを実現するには、テクスチャでフルスクリーンの矩形を描画するだけです。何行列が使用されていない場合は、単に三角形ストリップのために[-1,1]の範囲内の頂点位置データを設定する必要があります

{-1, -1, 
    1, -1, 
-1, 1, 
    1, 1} 

テクスチャ座標は、テクスチャサイズに元のテクスチャビューポートの比に依存しなければなりません。 160x144のご例えば最寄りの十分な大きさのテクスチャサイズのデータ​​は、これはあなたが任意の時点にあってもよいの問題を見つける必要があるでしょう、結果が表示されない場合はその座標が

{.0,  .0, 
ratio.x, .0, 
.0,  ratio.y, 
ratio.x, ratio.y} 

あるratio = (160/256, 144/256)になり256x256だろう。まず、この座標をソリッドカラーで描画し、矩形がフルスクリーンで描画されているかどうかを確認します。そうであれば、問題はFBOから受け取ったテクスチャの可能性が高いです。私があなたがXcodeを使って作業していると仮定してもよい場合は、フレームスナップショット(左下にあるツール)を作成して、フレームの任意のポイントですべての呼び出しとすべてのテクスチャを表示することです。テクスチャが正しく描画されているかどうかを確認することができます。

OpenGLエラー(glGetError)をチェックし、添付ファイルglCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETEの後にFBOバッファの状態をチェックすることを忘れないでください。

これはFBOを作成する私のプロジェクトの方法です。それはあなたにいくらか役に立つかもしれません。

glGenFramebuffers(1, &_frameBuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer); 

    glGenRenderbuffers(1, &_renderBuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer); 

    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, texture.textureWidth, texture.textureHeight); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer); 

    [texture bind]; 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.textureID, 0); 

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_bufferWidth); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_bufferHeight); 

    [GLGlobalTools checkFramebufferStatus]; 
    [GLGlobalTools checkError]; 

    _bufferWidthf = _bufferWidth; 
    _bufferHeightf = _bufferHeight; 

    _surfaceWidth = (GLint)texture.imageWidth; 
    _surfaceHeight = (GLint)texture.imageHeight; 
+0

だから、一度レンダリングがfboで行われると、それがiPhoneのビューにどのように表示されますか?このコードサンプルでは、​​読み取りピクセルを使用してテクスチャを作成し、そのテクスチャを使用しています。 http://www.dbfinteractive.com/forum/index.php?PHPSESSID=bdaae040c3657115f2014ebfed001f0f&topic=3357.msg45040#msg45040 –

+0

他のテクスチャと同じです。 FBOに接続されているテクスチャを使用して、ビューにあるメインバッファに描画します。 –

+0

私は問題のコードを更新しました - スケーリングした四角形を取得しますが、テクスチャはまだレンダリングされません。 –