我正在尝试使用顶点和片段着色器在 OpenGL ES 2.0(Android 4.0.4,Galaxy Nexus)中显示一个简单的纹理作为全屏背景。最终结果应该是在那里显示相机图像,但首先,来自文件的简单纹理就足够了。我测试了很多东西,并且在我使用 OpenGL ES 1.x 时它工作了很短一段时间,但由于我计划使用着色器进行 YUV->RGB 转换,所以我必须使用 2.0。
我有以下顶点着色器:
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main() {
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy
}
这个片段着色器:
varying highp vec2 textureCoordinate;
uniform sampler2D videoFrame;
void main() {
gl_FragColor = texture2D(videoFrame, textureCoordinate);
}
这样的着色器创建应该没问题,因为当我编写gl_FragColor=vec4(1,0,0,0)
它时它工作得非常好并且向我显示红色背景。
OnSurfaceCreated
我执行以下操作:
a = makeFloatBuffer(squareVertices);
b = makeFloatBuffer(textureVertices);
和squareVertices
如下textureVertices
:
static float squareVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f,
1.0f, 1.0f, };
static float textureVertices[] = { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, };
OnSurfaceChanged
我执行以下操作:
GLES20.glViewport(0, 0, width, height);
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.raw.htc);
GLES20.glGenTextures(1, textures, 0);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
R.raw.htc 是 128x128 像素 png。
并且OnDrawFrame
:
GLES20.glUseProgram(program);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLES20.glUniform1i(GLES20.glGetUniformLocation(program, "videoFrame"),0);
GLES20.glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
GLES20.glClearDepthf(1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
int x = GLES20.glGetAttribLocation(program, "position");
int y = GLES20.glGetAttribLocation(program, "inputTextureCoordinate");
GLES20.glEnableVertexAttribArray(x);
GLES20.glVertexAttribPointer(x, 2, GLES20.GL_FLOAT, false, 0, a);
GLES20.glEnableVertexAttribArray(y);
GLES20.glVertexAttribPointer(y, 4, GLES20.GL_FLOAT, false, 0, b);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
我唯一看到的是一个完全黑屏,我不知道为什么。我在这里看到了一些其他类似问题的帖子,但没有一个建议的解决方案帮助我,或者根本没有给出解决方案。