Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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
C++ 基于OpenGL的用户界面几何表示_C++_Performance_Opengl_User Interface_Glsl - Fatal编程技术网

C++ 基于OpenGL的用户界面几何表示

C++ 基于OpenGL的用户界面几何表示,c++,performance,opengl,user-interface,glsl,C++,Performance,Opengl,User Interface,Glsl,我计划为我目前正在从事的一个项目编写一个基于GL的UI。用户界面的大部分不会被纹理化(只是平淡的颜色),但是一些元素需要支持单个图像。元素只需要缩放和平移-不需要复杂的动画或旋转。虽然UI不一定是静态的,但在应用程序的生命周期中,元素可能会出现/消失,并且在某些情况下需要简单的滑动动画。还需要鼠标悬停、单击、选定等状态 我试图确定管理和存储UI元素本身的几何图形的最佳方法。我的第一个想法是创建一个包含一个四边形的顶点缓冲区,并将该四边形用于所有UI绘制调用。当然,变换将与四边形一起发送到着色器

我计划为我目前正在从事的一个项目编写一个基于GL的UI。用户界面的大部分不会被纹理化(只是平淡的颜色),但是一些元素需要支持单个图像。元素只需要缩放和平移-不需要复杂的动画或旋转。虽然UI不一定是静态的,但在应用程序的生命周期中,元素可能会出现/消失,并且在某些情况下需要简单的滑动动画。还需要鼠标悬停、单击、选定等状态

我试图确定管理和存储UI元素本身的几何图形的最佳方法。我的第一个想法是创建一个包含一个四边形的顶点缓冲区,并将该四边形用于所有UI绘制调用。当然,变换将与四边形一起发送到着色器

传统观点认为,最小化状态更改可以提高性能——这是使用单个VB的一个好处。但是,还需要为每个UI元素转换四元组。由于UI不会不断移动,这似乎有点多余


在现代硬件上,是转换单个四元组更便宜,还是发送转换数据的成本超过了仅绑定单个VB的好处?我是否最好为每个UI元素维护单独的几何体,可能是在CPU上计算的?UI系统是否有其他常用的推荐方法?

在现代硬件/驱动程序中,更改最昂贵的状态是渲染目标(FBO)、着色器(GLSL程序)和纹理。顶点缓冲区(即顶点属性指针,而不是实际数据)和统一状态实际上可能是在绘制调用之间更改的最便宜的状态

使draw调用变得昂贵的原因之一是由于状态更改而必须进行的所有状态验证,因此FBO(可能是GL中最复杂的验证)昂贵且不断更改的制服也就不足为奇了(在调用
glUniform*(…)
returns之前,几乎可以完全验证它)很便宜

这样一来,假设您对每个UI元素使用相同的纹理和着色器,那么更改一两个统一并发出另一个draw调用将不会非常昂贵

如果有足够多的小绘制调用,则可以将变换合并为统一的缓冲区对象/缓冲区纹理,然后使用某种形式的实例化将其减少为单个绘制调用。除非替换的绘制调用的数量足够大,否则这样做不会带来可测量的性能好处;在这个点上ecomes一个实用的优化是很难概括的。如果你愿意,你可以随意玩弄它,但从事物的声音来看,你可能不会从中得到任何有用的东西


你可以考虑做的是将你的GUI绘制成一个纹理。对于GUI来说,当GUI中没有任何改变时,你可以使用前一帧生成的纹理,跳过任何实际的GUI合成。当某些东西发生变化时,你可以使用模板/剪刀来清除“脏”。图形用户界面的一部分,然后重新绘制。最终,你将在每一帧的视口上拉伸你的图形用户界面纹理,唯一的区别是,在某些帧上你将重新绘制部分或全部纹理,而在另一些帧上你将重复使用整个纹理。

在现代硬件/驱动程序中,最昂贵的更改状态是渲染arget(FBO)、着色器(GLSL程序)和纹理。顶点缓冲区(即顶点属性指针,而不是实际数据)和统一状态实际上可能是在绘制调用之间更改的最便宜的状态

使draw调用变得昂贵的原因之一是由于状态更改而必须进行的所有状态验证,因此FBO(可能是GL中最复杂的验证)昂贵且不断更改的制服也就不足为奇了(在调用
glUniform*(…)
returns之前,几乎可以完全验证它)很便宜

这样一来,假设您对每个UI元素使用相同的纹理和着色器,那么更改一两个统一并发出另一个draw调用将不会非常昂贵

如果有足够多的小绘制调用,则可以将变换合并为统一的缓冲区对象/缓冲区纹理,然后使用某种形式的实例化将其减少为单个绘制调用。除非替换的绘制调用的数量足够大,否则这样做不会带来可测量的性能好处;在这个点上ecomes一个实用的优化是很难概括的。如果你愿意,你可以随意玩弄它,但从事物的声音来看,你可能不会从中得到任何有用的东西

你可以考虑做的是将你的GUI绘制成一个纹理。对于GUI来说,当GUI中没有任何改变时,你可以使用前一帧生成的纹理,跳过任何实际的GUI合成。当某些东西发生变化时,你可以使用模板/剪刀来清除“脏”。图形用户界面的一部分,然后重新绘制。最终,你将在每一帧的视口上拉伸你的图形用户界面纹理,唯一的区别是,在某些帧上,你将重新绘制部分或全部纹理,而在其他帧上,你将重复使用整个纹理