首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL状态管理

OpenGL状态管理
EN

Computer Graphics用户
提问于 2021-08-28 14:10:28
回答 1查看 495关注 0票数 0

我正在工作的软件与许多不同的着色器,这需要不同的状态在OpenGL。我的问题是:具有不同着色器的不同模型并不是按照相同的顺序呈现,因此有一个从shader1到shader23到shader2的切换,等等。在下一个框架中,这个顺序可以更改(取决于场景)。当我添加一种新的对象(与新的着色器等),我认为它是有效的,我需要检查每一个顺序的对象呈现,看看是否出现错误。对于bug,我指的是OpenGL状态,这些状态被设置为特定的值,以后不会更改回。你怎么处理这件事?

我的想法是创建一个OpenGL状态类,您可以在其中定义每个参数。在运行呈现方法时,将将当前状态与OpenGL状态进行比较,并且需要将每个不同的设置设置为该状态。

在我看来这不仅仅是几行代码..。最困难的部分是找出哪些状态保存在哪个OpenGL表中(表我指的是VAO、FBO、纹理、.)。在哪里可以找到一个非常好地描述了每个OpenGL状态将被保存的表?

我的意思是:当绑定Shader1并将统一的“测试”设置为值"123“,然后绑定Shader2时,也称为”测试“的制服将不具有”123“的值。所以统一的值以某种方式存储在着色层上?属性指针和VAO也一样..。

另一方面: PointSize不是存储在着色层.所以每次我呈现点时,我都需要检查它们的大小,并将其更改为所需的大小。

有人能给我一些OpenGL状态表的URL吗?

有人有更好的主意来处理这个问题吗?顺便说一句:我不是唯一一个在开发这个软件的人.因此,说“每次更改状态时,在方法结束时将其更改”将不起作用。

EN

回答 1

Computer Graphics用户

发布于 2021-09-16 00:34:37

这更像是一个软件设计问题,可能适合更好的软件工程se

如果我理解得对,你会遇到这样的问题:

代码语言:javascript
复制
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

您可以执行以下操作之一。您可以将状态嵌入到对象中,也可以将对象嵌入场景状态。

第一种情况基本上是:

代码语言:javascript
复制
scene1 with parameter P=1 --------> object1
                       |
                       +----------> object4
scene2 with parameter P=3 --------> object2
scene3 with parameter K=1 --------> object3
                                       /
                                      /
                                     /
                       drawing call

第二种解决方案(物体进入着色器):

代码语言:javascript
复制
                                     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]]排序您的子列表)。

更新01 - 16/09/2021

OpenGL的全局状态可以使用glGet国家管理职能访问。您可以像在注释中所说的那样,在这些函数上编写一个包装类。如果需要动态访问原语和相关信息以确定状态,则应该可以使用查询函数(如glBeginQuery )进行访问。

票数 0
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/12158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档