2017-01-26 12 views
0

Я успешно привязываю 2 внешних OES-текстуры к моему шейдеру. Теперь я хочу, чтобы каждая текстура занимала 1/2 экрана (слева для одной текстуры справа для другого). Как мне это сделать? Пример: http://vicceskep.hu/kepek/vicces_funny_007445.jpg случайное изображение из googleAndroid/OpenGles рисует 2 внешних текстуры, каждая из которых занимает половину экрана. Левая и правая половина

Отображение полного изображения каждого изображения. Хорошо бы иметь эффективный метод для этого. Код, на который я ссылаюсь сейчас, - это код bikflake/grafika от github. Посетить http://bigflake.com/mediacodec/CameraToMpegTest.java.txt Чтобы проверить код.

Хорошо, я думаю, что действительно дам подробное разъяснение для моего вопроса, поскольку у меня нет большого знания о 3D проекциях в открытом GL. Извините за многочисленные изменения в вопросе. Это мой Vertex Shader код в настоящее время

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

http://bigflake.com/mediacodec/CameraToMpegTest.java.txt Это то, что я ссылаюсь на –

ответ

0

Да, я, наконец, получил его. Я использовал 2 разных программы для рисования и использования mTriangleVerticesData для редактирования пропорций изображения и использования gl_position для смещения изображения.

1

Вы можете сделать это так, как @Sung предложенное, но условные операторы и циклы в шейдерах, Especialy фрагмент, медленно. Лучше сделать два разных полигона.

+0

. Так что более эффективно рисовать в 2 отдельных программах? –

+0

Да, определенно более эффективно. – solidpixel

+0

Я не хочу глубоко погружаться в openGL, поскольку я только делаю масштабирование и преобразования. Я рисую это для вывода на внешнюю текстуру EGL, можно ли рисовать дважды? Было бы неплохо, если бы вы могли дать мне какой-нибудь код psuedo о том, как он будет работать, поскольку я действительно сильно потерял это. –