0

私はビデオをレンダリングするためのコードをいくつか持っているので、その OpenGL 側 (レンダリングされたフレームがターゲット テクスチャで使用可能になった後) は非常に単純です。それをターゲットの四角形にレンダリングするだけです。

少し複雑なのは、サードパーティの SDK を使用して UI をレンダリングしているため、それがどのような状態変化をもたらすかがわからないため、フレームをレンダリングするたびに、必要なすべての状態を確認する必要があることです。正しく設定してください。

頂点とテクスチャ座標バッファーを使用して、次のように四角形を描画しています。

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_RECTANGLE_ARB);            
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texHandle);            
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );            
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glVertexPointer(4, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, 4);
glPopClientAttrib();

(スキップできるものはありますか? UI ライブラリ内で何が起こっているのかわからなくても?)

今、私は疑問に思います-そして、これはより理論的なものであり、1つのクワッドを描画するだけでは大きな違いはないと思います-理論的には、上記のようにレンダリングする方が速いか、代わりに単純なデフォルトの頂点とフラグメントシェーダーを書くか位置に ftransform() を返すだけで、フラグメントの色にもデフォルトの方法を使用しますか?

シェーダーを使用することで、特定の状態変化をスキップしたり、全体的にスピードアップしたりできるのではないかと思います。または、上記のコード OpenGL を内部的に使用すると、結果はまったく同じになりますか?

4

1 に答える 1

2

UI SDK の状態を破壊することが心配な場合は、コードを glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT) ... glPopAttrib() でラップする必要があります。

頂点配列オブジェクトを使用すると、状態管理コードを少し簡略化できます。

シェーダーの使用に関しては、この単純なプログラムでは気にしません。保存して復元する必要があるのは、もう 1 つの状態であり、内部的に OpenGL が同じ結果を得るためにおそらくそれを行っていることは間違いありません。

物事のスピードアップについて: パフォーマンスは数十を送信するコストによって支配されるでしょうか? 何百?キロバイトのビデオ フレーム データを GPU に送信し、OpenGL 呼び出しを追加または削除しても違いが生じる可能性はほとんどありません。最初に、UI とビデオ ストリームのフレーム レートの違いの可能性を調べます。たとえば、フレーム レートの方が速い場合は、UI が再生されるたびにビデオ データをコピーするのではなく、ビデオ データを一度コピーして再利用するように調整します。再描画。

お役に立てれば。

于 2012-05-21T07:11:32.373 に答える