2016-03-27 30 views
-1

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

回答

1

A 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); 
+0

哇!精彩的回答,谢谢Xoppa – amedina

+0

我真的很感谢你的帮助,Xoppa。我测试了着色器,并且在215行的fragment.glsl中发现了一个bug。现在是:'vec4 specular = vec4(0.0);'它应该是'vec3 specular = vec3(0.0);'我纠正它,它的工作原理,我不知道如果我做的不好,但如果我设置Cubemap属性,我不能设置环境光,对吧?如果可以,我该怎么做?谢谢你的帮助。 – amedina

+0

谢谢,我会检查要点并根据您的更改进行修改,当我找到一些时间在几台设备上进行测试时。我没有用灯光和材料的所有可能组合来检查着色器(这几乎不可能),所以可能是某种组合存在问题。环境光实际上只是为gl_FragColor添加一个值,以便您可以根据需要将它用作自己着色器的基础。但是,实现这个超出了这个问题的范围。 – Xoppa