2

852x640のレンダリングバッファと1280x720のテクスチャがあります。テクスチャをレンダリングすると、引き伸ばされるだけでなく、トリミングされます。アスペクト比を修正する必要があることはわかっていますが、フルテクスチャがレンダーバッファに表示されるようにするにはどうすればよいですか?

//-------------------------------------
    glGenFramebuffers(1, &frameBufferHandle);
    glBindFramebuffer(GL_FRAMEBUFFER, frameBufferHandle);

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

    [oglContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &renderBufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &renderBufferHeight);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBufferHandle);
//-------------------------------------


static const GLfloat squareVertices[] = {
    -1.0f, 1.0f,
    1.0f, 1.0f,
    -1.0f,  -1.0f,
    1.0f,  -1.0f
};

static const GLfloat horizontalFlipTextureCoordinates[] = {
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f,  0.0f,
    1.0f,  0.0f,
};

size_t frameWidth = CVPixelBufferGetWidth(pixelBuffer);
size_t frameHeight = CVPixelBufferGetHeight(pixelBuffer);

CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, 
                                                            videoTextureCache,
                                                            pixelBuffer,
                                                            NULL,
                                                            GL_TEXTURE_2D,
                                                            GL_RGBA,
                                                            frameWidth,
                                                            frameHeight,
                                                            GL_BGRA,
                                                            GL_UNSIGNED_BYTE,
                                                            0,
                                                            &texture);


if (!texture || err) {
    NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);  
    return;
}

glBindTexture(CVOpenGLESTextureGetTarget(texture), CVOpenGLESTextureGetName(texture));

glViewport(0, 0, renderBufferWidth, renderBufferHeight); // setting this to 1280x720 fixes the aspect ratio but still crops

glBindFramebuffer(GL_FRAMEBUFFER, frameBufferHandle);

glUseProgram(shaderPrograms[PASSTHROUGH]);

// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, horizontalFlipTextureCoordinates);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// Present
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferHandle);
[oglContext presentRenderbuffer:GL_RENDERBUFFER];

編集

私はまだ問題に直面しています。より多くのソースを含めました。基本的に、生のテクスチャ全体をワイドスクリーンで表示すると同時に、生のテクスチャをディスクに書き込む必要があります。

より小さなテクスチャにレンダリングする場合、物事は自動的にスケーリングされますが、これはレンダーバッファの場合ではありませんか?

小さなテクスチャに別のパススルーを作成できると思いますが、それでは処理が遅くなります。

4

4 に答える 4

2

まず第一に、を維持glViewport(0, 0, renderBufferWidth, renderBufferHeight);852x640ます。問題はあなたにありますsquareVertices-それはテクスチャサイズを表す座標を保持しているように見えます。レンダーバッファサイズと同じに設定する必要があります。

アイデアは、テクスチャがあなたのsquareVerticesrectにマッピングされるということです。したがって、任意のサイズのrectにマップされた任意のサイズのテクスチャをレンダリングできます。テクスチャ画像は、rectに合わせて拡大縮小されます。

[更新:正方形の頂点]

あなたの場合、それは次のようになります。

{
0.0f, (float)renderBufferWidth/frameHeight,
(float)renderBufferWidth/frameWidth, (float)renderBufferHeight/frameHeight,
0.0f,  0.0f,
(float)renderBufferWidth/frameWidth,  0.0f,
};

しかし、これは一般的に良い解決策ではありません。理論から、画面上の長方形のサイズは、頂点の位置と変換行列によって決定されます。画面にレンダリングする前に、各頂点に行列が乗算されます。OpenGLプロジェクションマトリックスを設定していないようです。正しい正射影を使用すると、頂点はピクセルと同等の位置になります。

于 2012-09-18T06:51:51.227 に答える
0

私はOpenGLを初めて使用するので、マップするテクスチャは2 x 2の累乗である必要があることを覚えています。たとえば、画像の解像度は... 256x256、512x512である必要があります。次に、gl.glScalef(x、y、z);を使用して画像を拡大縮小できます。要件に応じて機能します。それに応じて高さと幅を取得し、これらをscalef関数に入れます。これを試してください、私はこれがうまくいくことを願っています。

于 2012-09-19T19:37:45.023 に答える
0

これらの機能を試してください。私の答えはinfo@songhoa.ca.comから検証することができます

glGenFramebuffers()
  • void glGenFramebuffers(GLsizei n、GLuint * ids)

    • 作成するフレームバッファの数
  • void glDeleteFramebuffers(GLsizei n、const GLuint * ids)

    • 多数のIDを格納するためのGLuint変数または配列へのポインター。未使用のフレームバッファーオブジェクトのIDを返します。ID 0は、デフォルトのフレームバッファを意味します。これは、ウィンドウシステムが提供するフレームバッファです。

FBOはglDeleteFramebuffers()、使用されなくなったときに呼び出すことで削除できます。

glBindFramebuffer()

FBOを作成したら、使用する前にバインドする必要があります。

  • void glBindFramebuffer(GLenum target、GLuint id)

    • 最初のパラメータは次のとおりです。ターゲットはGL_FRAMEBUFFERである必要があります。

    • 2番目のパラメーターは、フレームバッファーオブジェクトのIDです。

FBOがバインドされると、すべてのOpenGL操作が現在バインドされているフレームバッファオブジェクトに影響を与えます。オブジェクトID0は、デフォルトのウィンドウシステムが提供するフレームバッファ用に予約されています。したがって、現在のフレームバッファ(FBO)のバインドを解除するには、でID0を使用しますglBindFramebuffer()


それらを使用してみるか、少なくともあなたに大いに役立つかもしれないリンクにアクセスしてください。申し訳ありませんが、私はOpenGLの経験がありませんが、リンクを提供し、2つの機能について説明したいと思います。この情報を使用してコードを記述できると思います。

于 2012-09-24T03:22:22.093 に答える
0

おやおや、答えはこれがずっと働いていたということです;)iPhone 4の高解像度プリセットモードは、実際には中解像度プリセットよりも少ない領域をカバーしていることがわかりました。これにより、Brigadirが最初に何をすべきかを提案し、GPUスナップショットを確認するまで、ループに陥りました。

GPUImageフレームワークで適切なコードをハッキングすることで、アスペクト比の問題も理解しました。https://github.com/bradLarson/GPUImage

于 2012-09-25T09:20:49.870 に答える