2016-03-27 28 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