OpenGL ES 2.0でテクスチャを2D背景として描画するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4036737

  •  26-09-2019
  •  | 
  •  

質問

OpenGL ES 2.0 を使い始めたばかりです。簡単な 2D 出力を作成したいと考えています。解像度が 480x800 の場合、背景テクスチャを描画するにはどうすればよいでしょうか?

[私の開発環境は Java / Android なので、それに直接関係する例が最適ですが、他の言語でも問題ありません。]

役に立ちましたか?

解決

Android を使用している場合でも、受信するビデオのフレームに対してこれを行う iPhone サンプル アプリケーションを作成しました。このサンプルのコードは次からダウンロードできます。 ここ. 。ライブビデオを使用してカラーベースのオブジェクト追跡を行うこのアプリケーションについての記事がありますので、読んでください。 ここ.

このアプリケーションでは、2 つの三角形を描画して長方形を生成し、次の座標を使用してテクスチャを作成します。

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

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

ビデオ フレームをテクスチャとしてパススルーするには、次の頂点シェーダーを備えた単純なプログラムを使用します。

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main()
{
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
}

そして次のフラグメント シェーダ:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, textureCoordinate);
}

描画は適切なプログラムを使用するだけで簡単に行えます。

glUseProgram(directDisplayProgram);

テクスチャの均一性を設定する:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, videoFrameTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

属性の設定:

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

そして三角形を描きます。

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

他のヒント

そしてそれにテクスチャを設定します。

あなたは本当に代わりに、あなたが四角形を描く(四角形を形成する2つの三角形のか、もっと正確に)、背景を描画しません。これは、画面上の任意の他のオブジェクトを描画するから、すべてでは違いはありません。

これがどのように行われるかを示す場所がたくさんありますが、多分これを示すにもAndroidのプロジェクト例があります。

トリッキーな部分は、何か他のか、前後にディスプレイに何かを得ています。このために仕事に、あなたは深度バッファを設定し、詳細なテスト(glEnableです(GL_DEPTH_TEST))を有効にする必要があります。そして、あなたの頂点はZ座標(と自分の頂点は2を、三つの値で構成されていないことをglDrawElementsを伝える)持っている必要があります。

そうしない場合は、

は、オブジェクトが順番にレンダリングされます彼らのglDrawElements()関数は(あなたは残りの部分を不明瞭になってしまいます最後の描き方の意味)と呼ばれています。

私のアドバイスは、あなたがそれのこつを得るまで何も空想を背景イメージを持っているか、しないことです。 OpenGL ES 2.0は一種急な学習曲線を持っており、ESのチュートリアルは、彼らは単に持っていない2.0 gluPerspectiveで、のようなヘルパー関数を使用することができますので、仕事に3Dを取得していない、本当に助けを行う1.X。何の背景にある三角形の作成を開始します。次に、それ平方します。あなたは既に空想に行きたい場合はその後、テクスチャを追加。位置と遊びます。あなたの頂点のZ値を変更したときに何が起こるかを参照してください。 (ヒント:ない多く、あなたは透視投影を持っていない場合、それはまだ何もないかのように思えますので、オブジェクトは、遠く、彼らが離れている小さくなりませんが、その後も深さテストが有効になっているとそうでない場合。起こった)

数日後、それは停止し、主に、そのイライラをくそー、あなたは最終的に「それを得る」されてます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top