Android/OpenGles 绘制 2 个外部纹理,每个纹理占据屏幕的一半。左右一半
Android/OpenGles drawing 2 external texture each taking half of the screen. Left and right half
我已成功将 2 个外部 OES 纹理绑定到我的着色器。现在我希望每个纹理占据屏幕的 1/2(左边是一个纹理,右边是另一个)。我该怎么做?例子:
http://vicceskep.hu/kepek/vicces_funny_007445.jpg
来自 google
的随机图片
显示每张图片的完整图片。有一个有效的方法来做到这一点会很好。我目前引用的代码是来自 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 外部投影当前绑定
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);
您可以按照@Sung 建议的方式进行,但着色器中的条件语句和循环,尤其是片段,速度很慢。最好渲染2个不同的多边形。
是的,我终于明白了 it.I 使用 2 个不同的程序绘制并使用 mTriangleVerticesData 编辑图像比例并使用 gl_position 移动图像。
我已成功将 2 个外部 OES 纹理绑定到我的着色器。现在我希望每个纹理占据屏幕的 1/2(左边是一个纹理,右边是另一个)。我该怎么做?例子: http://vicceskep.hu/kepek/vicces_funny_007445.jpg 来自 google
的随机图片显示每张图片的完整图片。有一个有效的方法来做到这一点会很好。我目前引用的代码是来自 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 外部投影当前绑定
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);
您可以按照@Sung 建议的方式进行,但着色器中的条件语句和循环,尤其是片段,速度很慢。最好渲染2个不同的多边形。
是的,我终于明白了 it.I 使用 2 个不同的程序绘制并使用 mTriangleVerticesData 编辑图像比例并使用 gl_position 移动图像。