Android OpenGLES 1.x相机预览到SurfaceTexture

5

我正在尝试将相机预览发送到SurfaceTexture对象并在正方形上呈现。我有适用于GLES20的运行代码,但没有找到任何适用于1.x的代码。 基本上应该像这样工作,对吗?

// setup texture
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);
gl.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, ...);
...

// setup surfacetexture object
surface = new SurfaceTexture(textures[0]);
surface.setOnFrameAvailableListener(this);


// setup camera
mCamera = Camera.open(0);
Camera.Parameters param = mCamera.getParameters();
List<Size> psize = param.getSupportedPreviewSizes();
//find previewsize to match glsurface from renderer
param.setPreviewSize(psize.get(i).width, psize.get(i).height);
mCamera.setParameters(param);

// set the texture and start preview
mCamera.setPreviewTexture(surface);
mCamera.startPreview();


// in the "onFrameAvailable" handler, i switch a flag to mark a new frame
updateSurface = true;


// and in the renderloop i update and redraw
if (updateSurface) {
    surface.updateTexImage();
    updateSurface = false;
}
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);

// Draw square
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBufferFloor);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

方形被绘制但完全是白色的。我没有收到glErrors或其他异常。 "onFrameAvailable"处理程序也被调用了。 如果我使用加载的位图和glTeximage,则会在方形上正确绘制。 有任何想法吗?谢谢!
1个回答

7
我遇到了同样的问题。也许我错了,但似乎SurfaceTexture与GLES10不兼容。Surface纹理使用GL_TEXTURE_EXTERNAL_OES,因此需要一个自定义的片段着色器来使用这个纹理(“#extension GL_OES_EGL_image_external:require”)。
由于在GLES10中不可用glUseProgram(...)等内容,我们无法使用自定义着色器。
就像我说的那样,也许我错了...祝好运
编辑:最终我搞定了。您应该使用“gl.glEnable(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);”。

兄弟,是你的修改让它在寻找答案四个小时后终于能够工作了。谢谢。 - Mikle
谢谢。我刚读了一下,现在无法验证。既然你们两个都同意它有效,那么我会标记它。 - J-S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接