如何在OnDrawFrame()之外绘制基元?

时间:2016-08-03 16:10:28

标签: android opengl-es

在android-opengles中,我们知道任何原语都可以通过android屏幕呈现 OnDrawFrame(GL10 gl) {} ..... 这是连贯的。 好像我们想绘制一个三角形类中定义的三角形 我们用

dataLayer

所以,我需要的是,我想在用户触摸时绘制三角形 通过

屏幕
triangle tri=new triangle();
OnDrawFrame(GL10 gl)
{
 .
 .
 .
tri.draw(gl);
 .
 .
 .

}

有可能吗?还是有其他办法吗?

2 个答案:

答案 0 :(得分:2)

如前所述,你不能直接这样做。无论线程如何,您都不应该只在应用程序中的某个随机点插入绘图,因为您不知道渲染实际处于什么状态。

始终尝试将逻辑与图形分开。在你的情况下,似乎意味着你将需要一个对象数组(三角形)。每当用户触摸时,您可以向此数组添加三角形对象,并且在绘制时可以绘制三角形。

现在你有三种情况的三角形。首先,如果你在每次绘制时清除缓冲区,那么数组应该在触摸事件上保持增长,并且每个框架都会绘制所有三角形。第二,如果你没有清除缓冲区并只是将一个对象绘制在另一个上,那么你应该在绘制时从数组中删除所有对象。

在这两种情况下,还有一个选项,只在完成更改时调用draw方法。在这种情况下,最常使用类似needsRedraw的布尔值,如果为true,则渲染应该触发,查看刷新并将needsRedraw设置为false。然后,当进行某些操作(例如添加了另一个三角形)时,值needsRedraw将再次设置为true。

还有一些其他方法,例如您可以在触摸事件将报告的另一个线程上创建共享上下文。在此上下文中,您可以创建具有附加纹理的FBO。然后主要上下文将这个纹理重绘为全屏,结果将是相同的......仍然这是一个更难的过程,没有理由实现它。更不用说你需要确保这两个线程不相同或者继续改变线程上的当前上下文;在这种情况下,双缓冲可能是强制性的,所以我们在FBO,锁定系统和附件/分离系统上查看2个纹理。

答案 1 :(得分:1)

OpenGL ES Documents表示应该从同一个线程调用上下文的所有GL命令。在您的情况下,Android和iOS必须从主线程发送命令。您无法从触摸事件传递命令。

我的建议是,在触摸事件中启用一个布尔标志,并在主线程上使用相同的布尔值来绘制内容。