2017-01-26 2 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 제안 방법하지만 조건문을 할 수있는 현재

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

네, 마침내 얻었습니다. mTriangleVerticesData를 사용하여 이미지 비율을 편집하고 이미지를 이동하기 위해 gl_position을 사용하기 위해 두 개의 다른 프로그램을 그리고 사용했습니다.

1

바인딩 및 쉐이더에서, Especialy는 조각, 느린 루프. 2 개의 다각형을 렌더링하는 것이 좋습니다.

+0

그래서 2 개의 별도 프로그램을 그리는 것이 더 효율적입니까? –

+0

네, 확실히 더 효율적입니다. – solidpixel

+0

저는 스케일링과 변환 만하고 있기 때문에 OpenGL에 깊이 들어가고 싶지 않습니다. 외부 EGL 텍스처로 출력하도록 그리는 중입니다. 두 번 그릴 수 있습니까? 내가 정말로 잃어버린 것처럼 그것이 작동 할 방법에 대한 어떤 psuedo 코드를 줄 수 있다면 좋을 것이다. –

관련 문제