【发布时间】:2013-07-31 13:40:41
【问题描述】:
我正在用 C++ 编写代码来处理常见的 3D 内容 - 模型、材质、灯光等。但是,我发现要让任何东西工作,它都需要了解着色器。 EG,要为材质设置统一变量,您需要从着色器中知道它们的句柄;要将网格加载到内存中,您需要知道不同 in 位置的句柄。
我最终得到了模型、材质等。每个都有一个着色器的句柄,所以他们可以做像glUniform1f(shader->getKdLocation(),kd) 这样的事情,但这种烫手山芋对我来说似乎是糟糕的设计。我看过一些教程,其中制服和输入输出在着色器中被硬编码(例如布局 = 0),然后只与glUniform1f(0,kd) 绑定。但是,这意味着我的其余代码只能与我专门布置的着色器一起使用,因此似乎不是一个最佳解决方案。另外,我认为您不能对子例程执行此操作,这使得这是一个不一致的选项。
这似乎是在获得着色器引用的所有事物和在某些情况下甚至无法正确实例化没有一个(例如网格)或在更多地方硬编码数字并不得不处理硬编码之后的问题之间做出选择。
我应该能够让这些模型、灯光等独立运行/运行,并且只有在我为场景设置着色器时才能“工作”,但我似乎找不到可靠的方法来做到这一点。我的底线问题是处理着色器的最佳做法是什么?如果它不能解决我所有的问题,我没关系,我只是想知道什么是好的设计决策以及为什么。
【问题讨论】:
-
"但是,这意味着我的其余代码只能与我特别布置的着色器一起使用,因此似乎不是最佳解决方案。" 为什么?您是否计划将您的着色器随机与其他非设计模型一起使用?您是否打算从互联网上获取随机着色器并尝试使用它们? “我不认为你可以对子程序这样做”人们实际上使用子程序?
-
@NicolBolas OpenGL 4.0 SL 食谱使用子例程,网络上的各种教程也这样做。据我所知,它们似乎是个好主意。有没有好的选择?另外,我会感谢建设性的 cmets,而不是贬义的 cmets,是否计划制作任何?
-
那是建设性的评论。我质疑您为什么认为这是“次优”的原因。如果你不解释你在寻找什么,你很难知道如何回答一个问题,什么对你来说是“最佳的”。因为你在做什么并不明显会使这不是“最佳”。
-
glBindAttribLocation() 可用于在链接着色器程序之前指定与什么名称匹配的索引,允许您在保留一些兼容性的同时对索引进行硬编码。有些人枚举(计算)他们的索引, glUniform1f(SOME_PROPERTY,kd) 感觉比 glUniform1f(0,kd) 更不容易出错......我现在正在调查你的问题......
标签: opengl architecture glsl shader