Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es 如何在opengl Es 2.0中部分重画_Opengl Es_3d - Fatal编程技术网

Opengl es 如何在opengl Es 2.0中部分重画

Opengl es 如何在opengl Es 2.0中部分重画,opengl-es,3d,Opengl Es,3d,根据我的需要,我想为每一帧只重绘场景的一部分 仅当部分场景被更新时,才重新绘制整个场景 在OpenGLES2.0中有没有这样做的方法? 请对此进行任何输入都将非常有用OpenGL并不真正支持增量渲染。每次要求重新绘制时,都需要绘制整个帧 我能想到的最接近的方法是使用FBO(帧缓冲区对象)将静态数据渲染到屏幕外的帧缓冲区。如果你寻找像“OpenGL FBO”这样的关键词,你应该能够在网上和书中找到大量的例子。您将使用诸如glGenFramebuffers(),glBindFramebuffer()

根据我的需要,我想为每一帧只重绘场景的一部分 仅当部分场景被更新时,才重新绘制整个场景

在OpenGLES2.0中有没有这样做的方法?
请对此进行任何输入都将非常有用

OpenGL并不真正支持增量渲染。每次要求重新绘制时,都需要绘制整个帧

我能想到的最接近的方法是使用FBO(帧缓冲区对象)将静态数据渲染到屏幕外的帧缓冲区。如果你寻找像“OpenGL FBO”这样的关键词,你应该能够在网上和书中找到大量的例子。您将使用诸如
glGenFramebuffers()
glBindFramebuffer()
glFramebufferTexture2D()
等调用

将静态内容渲染到FBO后,可以在每次重画开始时将其复制到默认帧缓冲区,然后在其上渲染动态内容。如果呈现静态内容非常昂贵,那么这是一种值得的方法。否则,从FBO复制到默认帧缓冲区可能比每次简单地重新呈现静态内容更昂贵

如果静态内容在后台,而动态内容则完全在其前面,则上述操作非常简单。如果静态内容和动态内容重叠,就会变得更加棘手。然后,在开始渲染动态内容之前,必须恢复每次渲染静态内容时产生的深度缓冲区。在ES2.0中,我想不出一个好方法来实现这一点。只有在ES 3.0及更高版本中,才能相对平滑地执行此操作(深度纹理,
glBlitFramebuffer


还有一个我认为不太吸引人的选项,但为了完整起见,我想提及它:EGL定义了一个
EGL\U交换行为
属性,可以设置为
EGL\U缓冲区
。一个重要的警告是,它是可选的,并非所有设备都支持。它还只保留颜色缓冲区,而不保留辅助缓冲区,如深度缓冲区。如果仍要阅读,请参见和。

您可以将视口设置为绘制到缓冲区的特定矩形。您需要相应地设置矩阵。非常感谢您的回复。我对opengles比较陌生,请您详细解释一下您的答案。您的问题太笼统了,根本无法回答。关键是,您可以设置特定视口,以设置正在绘制的缓冲区的哪个部分。这通常设置为(0,0,bufferWidth,bufferHeight)以绘制整个缓冲区。要绘制到缓冲区的特定部分,您可以为此方法设置一些其他参数,例如(bufferWidth*.5f、bufferHeight*.5f、bufferWidth*.5f、bufferHeight*.5f),该参数仅绘制到缓冲区的右下四分之一。Rest取决于您的矩阵系统,例如使用“正交”将需要新的相对坐标,如“左”、“右”、“顶”…我的确切要求是,我只需要绘制动态更新的内容,同时保留每个帧的静态数据。我能够使用GLDraweElements(..)绘制更新的部分,并且仅绘制渲染的部分,但无法保留和显示静态数据。请您建议一种在opengles中使用的方法,我可以使用它保存静态数据,并将其与动态数据一起呈现。提前感谢您的帮助。你好,雷托,有一个查询我正在使用单缓冲区opengl FBO可以很好地工作吗?opengl ES不支持单缓冲。在完整的OpenGL中,您只能有一个缓冲区,并直接绘制到前缓冲区。但ES中不存在该功能。@Reto Koradi非常感谢您的详细回答。只需澄清一点:如果我只需要显示一个图像3秒钟(窗口将只显示该图像,它永远不会改变),则以60 fps的速度渲染图片(从而加载CPU/GPU)可以吗?我的意思是每次从libGDX应用程序中ScreenAdapter的render()方法调用mySprite.draw(myBatch)?我是否应该关心性能并发明任何优化(在桌面应用程序中)?我的图片是一个1920x1080,几乎全屏幕显示,这是否意味着在我的情况下“呈现静态内容非常昂贵”?