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

时间:2016-03-27 15:51:12

标签: android opengl-es libgdx shader

我在网上看到Libgdx现在支持立方体贴图,我正在考虑如何在我的游戏中添加一个。我在StackOverflow上搜索了一个例子,但我找到了一个,它看起来已经过时了。我没有太多使用OpenGL着色器的经验,所以如果Libgdx可以为我提供立方体贴图而不必阅读OpenGL着色器上的一本大书只是为了在我的游戏中添加一个反射效果,这将是很好的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

cubemap是通用的,就像2d纹理一样。它可以用于任何你喜欢的。您还可以将多个立方体贴图用于不同目的。同样,CubemapAttribute可用于向您的环境或材质添加立方体贴图。就像TextureAttribute可以用来添加2d纹理一样。

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

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.set(new CubemapAttribute(CubemapAttribute.EnvironmentMap, cubemap));

如果您使用DefaultShader实现,则会将此立方体贴图绑定到u_environmentCubemap制服,以便您可以在着色器中使用它。

请注意,默认着色器程序(glsl文件)不支持反射,您必须使用不同的着色器。如果您愿意,可以使用this shader。请注意,模型的材质必须是反射性的(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);