我正在用 C++ 编写代码来处理常见的 3D 内容 - 模型、材质、灯光等。但是,我发现要让任何东西正常工作,它都需要了解着色器。EG,要为材质设置统一变量,您需要从着色器中知道它们的句柄;要将网格加载到内存中,您需要知道不同in
位置的句柄。
我最终得到了模型、材料等。每个都有一个着色器的句柄,所以他们可以做类似的事情glUniform1f(shader->getKdLocation(),kd)
,但这种烫手山芋对我来说似乎是糟糕的设计。我看过一些教程,其中制服和输入输出在着色器中进行硬编码(例如布局 = 0),然后仅使用glUniform1f(0,kd)
, 绑定。但是,这意味着我的其余代码只能与我特别布置的着色器一起使用,因此似乎是一个次优的解决方案。另外,我认为您不能对子例程执行此操作,这使得这是一个不一致的选项。
在获得着色器引用的所有事物和在某些情况下甚至无法正确实例化没有一个(例如网格)或在更多地方硬编码数字并不得不处理硬编码之后的问题之间似乎是一种选择。
我应该能够让这些模型、灯光等独立运行/运行,并且只有在我为场景设置着色器时才能“工作”,但我似乎找不到可靠的方法来做到这一点。我的底线问题是处理着色器的最佳实践是什么?如果它不能解决我所有的问题,我很好,我只是想知道一个好的设计决策是什么以及为什么。