我正在工作的软件与许多不同的着色器,这需要不同的状态在OpenGL。我的问题是:具有不同着色器的不同模型并不是按照相同的顺序呈现,因此有一个从shader1到shader23到shader2的切换,等等。在下一个框架中,这个顺序可以更改(取决于场景)。当我添加一种新的对象(与新的着色器等),我认为它是有效的,我需要检查每一个顺序的对象呈现,看看是否出现错误。对于bug,我指的是OpenGL状态,这些状态被设置为特定的值,以后不会更改回。你怎么处理这件事?
我的想法是创建一个OpenGL状态类,您可以在其中定义每个参数。在运行呈现方法时,将将当前状态与OpenGL状态进行比较,并且需要将每个不同的设置设置为该状态。
在我看来这不仅仅是几行代码..。最困难的部分是找出哪些状态保存在哪个OpenGL表中(表我指的是VAO、FBO、纹理、.)。在哪里可以找到一个非常好地描述了每个OpenGL状态将被保存的表?
我的意思是:当绑定Shader1并将统一的“测试”设置为值"123“,然后绑定Shader2时,也称为”测试“的制服将不具有”123“的值。所以统一的值以某种方式存储在着色层上?属性指针和VAO也一样..。
另一方面: PointSize不是存储在着色层.所以每次我呈现点时,我都需要检查它们的大小,并将其更改为所需的大小。
有人能给我一些OpenGL状态表的URL吗?
有人有更好的主意来处理这个问题吗?顺便说一句:我不是唯一一个在开发这个软件的人.因此,说“每次更改状态时,在方法结束时将其更改”将不起作用。
发布于 2021-09-16 00:34:37
这更像是一个软件设计问题,可能适合更好的软件工程se。
如果我理解得对,你会遇到这样的问题:
scene1 with parameter P=1 object1
scene2 with parameter P=3 object2
scene3 with parameter K=1 object3
scene4 with parameter P=1 object4
\ /
\ /
\ /
drawing call您可以执行以下操作之一。您可以将状态嵌入到对象中,也可以将对象嵌入场景状态。
第一种情况基本上是:
scene1 with parameter P=1 --------> object1
|
+----------> object4
scene2 with parameter P=3 --------> object2
scene3 with parameter K=1 --------> object3
/
/
/
drawing call第二种解决方案(物体进入着色器):
object1
|
+------------------+
| |
v |
scene1 with parameter P=1 object4
scene2 with parameter P=3 <-------- object2
scene3 with parameter K=1 <-------- object3
\
\
\
drawing call然后,在抽签调用期间,您只需按照希望使用正确参数绘制对象的顺序来枚举对象。如果顺序与每个抽签调用的参数一起动态变化;您可以先遍历对象以设置正确的参数,然后再绘制。在动态情况下,如果有大量对象,将对象嵌入到场景状态类中可能会带来更好的性能,因为您可以根据绘图顺序对场景状态中的对象进行排序(问题只是关于根据包含的列表[[1,2,3],[4,5],[6,7,8,9]]排序您的子列表)。
OpenGL的全局状态可以使用glGet国家管理职能访问。您可以像在注释中所说的那样,在这些函数上编写一个包装类。如果需要动态访问原语和相关信息以确定状态,则应该可以使用查询函数(如glBeginQuery )进行访问。
https://computergraphics.stackexchange.com/questions/12158
复制相似问题