我试图通过openGL过滤器运行来自相机硬件的流,然后在GLSurfaceView中显示它.当openGL去渲染帧时,LogCat会反复发出错误:
[unnamed-3314-0] updateTexImage:清除GL错误:0x502
0x502是一个通用的openGL错误,并没有真正帮助我追踪问题.这是一个代码如何工作的序列(或者至少应该像我脑中看到的那样工作),并且我已经将代码复制到了下面.我希望别人能看出我的问题是什么.
- 创建新的MyGLSurfaceView.这也在内部创建了新的MyGL20Renderer对象.此MyGLSurfaceView设置为内容视图.
- 一旦MyGLSurfaceView完成膨胀/初始化,此完成事件将触发渲染器创建DirectVideo绘图对象,该对象编译/链接定义的着色器并将它们添加到openGL程序.然后它创建一个新的openGL纹理对象,然后使用纹理对象ID回调MainActivity.
- 从渲染器调用MainActivity方法时,它会使用传递的openGL纹理对象创建一个新的SurfaceTexture对象.然后它将自己设置为表面的onFrameListener.然后创建/打开相机对象,将创建的SurfaceTexture设置为视频流的目标,然后启动相机源.
- 当Feed中有一个框架时,onFrameAvailable会向渲染器发送渲染请求.这是在openGL线程上获取的,该线程调用SurfaceTexture的updateTexImage(),它将帧内存加载到openGL纹理中.然后它调用DirectVideo的绘图对象,并运行openGL程序序列.如果我注释掉这个.draw()行,上面提到的错误消失了,所以看起来这个问题很可能就在这里,但我并不认为这是由于链接/创建不正确的纹理造成的.
MainActivity.java
public class MainActivity extends Activity implements SurfaceTexture.OnFrameAvailableListener
{
private Camera mCamera;
private MyGLSurfaceView glSurfaceView;
private SurfaceTexture surface;
MyGL20Renderer renderer;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
glSurfaceView = new MyGLSurfaceView(this);
renderer = glSurfaceView.getRenderer();
setContentView(glSurfaceView);
}
public void startCamera(int texture)
{
surface = new SurfaceTexture(texture);
surface.setOnFrameAvailableListener(this);
renderer.setSurface(surface);
mCamera = Camera.open();
try
{
mCamera.setPreviewTexture(surface);
mCamera.startPreview();
}
catch (IOException ioe)
{
Log.w("MainActivity","CAM LAUNCH FAILED");
}
}
public void onFrameAvailable(SurfaceTexture surfaceTexture)
{
glSurfaceView.requestRender();
} …Run Code Online (Sandbox Code Playgroud)