【问题标题】:Proper way to manage shaders in OpenGL在 OpenGL 中管理着色器的正确方法
【发布时间】: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


【解决方案1】:

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

我建议您查看开源 OpenGL 引擎以了解其工作原理。

【讨论】:

    【解决方案2】:

    对于客户端上的统一规范与着色器中的实际统一位置之间的松散关联,我也有同样的担忧。

    您可以采取的一种方法是使用glGetUniformLocation 根据其名称确定统一变量的位置。它可能仍然不完美,但它可能是你能做的最好的。

    例子:

    // Old way:
    GLfloat myfloat = ...;
    glUniform1f(0, myfloat);   // Hope that myfloat was supposed to go at location 0...
    

    // Slightly better...
    GLfloat myfloat = ...;
    GLint location = glGetUniformLocation(myprogram, "myfloat");
    glUniform1f(location, myfloat);   // We know that a uniform with name "myfloat" goes at this location
    

    glGetActiveUniform 进行一些额外的工作还可以让您确保“myfloat”具有您预期的类型/大小/等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多