我正在尝试通过传输到 OpenGL ES 2.0 着色器的 SurfaceTexture 在 GLSurfaceView 中显示相机流。
我从这个 post 中得到灵感.
图像是完整的,但在我的平板电脑上显示不正确。 屏幕似乎分为 2x2 部分。图片显示在左上角,其他三部分为黑色。
我怀疑问题出在我对 here 记录的序列返回的转换矩阵的使用上
updateTexImage();
getTransformMatrix(...);
我在顶点着色器中传输这个矩阵以生成 fragment 着色器的纹理坐标。
顶点着色器:
attribute vec3 aPosition;
uniform mat4 uMvpTransform;
// Matrix retrieved by getTransformMatrix(...);
uniform mat4 uTexMatTransform;
varying vec2 vTexCoord;
void main(void)
{
gl_Position = uMvpTransform *vec4(aPosition.xyz, 1);
vec4 l_tex = uTexMatTransform*vec4(aPosition.xyz, 1);
vTexCoord=l_tex.xy;
}
fragment 着色器:
#extension GL_OES_EGL_image_external : require
varying mediump vec2 vTexCoord;
uniform samplerExternalOES uSampler;
void main(void)
{
mediump vec4 l_tex = texture2D(uSampler, vTexCoord);
gl_FragColor=l_tex;
}
纹理附加到以下正方形:
// Image container
GLfloat l_vertices[] = {
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f };
有人做过类似的事情吗?
2012 年 11 月 3 日编辑:
顶点着色器的修正:
attribute vec3 aPosition;
attribute vec2 aTexCoord;
uniform mat4 uMvpTransform;
// Matrix retrieved by getTransformMatrix(...);
uniform mat4 uTexMatTransform;
varying vec2 vTexCoord;
void main(void)
{
gl_Position = uMvpTransform *vec4(aPosition.xyz, 1);
vec4 l_tex = uTexMatTransform*vec4(aTexCoord.xy,0, 1);
vTexCoord=l_tex.xy;
}
与:
// Texture
GLfloat l_texCoord[] = {
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f
};
最佳答案
我已成功使用 SurfaceTexture 在自定义 opengl 纹理上绘制相机帧,而无需使用 android 提供的转换矩阵。
只需尝试按照普通纹理绘制的方式来定义索引顶点和纹理。例如这样。
const GLfloat Vertices[] = {0.5, -0.5, 0,
0.5, 0.5, 0,
-0.5, 0.5, 0,
-0.5, -0.5, 0};
const GLubyte Indices[] = { 0, 1, 2,
2, 3, 0 };
const GLfloat Textures[] = { 1.,0.,
0.,0.,
0.,1.,
1.,1. };
您应该能够像使用普通纹理一样使用表面纹理。
如果您想执行某种 3D 投影,这是一个 good post关于如何生成合适的 MVP 矩阵。您可以使用它与顶点着色器中的位置相乘。
关于android - 通过 SurfaceTexture 在 GLSurfaceView 上显示相机流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13200652/