2014-10-29 25 views
0

第一個問題是如何從單個光源獲取,使用多個光源,而不使用多個片段着色器。GLSL法線映射着色器的多個光源和實現細節

我的直覺是,每次運行着色器計算都需要光源座標以及一些顏色信息,我們可以通過循環計算n個光源。

如何將多個燈光傳遞到着色器程序?我是否使用一系列制服?我的猜測是用每個光源的座標傳遞一組制服,然後指定有多少個光源,然後設置一個最大值。

我可以爲着色器程序調用getter或setter方法嗎?而不是僅僅操縱全局變量?

我使用本教程和libGDX實現學習如何做到這一點: https://gist.github.com/mattdesl/4653464

+0

'com.badlogic.gdx.graphics.g3d.shaders.DefaultShader'處理來自環境的多個燈光。該軟件包還包含一個默認的垂直/碎片着色器。可能會給你一些啓示。 – cfrick 2014-10-30 10:29:53

回答

4

有許多方法有多個光源。我會點3最常用的。

1)指定均勻結構陣列中的每個光源。在所有活動光源的着色器循環中進行光計算,並根據每個頂點或每個片段完成着色,將結果累加爲單個頂點顏色或片段顏色。 (這是固定功能的OpenGL如何計算多個燈光)

2)以最簡單的形式通過單通道啓用單光源的多通道渲染可以通過加法混合(srcFactor = ONE dstFactor = ONE)合成。不要忘記在從GL_LESS首次傳遞到GL_EQUAL之後更改深度func,或者僅對所有傳遞使用GL_LEQUAL。 3)許多環境照明算法模擬多個光源,假設它們距離場景無限遠。最簡單的渲染器應該將光強度存儲到環境紋理中(最好是立方體貼圖),然後着色器作業就是以一定的隨機角度偏移在紋理法線方向上多次採樣該紋理。

+0

我想加上一個這樣的答案,但是你剛纔所說的一切都在我頭上,我不知道從哪裏開始。我不是以任何方式成爲GL專家。這是我第一次使用OpenGL直接*工作(因爲以前我一直讓圖書館做這項工作)。 – 2014-10-30 02:53:18

+0

你需要什麼?一些glsl的例子?你可能會發現[鏈接] Nehe教程很有用(http://nehe.gamedev.net/)它不使用libGDX,但所有fundeamental的opengl和glsl概念都是逐步解釋和編碼的。 – Anonymous 2014-10-30 09:20:11

+0

我已經用一些使用光線投射來製作方向燈的照明庫。我試圖找出如何將正常地圖照明納入該庫集。它被稱爲Box2DLights。有些視頻已經完成了,但我對如何讓它發揮作用感到茫然。 – 2014-11-15 04:17:00