0

YUV イメージのストリームを RGB に変換してレンダリングしようとして、iOS で初めて OpenGL を使用しようとしています。Apple の GLCameraRipple サンプル コードで提供されている頂点/フラグメント シェーダーを使用する予定です。変換を実行するために必要な計算を理解しています。OpenGL API と、画面上に 2D テクスチャを簡単に描画する方法を理解するのに苦労しています。

OpenGL を使用してテクスチャを描画するために必要な高レベルの手順を誰かが説明できますか? 概念的に何をする必要があるかを理解すれば、詳細を理解できると思います。

私がこれまでに理解していることから、頂点シェーダーはフラグメントシェーダーの前にトリガーされ、頂点シェーダーは頂点で動作し、フラグメントシェーダーはその間のすべてで動作します。可変キーワードは、頂点間で補間されたデータをフラグメント シェーダーに送信するために使用されます。

これにより、いくつかの疑問が生じます。

  • テクスチャの 2D フレームを表す一連の頂点を渡す必要がありますか?
  • 頂点を渡す前に YUV データをフラグメント シェーダーに渡す必要がありますか?
  • フラグメント シェーダーは、補間された座標を使用して適切な YUV サンプルにアクセスするにはどうすればよいですか?
  • 最終結果にアクセスするにはどうすればよいですか?
  • 適切なデータをシェーダーに渡した後、操作をトリガーするにはどうすればよいですか?

御時間ありがとうございます。

4

2 に答える 2

0

テクスチャーを描くことができました。UVチャネルで色が正しく表示される問題と、方向/ミラーリングの問題が発生していますが、これらの問題はこの質問の範囲外です。

テクスチャの2Dフレームを表す頂点のセットを渡す必要がありますか?

はい、テクスチャはポリゴンの上に描画する必要があり、2D領域は2つの三角形として表すことができます。頂点バッファオブジェクト(VBO)を使用して、頂点の配列と、インデックスを含む補完的な配列を頂点の配列に渡すことができます。このデータは、OpenGLがポリゴンを描画するために使用できます。関数、、、glGenBuffersおよびglBindBufferglBufferData使用して、この情報をOpenGLに渡すことができます。

このページはそれをうまく説明しています:http ://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial

頂点を渡す前に、YUVデータをフラグメントシェーダーに渡す必要がありますか?

いいえ、テクスチャがロードされる前に頂点をOpenGLに渡すことができます。ただし、ポリゴンを描画する前に、テクスチャをバインドしてOpenGLにアップロードする必要があります。

フラグメントシェーダーは、補間された座標を使用して適切なYUVサンプルにアクセスするにはどうすればよいですか?

私の実装では、各頂点で、対応するテクスチャ座標が渡されます。これにより、頂点位置からテクスチャ座標へのマッピングが作成されます。頂点シェーダーは、この座標をvaryingパラメーターとして出力します。キーワードを使用varyingすると、フラグメントシェーダーは、補間を介して各ピクセルの座標値を受け取ることができます。次に、フラグメントシェーダーはこの座標を使用して、対応するテクスチャサンプルを取得します。私の場合、座標を使用してYUVサンプルを取得します。

最終結果にアクセスするにはどうすればよいですか?

一般に、操作の最終結果はフレームバッファーにプッシュされます(詳細についてはよくわかりません)。GLKViewを使用するiOS5以降ではpresentRenderbuffer、結果を表示するためにEAGLContextインスタンスでメッセージを送信します。

適切なデータをシェーダーに渡した後、操作をトリガーするにはどうすればよいですか?

描画は、OpenGL描画関数の1つによってトリガーされます。頂点/テクスチャ座標とテクスチャデータがOpenGLにアップロードされ、シェーダーのパラメーターに関連付けられた後、このglDrawElements関数を使用してポリゴンを描画し、テクスチャを上にレンダリングしました。

于 2013-03-06T03:07:25.673 に答える
0

たとえば、基本的な OpenGL チュートリアルhttp://www.cs.washington.edu/education/courses/cse557/00wi/projects/impressionist/help.html をお勧めします。Kronos グループの opengl.org サイトも参照してください。

OpenGL で画面にイメージをペイントする標準的な方法は、テクスチャとしてコード化されたイメージを使用して、2 つのテクスチャ付き三角形 (1 つの長方形) を描画することです。頂点シェーダーは非常に標準化されており、あまり変更されない傾向があります (99% のケース)。波紋や色空間変換などの画像処理は、すべてピクセル シェーダーで行われます。

于 2013-03-06T00:19:00.257 に答える