【问题标题】:Effectively organizing LibGDX project with custom shader使用自定义着色器有效组织 LibGDX 项目
【发布时间】:2014-08-01 14:32:38
【问题描述】:

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

我在项目中包含着色器的方式是创建一个 implementsgdx.graphics.g3d.Shader 类的类。然后我使用这个类来编译我的自定义着色器程序并用它来渲染网格。

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

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

这是我的问题:

  1. 即使在大型项目中,这样设置制服是否合理?
  2. 这是implement-ing Shader 类的预期方式以及一般使用 OpenGL 着色器的正确方式吗? (创建 1 个着色器,然后将其应用于我的所有模型)
  3. 如何在着色器中使用 DRY 原则?换句话说,如果我想在模型上使用稍微不同的着色器,但又想保持与其他一切相同的光照。是否最好在我的着色器中简单地包含if 语句并使用uniform 作为这些特殊情况的标志?否则,我似乎必须创建一个新着色器,然后复制并粘贴大部分原始着色器。

【问题讨论】:

    标签: libgdx opengl-es-2.0 shader


    【解决方案1】:

    看看:http://blog.xoppa.com/creating-a-shader-with-libgdx/

    1. 不,更重要的是:渲染只会在调用batch.end(); 之后发生,因此它可能不会产生正确的结果。而是使用MaterialEnvironment 请参阅http://blog.xoppa.com/using-materials-with-libgdx/
    2. 您通常会在材质发生变化时创建新的着色器(重新编译)。您可以在ModelBatch 上设置ShaderProvider 来管理它。
    3. 这取决于用例,但通常在着色器中进行分支并不是一个好主意。相反,您可以使用预编译器指令来编译不同版本的着色器。查看默认着色器并注意#if 指令:https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g3d/shaders/default.vertex.glsl

    【讨论】:

    • 您对 1 和 3 的回答听起来不错。对于 2,我对如何使用 ShaderProvider 感到困惑。我是否需要创建一个实现ShaderProvider 的新类,并根据可渲染的属性在getShader() 中返回Shader?这难道不是只有在每个着色器都需要独特的制服组合时才有效吗?
    • 是的,是的。请记住,属性与制服基本相同。看看这个答案,我给出了一个使用 shaderprovider 的小例子:stackoverflow.com/questions/22553409/…
    • 只是为了澄清遇到此问题的任何人,您将ShaderProvider 传递给ModelBatch,如下所示:ModelBatch batch = new ModelBatch( myShaderProvider );
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2016-05-06
    • 2012-09-28
    • 2012-10-12
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多