使用自定义着色器有效组织LibGDX项目

使用自定义着色器有效组织LibGDX项目,libgdx,opengl-es-2.0,shader,Libgdx,Opengl Es 2.0,Shader,我一直在学习使用LibGDX和OpenGL,但我很难弄清楚如何以合理的方式实现自定义着色器 我在项目中包括着色器的方法是创建一个类,该类实现了gdx.graphics.g3d.Shader类。然后我使用这个类来编译我的自定义着色器程序,并使用它来渲染网格 我通过从.g3db文件创建ModelInstance来创建网格,然后通过调用ModelBatch实例的render()方法将它们传递给着色器 当我需要为每个网格应用不同的纹理时,我的困惑就开始了。现在,我只是在每次调用modelBatch.re

我一直在学习使用LibGDX和OpenGL,但我很难弄清楚如何以合理的方式实现自定义着色器

我在项目中包括着色器的方法是创建一个类,该类实现了
gdx.graphics.g3d.Shader
类。然后我使用这个类来编译我的自定义着色器程序,并使用它来渲染网格

我通过从
.g3db
文件创建
ModelInstance
来创建网格,然后通过调用
ModelBatch
实例的
render()
方法将它们传递给着色器

当我需要为每个网格应用不同的纹理时,我的困惑就开始了。现在,我只是在每次调用
modelBatch.render()
之前在着色器上设置一个
uniform

以下是我的问题:

  • 即使在大型项目中,这样设置制服是否合理
  • 这是否是
    实现
    -ing
    着色器
    类的预期方法,以及通常使用OpenGl着色器的正确方法?(创建1个着色器,然后将其应用于我的所有模型)
  • 如何在着色器中使用干燥原则?换句话说,如果我想在模型上使用稍微不同的着色器,但想保持与其他所有对象相同的照明。在我的着色器中简单地包含
    if
    语句并使用
    uniform
    作为这些特殊情况的标志是最好的吗?否则,我似乎必须创建一个新的着色器,只需复制并粘贴大部分原始着色器
  • 看看:

  • 不,甚至更多:渲染只会在调用
    batch.end()后发生,因此可能无法生成正确的结果。使用
    材料
    环境
    参见
  • 每当材质发生更改时,通常会创建一个新着色器(重新编译)。您可以在
    ModelBatch
    上设置一个来管理此操作
  • 这取决于用例,但通常在着色器中进行分支不是一个好主意。相反,您可以使用预编译器指令编译着色器的不同版本。查看默认着色器并注意
    #if
    指令:

  • 你对1和3的回答听起来不错。对于2,我不知道如何使用
    ShaderProvider
    。我是否需要创建一个实现
    ShaderProvider
    的新类,并根据可渲染的属性在
    getShader()
    中返回一个
    Shader
    ?这不是只有在每个着色器需要唯一的制服组合时才起作用吗?是和是。记住,属性基本上与制服相同。看看这个答案,我给出了一个使用shaderprovider的小例子:为了向任何遇到这个问题的人澄清,您将
    shaderprovider
    传递给
    ModelBatch
    如下:
    ModelBatch batch=newmodelbatch(myShaderProvider)