gpt4 book ai didi

opengl - 在 OpenGL 中管理着色器的正确方法

转载 作者:行者123 更新时间:2023-12-02 08:11:09 24 4
gpt4 key购买 nike

我正在用 C++ 编写代码来处理常见的 3D 内容 - 模型、 Material 、灯光等。但是,我发现任何工作都需要了解着色器。 EG,要为 Material 设置统一变量,您需要从着色器知道它们的句柄;要将网格加载到内存中,您需要知道不同 in 位置的句柄。

我最终拥有了模型、 Material 等。每个模型、 Material 等都有一个着色器句柄,因此它们可以执行诸如 glUniform1f(shader->getKdLocation(),kd) 之类的操作,但是这种对我来说,烫手山芋的设计似乎很糟糕。我看过一些教程,其中制服和细节在着色器中进行硬编码(例如布局 = 0),然后仅与 glUniform1f(0,kd) 绑定(bind)。然而,这意味着我的其余代码只能与我专门布置的着色器一起使用,因此看起来是一个次优的解决方案。另外,我认为您不能对子例程执行此操作,这使得这是一个不一致的选项。

这似乎是一种选择,一切都获得着色器引用,在某些情况下甚至无法在没有一个(例如网格)的情况下正确实例化,或者在更多地方硬编码数字,并且必须处理硬编码带来的问题。

应该能够让这些模型、灯光等独立运行/操作,并且只有当我为场景设置着色器时才“工作”,但我似乎找不到做到这一点的可靠方法。我的底线问题是处理着色器的最佳实践是什么?如果它不能解决我的所有问题,我也没关系,我只是想知道什么是好的设计决策以及原因

最佳答案

问题在于你的引擎架构,或者它的缺乏。在许多游戏引擎中,游戏对象被分为几个类别,例如负责几何图形(顶点缓冲区等)的网格对象, Material 对象(负责网格对象的外观) )。在这样的设计中, Material 通常是一个实体,其中包含在渲染过程中传递到着色器的制服信息。这样的设计具有很大的灵 active ,因为您可以重用,在不同的可渲染对象之间重新分配不同的 Material 。因此首先,您可以将特定的着色器程序设置为特定的 Material 类型,以便每次绘制网格时,其 Material 都会与传递所有需要的制服的着色器程序进行交互。

我建议您看一下开源 OpenGL 引擎,了解它是如何工作的。

关于opengl - 在 OpenGL 中管理着色器的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17972051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com