我已经尝试了数百万种组合将纹理传递给着色器而没有任何成功。这是一个应该在视频上添加第二个纹理的代码(OES_EXTERNAL_TEXTURE
)。没有GL
错误(我已经验证了所有通话)。显示外部纹理(视频),但着色器(0,0,0,1f)中的其他纹理始终为黑色。
这就是我启动“覆盖”的方式。质地。
_texs = new int[1];
GLES20.GlGenTextures (1, _texs, 0);
_overlayId = _texs [0];
GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMinFilter,
GLES20.GlNearest);
GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMagFilter,
GLES20.GlLinear);
GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureWrapS,
GLES20.GlClampToEdge);
GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureWrapT,
GLES20.GlClampToEdge);
GLES20.GlBindTexture(GLES20.GlTexture2d, _overlayId);
GLES20.GlTexImage2D (GLES20.GlTexture2d, 0, GLES20.GlRgb, textureSide, textureSide, 0, GLES20.GlRgb, GLES20.GlUnsignedByte, ByteBuffer.Wrap(pixels));
_overlayPosition = GLES20.GlGetUniformLocation (_glProgram, "overlay");
GLES20.GlUniform1i (_overlayPosition, _overlayId);
GLES20.GlBindTexture (GLES20.GlTexture2d, 0);
这就是我画画的方式:
GLES20.GlBindTexture(GLES20.GlTexture2d, _overlayId);
_overlayPosition = GLES20.GlGetUniformLocation (_glProgram, "overlay");
GLES20.GlUniform1i (_overlayPosition, _overlayId);
GLES20.GlBindTexture(GL_TEXTURE_EXTERNAL_OES, _textureID );
_triangleVertices.Position (TRIANGLE_VERTICES_DATA_POS_OFFSET);
GLES20.GlVertexAttribPointer (_aPositionHandle, 3, GLES20.GlFloat, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, _triangleVertices);
GLES20.GlEnableVertexAttribArray (_aPositionHandle);
_textureVertices.Position (TRIANGLE_VERTICES_DATA_UV_OFFSET);
GLES20.GlVertexAttribPointer (_aTextureCoord, 2, GLES20.GlFloat, false, TEXTURE_VERTICES_DATA_STRIDE_BYTES, _textureVertices);
GLES20.GlEnableVertexAttribArray (_aTextureCoord);
Android.Opengl.Matrix.SetIdentityM (_MVPMatrix, 0);
GLES20.GlUniformMatrix4fv (_uMVPMatrixHandle, 1, false, _MVPMatrix, 0);
GLES20.GlUniformMatrix4fv (_uSTMatrixHandle, 1, false, _STMatrix, 0);
GLES20.GlDrawArrays(GLES20.GlTriangleStrip, 0, 4);
[编辑]
最后得到了sampler2d纹理:
(在纹理初始化部分中)创建纹理:
_texs = new int[1];
GLES20.GlGenTextures (1, _texs, 0);
_overlayTextureId = _texs [0];
获得统一的位置:
_overlayTextureUniform = GLES20.GlGetUniformLocation (_glProgram, "overlay");
这些参数是必需的,仅此而已:
GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMinFilter, GLES20.GlNearest);
GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMagFilter, GLES20.GlLinear);
从位图创建纹理:
GLUtils.TexImage2D (GLES20.GlTexture2d, 0, myBitmap, 0);
在OpenGL上下文中设置纹理。这是一个帮手。
setTexture2D (_overlayTextureUnit, _overlayTextureId, _overlayTextureUniform);
释放该位图:
source.Recycle ();
=纹理初始化结束=
这是我帮手的代码:
void setTexture2D(int textureUnit, int textureID, int uniformID) {
GLES20.GlActiveTexture(GLES20.GlTexture0 + textureUnit);
GLES20.GlBindTexture(GLES20.GlTexture2d, textureID);
GLES20.GlUniform1i(uniformID, textureUnit);
}
此代码有什么特别之处吗?不。我以前的尝试是否编码良好?没有。两件事情有很大帮助:1。上面的小助手,用于在初始化和onDrawFrame中设置OES和2D纹理。 2.调试图像我传递给GlTexImage2D方法,最终碰巧真的是黑色。我将像素从float更改为int,并在使用算术之前转换为int,它具有0或255个值。