簡體   English   中英

頂點着色器或片段着色器中的OpenGL ES2.0 Lighting

[英]OpenGL ES2.0 Lighting in the vertex shader or fragment shader

我看過許多關於OpenGL ES2.0中照明的教程。

有些人使用頂點着色器進行所有照明和變換,然后僅將最終顏色傳遞通過片段着色器。

其他的則從頂點着色器傳遞位置和其他變量,然后在片段着色器中進行所有照明。

根據我的經驗,我一直認為應該在片段着色器中進行照明。 誰能告訴我為什么要互相反對?

傳統的固定流水線OpenGL在頂點處進行照明,並且僅對每個片段進行插值。 因此,它傾向於在邊緣顯示可見的接縫:

在此處輸入圖片說明

但是,這被認為是可以接受的折衷方案,因為照明過於昂貴,無法按像素進行照明。 現在硬件更好,但每個像素的照明成本仍然更高 所以我想那兒有潛在的爭論。 另外,我想如果您嘗試模仿舊的固定管道,則可能會故意使照明不准確。

但是,我正在努力思考任何可以接受的特別復雜的算法。 您所看到的示例是否可能只是在做一些事情,例如找出每個頂點的切線和余切矢量,或其他類似的昂貴步驟,然后對每個像素進行插值並在那里進行絕對最終計算?

照明計算可能會非常昂貴。 由於在渲染典型模型時片段比頂點多得多,因此通常在頂點着色器中進行光照計算並在片段上進行插值會更有效。 除了純粹的着色器執行次數以外,在片段着色器中執行典型的光照計算還可能需要更多操作,因為需要重新內插法線,這需要相對昂貴的sqrt操作。

每頂點照明的缺點是,如果整個表面上的照明值快速變化,則效果不佳。 這是很合理的,因為這些值是在三角形之間線性插值的。 如果所需值在整個三角形上沒有近似線性變化,則將引入偽影。

原型示例是鏡面反射高光。 如果定義具有相對較亮/較小的鏡面反射高光的發光材料,則在為對象設置動畫時,可以輕松地看到高光的亮度發生變化。 看起來高光似乎在對象上“徘徊”。 例如,如果旋轉球面高光高光圍繞其中心的球,則高光應保持完全相同。 但是,使用逐頂點照明時,高光的亮度將增加和減少,並且會稍微擺動。

有兩種主要方法可以避免這些影響,或者至少將它們減少到看起來不再造成干擾的程度:

  • 使用每片段照明。
  • 對幾何圖形使用更精細的細分。

哪種解決方案更好,需要逐案確定。 當然,使用更精細的細分會增加幾何處理方面的開銷,而使用每片段照明會增加片段着色器的開銷。

當您要應用凹凸貼圖等效果時,逐頂點照明會變得更加棘手,因為凹凸值在整個曲面上變化非常快。 在這種情況下,幾乎沒有辦法使用每片段照明。

我看到的建議表明,GPU如此之快,以至於不再應該使用逐頂點照明。 我認為這是一個簡單的簡化。 即使您使用單片段照明可以獲得理想的性能,但如今大多數計算機/設備都由電池供電。 為了提高能效,使渲染盡可能高效與以往一樣重要。 而且我認為,在某些情況下,逐頂點照明是最有效的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM