Gra*_*her 7 architecture opengl shader glsl
我正在用C++编写代码来处理常见的3D东西 - 模型,材料,灯光等等.但是,我发现无论什么工作,都需要了解着色器.EG,要为材质设置统一变量,您需要从着色器中知道它们的句柄; 要将网格加载到内存中,您需要知道不同in位置的句柄.
我最终拥有模型,材料等,每个都有一个着色器的手柄,所以他们可以做的事情glUniform1f(shader->getKdLocation(),kd),但这种烫手山芋对我来说似乎是糟糕的设计.我已经看过教程,其中制服和ins和out在着色器中硬编码(例如layout = 0),然后只是绑定glUniform1f(0,kd),.但是,这意味着我的其余代码只能使用我特别设计的着色器,因此看起来像是次优的解决方案.另外,我不认为你可以为子程序做这个,这使得这是一个不一致的选项.
它似乎是所有获取着色器引用之间的选择,并且在某些情况下甚至无法在没有一个(例如网格)或更多地方硬编码数字的情况下甚至无法正确实例化并且必须处理硬编码后面的问题.
我应该可以让这些模型,灯光等独立生活/操作,只有当我为场景设置着色器时才"工作",但我似乎无法找到一个可靠的方法来做到这一点.我的底线问题是处理着色器的最佳实践是什么?如果它不能解决我的所有问题,我很好,我只想知道一个好的设计决定是什么以及为什么.
问题是你的引擎架构,或者它的缺乏。在许多游戏引擎中,游戏对象被分为几个类别,例如负责几何图形(顶点缓冲区等)的网格对象,材质对象(负责网格对象的外观)。这样的设计,材质通常是一个实体,其中包含在渲染过程中传递到着色器的制服信息。这样的设计具有很大的灵活性,因为您可以重用,在不同的可渲染对象之间重新分配不同的材质。因此,对于初学者来说,您可以可以将特定的着色器程序设置为特定的材质类型,因此每次绘制网格时,其材质都会与传递所有所需制服的着色器程序进行交互。
我建议您看一下开源 OpenGL 引擎,了解它是如何工作的。
| 归档时间: |
|
| 查看次数: |
2940 次 |
| 最近记录: |