Libgdx CubemapAttribute:如何使用 Libgdx 的 CubemapAttribute 来创建反射?

Libgdx CubemapAttribute: How can I use Libgdx's CubemapAttribute for creating reflections?

我在 Internet 上看到 Libgdx 现在支持立方体贴图,我正在研究如何将其添加到我的游戏中。我在 Whosebug 上搜索了一个示例,但我只找到了一个,它看起来已经过时了。我对 OpenGL 着色器没有太多经验,所以如果 Libgdx 可以为我提供一个立方体贴图,而不必阅读一本关于 OpenGL 着色器的大书,只是为了在我的盾牌中添加反射效果,那就太好了游戏。任何帮助将不胜感激。

A cubemap is generic, just like a 2d texture. It can be used for whatever you like. You can also have multiple cubemaps for different purposes. Likewise the CubemapAttribute can be used to add a cubemap to your environment or material. Just like the TextureAttribute 可用于添加二维纹理。

您可以按如下方式创建立方体贴图:

Cubemap cubemap = new Cubemap(
    Gdx.files.internal("image_px.png"),
    Gdx.files.internal("image_nx.png"),
    Gdx.files.internal("image_py.png"),
    Gdx.files.internal("image_ny.png"),
    Gdx.files.internal("image_pz.png"),
    Gdx.files.internal("image_nz.png"), false);

Here 您可以找到一些可用于创建立方体贴图的示例图像。确保相应地调整名称。

立方体贴图包含 OpenGL 资源,因此需要在不再需要时进行处理。不要忘记将此行添加到您的 dispose 方法中:

cubemap.dispose();

立方体贴图的典型用法是提供一个 "environment map" 用于模拟反射。您可以按如下方式将此类地图添加到您的环境中:

environment.set(new CubemapAttribute(CubemapAttribute.EnvironmentMap, cubemap));

如果您使用 DefaultShader 实现,那么它会将此立方体贴图绑定到 u_environmentCubemap uniform,因此您可以在着色器中使用它。

请注意,默认着色器程序(glsl 文件)不支持反射,您必须为此使用不同的着色器。您可以使用 this shader if you like. Note that the material of your model must be reflective (see this example material).

modelBatch = new ModelBatch(new DefaultShaderProvider(
    Gdx.files.internal("vertex.glsl"),
    Gdx.files.internal("fragment.glsl")));

如果你想在自己的着色器中使用立方体贴图,那么你基本上可以使用它 like this(只是一个简单的例子,我不会进入实际的着色器编写,因为那超出了问题):

gl_FragColor = vec4(textureCube(u_environmentCubemap, reflectDir).rgb, 1.0);