Eri*_*ric 5 java android opengl-es
我一直致力于一个项目,用户可以在其中与a交互以GLSurfaceView在屏幕上绘制形状.这一切都很好,花花公子,但现在我尝试做两件事:1)创建他们的绘图的缩略图,2)保存他们的绘图.重要的是要注意用户可以绘制比屏幕大的图像.
就我的研究表明,最好使用a Bitmap(可以是1)渲染到Canvas缩略图,2)保存到文件系统,这实现了我的两个目标).
最初,我试图Renderer从GLSurfaceView通道中读取glReadPixels,但事实证明我无法从中获取屏幕外数据.相反,我选择做一个离屏缓冲区来生成图像的渲染,可以将其转换为Bitmap.
我发现了一个可爱的帖子,它提供了一个名为的类的代码PixelBuffer,我现在正在使用它.(我做了一些调整,但无论是否有调整,我都会遇到所有问题.)
现在,当使用getBitmap()代码时(我将在PixelBuffer论坛帖子不可读的情况下发布),我得到了一堆called unimplemented OpenGL ES API.起初这让我很奇怪,所以我做了一些调查.事实证明,由于某种原因,PixelBuffer该类使用OpenGL ES 2.0,而GLSurfaceView使用的是OpenGL ES 1.1.我正在使用的设备(Galaxy Nexus)不支持2.0.(而且,我想支持最大范围的设备.)
所以,这是我的问题:如何强制我的PixelBuffer类使用OpenGL ES 1.1 API?我已经在我的清单中添加了以下内容:
<uses-feature android:glEsVersion="0x00010001" />
Run Code Online (Sandbox Code Playgroud)
另外,我试图设置版本使用int[] version = new int[] { 1, 1 };,但无济于事.
PixelBuffer我正在使用的代码:链接.调用的问题Renderer在第91行.版本代码在第39行开始.
这是我用来创建的代码PixelBuffer,从GLSurfaceView对象调用:
setEGLConfigChooser(8, 8, 8, 8, 0, 0);
mRenderer = new MyRenderer(this);
setRenderer(mRenderer);
mPixelBuffer = new CPPixelBuffer(1440, 1280); // TODO Temporary hardcode for Galaxy Nexus wallpaper size
mPixelBuffer.setRenderer(mRenderer);
Run Code Online (Sandbox Code Playgroud)
如果无法将1.1版用于屏幕外渲染,那么将我的GL曲面转换为Bitmap使用1.1版或更低版本的最佳方法是什么?
编辑:通过一些测试,我发现使用下面的代码会导致这些错误:
// int[] version = new int[2];
int[] version = new int[] { // When using this line, as well as the other marked lines, instead of the line above, the errors are produced.
1, 1 // Marked
}; // Marked
int[] attribList = new int[] {
EGL_WIDTH, mWidth,
EGL_HEIGHT, mHeight,
EGL_VERSION, 1, // Marked
EGL_NONE
};
06-11 15:41:52.316: E/libEGL(5618): eglMakeCurrent:674 error 3009 (EGL_BAD_MATCH)
06-11 15:41:52.316: E/libEGL(5618): call to OpenGL ES API with no current context (logged once per thread)
Run Code Online (Sandbox Code Playgroud)
但是,这些设置都没有缓解手头的问题.它们只出现在我的PasteBin'd代码中,所以我认为指出它会很好.
由于某种原因,我没有找到发表评论的链接,很抱歉将此作为答案发布。关于GL线程,通常你只在GL线程中
public void onDrawFrame(GL10 gl)
Run Code Online (Sandbox Code Playgroud)
这是Renderer的一个方法。一切都必须在这个方法内完成。比如说,您可以将一个布尔值放入渲染器中,然后当您希望在渲染器中执行某些操作时将其设置为 true,仅此而已。如果您在此方法之外进行任何调用,您将收到错误。
另外,看看这个例子: Android OpenGL Screenshot 我已经使用过它并且它对我有用,但我不需要保存屏幕外区域,所以我不知道它是否会工作,也许不会:)
该方法必须在onDrawFrame内部调用
| 归档时间: |
|
| 查看次数: |
2216 次 |
| 最近记录: |