【问题标题】:Android/OpenGles drawing 2 external texture each taking half of the screen. Left and right halfAndroid/OpenGles 绘制 2 个外部纹理,每个纹理占据屏幕的一半。左右半边
【发布时间】:2017-06-11 15:22:08
【问题描述】:

我已成功将 2 个外部 OES 纹理绑定到我的着色器。现在我希望每个纹理占据屏幕的 1/2(左边是一个纹理,右边是另一个)。我该怎么做呢?例子: http://vicceskep.hu/kepek/vicces_funny_007445.jpg 来自谷歌的随机图片

显示每张图片的完整图片。有一种有效的方法来做到这一点会很好。我目前引用的代码是来自 github 的 bikflake/grafika 代码。 访问http://bigflake.com/mediacodec/CameraToMpegTest.java.txt 检查代码。

好的,我想我真的会深入澄清我的问题,因为我对 open 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 个外部投影绑定

    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);

【问题讨论】:

标签: android opengl-es opengl-es-2.0 surface egl


【解决方案1】:

您可以按照@Sung 建议的方式进行操作,但着色器中的条件语句和循环,尤其是片段,速度很慢。最好渲染 2 个不同的多边形。

【讨论】:

  • 那么在2个单独的程序中绘制效率更高?
  • 是的,效率肯定更高。
  • 我不想深入研究 openGL,因为我只是在做缩放和转换。我正在绘制这个以输出到外部 EGL 纹理是否仍然可以绘制两次?如果你能给我一些关于它如何工作的伪代码会很好,因为我真的很迷茫。
【解决方案2】:

是的,我终于明白了。我使用了 2 个不同的程序进行绘制,并使用 mTriangleVerticesData 编辑图像比例并使用 gl_position 移动图像。

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多