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