2010-11-19 64 views
1

首先,我對於着色器的功能知之甚少,而且我對製作頂點照明非常感興趣。我正在嘗試使用3d顏色圖表來計算該世界位置的頂點顏色,並使用顏色貼圖中的附近顏色對顏色進行插值。OpenGL:使用着色器通過使用預先計算的顏色表創建頂點照明?

我不能使用典型的OpenGL照明,因爲它可能太慢,我需要渲染很多燈光。我將首先在色彩地圖上「渲染」燈光,然後我可以手動將每個繪製的頂點與色彩地圖中相應的顏色進行映射。

...或者我可以以某種方式自動化這個過程,所以我不必改變頂點的顏色值自己,但着色器可能會爲我做這個?

問題是......這是可能的,如果是這樣的話:我需要知道使之成爲可能嗎?

編輯:請注意,我也需要高效地更新光照貼圖,而不關心光照貼圖的大小,因此更新只應在我要更新的光照貼圖的特定部分完成。

回答

0

幾乎聽起來像你想要做的是使燈光的彩色地圖,然後用你的彩色地圖作爲紋理,但不是貼花模式,將其設置爲調製模式是什麼,所以它與乘以現有而不是僅僅取代它。

儘管這種方式不同:它不是隻影響頂點,而是映射到單個片段(本質上是像素)。

編輯:我想到的不是3D紋理 - 它是立方體貼圖。基本上,創建一個虛擬立方體,圍繞你的「世界」中的一切。爲該多維數據集的每個面創建一個2D紋理。將您的着色渲染到立方體貼圖。然後,爲一個頂點着色(實際上)從中心向外擴展一條光線,通過頂點到立方體。您在立方體貼圖上點擊的像素爲您提供該頂點的照明顏色。

更新應該是相對高效的 - 對頂部,底部,前部等有正常的2D紋理,並根據需要進行更新。

+0

我不需要像素着色,只需要更改我的GL_QUADS的4個角,因爲這樣做也會更快。創建一個3D紋理聽起來像一個老卡兼容性問題......有什麼辦法用着色器以某種方式使用我生成的數據? – Newbie 2010-11-19 16:36:07

+0

此外,這個光照貼圖必須有效更新,請參閱我的編輯。 – Newbie 2010-11-19 16:44:46

+0

@Newbie:看到編輯的答案。 – 2010-11-19 17:34:23

0

如果不能使用固定功能管線功能,則每個頂點照明的最佳做法應該是在頂點着色器中爲每個頂點執行所有照明計算,然後將其傳遞給片段着色器時,它將成爲正確插入整個臉部。

使用大量光源時處理性能問題的另一種方法是使用deferred rendering,因爲它只會對實際可見的幾何體進行光照計算。

+0

但是我的所有燈都可見,沒有優化可能性來減少燈數。 – Newbie 2010-11-20 12:47:03

+0

是的,但延遲渲染優化不是爲了減少光線數量(爲什麼你的燈光不可見?),而是通過僅計算可見的幾何圖形來減少光線計算。正常的渲染可能會花費大量的時間來計算頂點/片段上的光照,因爲它前面的其他幾何圖形可能無法在最終顯示。 – Daniel 2010-11-20 20:51:52

+0

啊,我明白了,是的,我正在考慮這一點,但我也不想重新計算每一個物體的每一個光線......只有當它們的位置發生變化或燈光變化時。我也不需要任何反射或任何複雜的,只是有色的頂點。 – Newbie 2010-11-21 00:09:40

0

這是可能的,但不會在當前硬件上生效。

您想將光線渲染爲3d紋理。光柵化器在2D表面上工作,因此您的卷必須沿着一個軸分割。分割可以通過下列方式之一進行:

  • 不同的繪製要求每個分割
  • 實例化的平局,基於glInstanceID層選擇
  • 分公司幾何着色器直接(需要幾何着色器)從一個平局呼籲

爲了實現它,我會建議閱讀GL-3規範和例子。這並不容易,對於複雜場景的結果也不會很快。