Opengl Libgdx如何在3D中使用着色器
我在我的wip游戏中达到了一个点,我想让它更吸引眼球。目前,我在Opengl Libgdx如何在3D中使用着色器,opengl,3d,libgdx,shader,Opengl,3d,Libgdx,Shader,我在我的wip游戏中达到了一个点,我想让它更吸引眼球。目前,我在环境中添加了一些环境光和方向光,并用它渲染我的场景。但是现在我想添加一个自定义的着色器。因此,我一直在寻找一些教程,出于某种原因,在几乎每个教程中,他们都在游戏中使用了另一个“版本”的Shader: 给ModelBatch一个String或FileHandle顶点/片段-着色器 使用顶点和片段创建着色器程序 使用此顶点和片段创建新的DefaultShader 创建一个类,该类实现着色器,并使用该着色器类 我认为可能性更大,因为还
环境中添加了一些环境光
和方向光
,并用它渲染我的场景。但是现在我想添加一个自定义的着色器。因此,我一直在寻找一些教程,出于某种原因,在几乎每个教程中,他们都在游戏中使用了另一个“版本”的Shader
:
- 给
ModelBatch
一个String
或FileHandle
顶点/片段
-着色器
- 使用顶点和片段创建
着色器程序
- 使用此顶点和片段创建新的
DefaultShader
- 创建一个类,该类实现
着色器
,并使用该着色器类
我认为可能性更大,因为还有ShaderProvider
和其他类。
我对所有这些可能性有点困惑。因此,我正在寻找能为我指明正确方向的人。
为了方便您,我告诉您我拥有什么和需要什么:
我有:
一个ModelBatch
可以绘制所有内容
一个数组
实例,我想对其应用着色器
纹理
及其法线贴图
,均存储为纹理
s
灯光的位置
,方向
和颜色
,表示为Vector3
,强度表示为float
环境光的颜色及其强度,表示为Vector3
和float
灯光“衰减”表示为Vector3
我需要:
将纹理
及其法线贴图
绑定到着色器
为着色器提供灯光位置、方向、颜色和强度
为着色器提供环境光颜色和强度
将衰减
向量指定给着色器
将此着色器
用于数组
中的所有“实例”,它们都是使用myModelBatch
绘制的
我想做的另一件事是,为不同的模型使用不同的纹理。
我所有的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);
}
}