Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl Libgdx如何在3D中使用着色器_Opengl_3d_Libgdx_Shader - Fatal编程技术网

Opengl Libgdx如何在3D中使用着色器

Opengl Libgdx如何在3D中使用着色器,opengl,3d,libgdx,shader,Opengl,3d,Libgdx,Shader,我在我的wip游戏中达到了一个点,我想让它更吸引眼球。目前,我在环境中添加了一些环境光和方向光,并用它渲染我的场景。但是现在我想添加一个自定义的着色器。因此,我一直在寻找一些教程,出于某种原因,在几乎每个教程中,他们都在游戏中使用了另一个“版本”的Shader: 给ModelBatch一个String或FileHandle顶点/片段-着色器 使用顶点和片段创建着色器程序 使用此顶点和片段创建新的DefaultShader 创建一个类,该类实现着色器,并使用该着色器类 我认为可能性更大,因为还

我在我的wip游戏中达到了一个点,我想让它更吸引眼球。目前,我在
环境中添加了一些
环境光
方向光
,并用它渲染我的场景。但是现在我想添加一个自定义的
着色器。因此,我一直在寻找一些教程,出于某种原因,在几乎每个教程中,他们都在游戏中使用了另一个“版本”的
Shader

  • ModelBatch
    一个
    String
    FileHandle
    顶点/片段
    -着色器
  • 使用顶点和片段创建
    着色器程序
  • 使用此顶点和片段创建新的
    DefaultShader
  • 创建一个类,该类实现
    着色器
    ,并使用该
    着色器类
我认为可能性更大,因为还有
ShaderProvider
和其他类。
我对所有这些可能性有点困惑。因此,我正在寻找能为我指明正确方向的人。
为了方便您,我告诉您我拥有什么和需要什么:
我有:

  • 一个
    ModelBatch
    可以绘制所有内容
  • 一个
    数组
    实例,我想对其应用
    着色器
  • 纹理
    及其
    法线贴图
    ,均存储为
    纹理
    s
  • 灯光的
    位置
    方向
    颜色
    ,表示为
    Vector3
    ,强度表示为
    float
  • 环境光的
    颜色及其强度,表示为
    Vector3
    float
  • 灯光“衰减”表示为
    Vector3
  • 我需要:

  • 纹理
    及其
    法线贴图
    绑定到
    着色器
  • 着色器提供灯光位置、方向、颜色和强度
  • 着色器提供环境光颜色和强度
  • 衰减
    向量指定给
    着色器
  • 将此
    着色器
    用于
    数组
    中的所有“实例”,它们都是使用my
    ModelBatch
    绘制的
  • 我想做的另一件事是,为不同的模型使用不同的
    纹理。
    我所有的
    ModleInstance
    s都有纹理
    材质
    。我有所有这些不同的
    纹理的法线贴图。现在,我希望能够将右侧
    纹理
    法线贴图
    绑定到
    着色器
    ,具体取决于
    模型实例
    材质中的
    纹理

    如果可能的话,我想做一件更“高级”的事情,就是在我的游戏中为不同的
    模型类型使用不同的
    着色器
    (Stonewall使用
    着色器
    ,没有“镜面反射”和“反射”,而金属墙使用
    镜面反射

    在Libgdx中做这些事情的最佳方式是什么? 如何绑定现有的不同变量?(例如,对于着色器程序,我可以使用
    setUniformi

    非常感谢。如果你需要更多的信息,或者很难理解,请告诉我,我会尝试提出一个更好的问题


    编辑:我认为创建一个新的
    着色器
    类是最好的方法,它实现了
    着色器
    。但是我想听听所有其他的可能性,它们的优点和缺点,关于设计、性能和可能的限制。

    可以找到3d api渲染管道的总体说明。指导您从头开始创建新的
    着色器。并演示如何使用自定义属性将数据传递给着色器。还解释了如何使用
    材质
    属性
    以及
    默认着色器
    支持哪些
    属性

    在LibGDX中,
    着色器
    着色器程序
    之间存在差异。A只是GPU实现(顶点和片段着色器程序),它基本上只是编译的GLSL文件。例如,可以在
    ShaderProgram
    上设置制服,并使用它渲染网格。但是
    着色器程序本身并不“知道”如何渲染模型

    着色器
    界面旨在弥合
    着色器程序
    和可渲染
    之间的差距(后者是模型的最小可渲染部分)。因此,
    着色器
    通常封装
    着色器程序
    ,并确保设置正确的制服等。(请注意,严格来说,
    着色器
    不必封装
    着色器程序
    。例如,在删除对GLES1的支持之前,还有一个GLES1着色器管理固定的渲染管道,而不是封装
    着色器程序

    该类是一个
    抽象
    辅助类,它实现了
    着色器
    接口,封装了
    着色器程序
    ,并添加了一些辅助方法来轻松设置统一。如果扩展该类,您可以轻松地
    注册
    设置
    统一,例如:

    public class MyShader extends BaseShader {
        public final int u_falloff = register("u_falloff");
        ...
        @Override
        public void render (final Renderable renderable) {
            set(u_falloff, 15f);
            ...
            super.render(renderable);
        }
    }
    
    这将把名为“u_falloff”的统一设置为指定的值
    15f
    (它将调用setUniformX)。如果
    ShaderProgram
    (glsl文件)没有实现名为“u_falloff”的统一,它将忽略该调用。您还可以使用以下命令检查此项:
    If(has(u_falloff)){/*计算衰减并设置它*/}
    BaseShader
    还增加了为每件制服使用
    验证器
    设置器
    的可能性

    DefaultShader
    扩展了
    BaseShader
    并添加了def
    public class MyShaderProvider extends DefaultShaderProvider {
        ... // implement constructor
        @Override
        protected Shader createShader (final Renderable renderable) {
            if (renderable.material.has(MyCustomAttribute.Type))
                return new MyShader(renderable);
            else
                return super.createShader(renderable);
        }
    }