2017-01-26 6 views
0

2つの外部OESテクスチャをシェーダに正常にバインドしました。今度は、それぞれのテクスチャを画面の1/2にする必要があります。それをどうやってやるの?例: http://vicceskep.hu/kepek/vicces_funny_007445.jpg Googleからのランダム画像Android/OpenGlesはそれぞれ画面の半分を占める2つの外部テクスチャを描画します。左と右の半分

各画像の全体像を表示します。それを行う効率的な方法を持つことはいいことです。私が現在参照しているコードは、githubのbikflake/grafikaコードです。 訪問http://bigflake.com/mediacodec/CameraToMpegTest.java.txt コードをチェックする。

私は実際にオープンGLの3D投影についての知識があまりないので、私は本当に私の質問の明確な説明を与えると思います。質問に多数の編集をして申し訳ありません。 これは私の頂点シェーダコードで、現在

private static final String VERTEX_SHADER = 

     // UMVPMATRIX IS AN IDENTITY MATRIX 
     "uniform mat4 uMVPMatrix;\n" + 
     //These are surfacetexture.getTransformationMatrix 
     "uniform mat4 uSTMatrixOne;\n" + 
     "uniform mat4 uSTMatrixTwo;\n" +   

     "attribute vec4 aPosition;\n" + 
     "attribute vec4 aTextureCoord;\n" + 

     "varying vec2 vTextureCoord;\n" + 
     "varying vec2 vTextureCoordTwo;\n" + 
     "void main() {\n" + 
     " gl_Position = uMVPMatrix * aPosition;\n" + 
     " vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" + 
     " vTextureCoordTwo = (uSTMatrixTwo* aTextureCoord).xy ;\n" + 
     "}\n"; 

これは、現在のオーバーレイを行い、現在、私のフラグメントシェーダコードです。

 private static final String FRAGMENT_SHADER = 
     "#extension GL_OES_EGL_image_external : require\n" + 
     "precision mediump float;\n" +  // highp here doesn't seem to matter 
     "varying vec2 vTextureCoord;\n" + 
     "varying vec2 vTextureCoordTwo;\n" + 
     "uniform samplerExternalOES sTextureOne;\n" + 
     "uniform samplerExternalOES sTextureTwo;\n" + 

     "void main() {\n" + 
     " lowp vec4 pixelTop = texture2D(sTextureOne, vTextureCoord);\n" + 
     " lowp vec4 pixelBot = texture2D(sTextureTwo, vTextureCoordTwo);" + 

       " gl_FragColor = pixelTop + pixelBot;\n" + 
     "}\n"; 

aPositionとテクスチャ座標は、現在参照されています。誰かがmTraingleVerticesDataがどのように機能するか説明してくれればいいと思います。

private final float[] mTriangleVerticesData = { 

     // X, Y, Z, U, V 
     -1.0f, -1.0f, 0, 0.f, 0.f, 
     1.0f, -1.0f, 0, 1.f, 0.f, 
     -1.0f, 1.0f, 0, 0.f, 1.f, 
     1.0f, 1.0f, 0, 1.f, 1.f, 
}; 
    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 
      TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 
    checkGlError("glVertexAttribPointer maPosition"); 
    GLES20.glEnableVertexAttribArray(maPositionHandle); 
    checkGlError("glEnableVertexAttribArray maPositionHandle"); 

    mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); 
    GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 
      TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 

マイ2外部投影あなたはそれを@Sungが提案方法が、シェーダで条件文やループ、especialyフラグメントを行うことができ、現在

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); 

    //Cam Code 
    //Set texture to be active 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTwoTextureID); 
+0

http://bigflake.com/mediacodec/CameraToMpegTest.java.txt これは私が –

答えて

0

私はついにそれを手に入れました。イメージの比率を編集し、gl_positionを使って画像を移動するには、2つの異なるプログラムを使用してmTriangleVerticesDataを使いました。

1

を結合、遅いです。 2つの異なるポリゴンをレンダリングする方が良いです。

+0

から参照しているものです。したがって、2つの別々のプログラムで描画する方が効率的ですか? –

+0

はい、確かに効率的です。 – solidpixel

+0

私はスケーリングと変換だけをしているので、OpenGLに深く没頭したくありません。私はこれを外部のEGLテクスチャに出力するように描画していますが、それでも2回描画することは可能ですか?私が実際にこれで失われたように、あなたはそれがどのように動作するかについての擬似コードを私に与えることができればいいです。 –

関連する問題