在 Cg 的逐像素著色的最後,每一個顏色值相加和每一個顏色相乘從數學角度有什麼差別?

直接貼代碼好了,在有些著色的最後可能是這樣的

fixed4 c;
c.rgb+=SpecularColor
return c;
而有些著色的最後可能是乘法的混合
比如
fixed4 c;
fixed4 color1 = tex2D(_MainTex,i.uv);
fixed4 color2 = tex2D(_SpecularTex,i.uv2);

c=color1*color2
return c;
這些會在效果的具體哪些細節產生差異,在相乘的時候又是怎麼做的數學運算?
多謝各位大神。


顏色相加是指光的疊加,物理上是光的強度相加。例如多個光源照射到一個表面後反射至攝像機,就可以把各個光照的反射結果相加。而題目中的例子是Phong或Blinn材質的反射模型,其意義可以算是一種擬合,把材質的反射分解成漫反射和鏡面反射,然後把兩種反射光的結果相加。

而題目中的顏色相乘,其實並不是數學中常見的矢量積(學術上叫Hadamard product (matrices),在《RTR》中使用mathbf{a} otimes mathbf{b}寫法),而應該理解為顏色的非等比縮放。例如,光通過有色玻璃時,玻璃吸收某百分比的紅、藍、綠,就可以把光的紅藍綠強度分別乘以對應的百分比。漫反射也可以理解成材質吸收了某百分比的入射光後向各方向反射。

如果考慮HDR的情況,光的顏色可以大於1,但吸收率應仍是[0, 1]。這樣大概更不會混淆兩種運算。


今天倉促回答下,明天早上補圖。
從你的代碼上看,第一個應該是材質的之前計算的顏色(比如diffuse)加上這次的高光(Specular)。
第二個應該是當前計算的高光乘以高光貼圖後所得得高光。其實第二個算出來的結果意義上還是第一個的高光。

——————————————————來補圖了,剛出爐的————————————————
答主僅從提供的代碼分析。畢竟答主也剛剛開始學習寫shader,有寫錯的還望大家包涵……

1.題主的第一段代碼可以理解為下圖。
c.rgb
假設算高光之前c.rgb已經算好了漫反射如下

得出的SpecularColor

c.rgb+=SpecularColor

2.第二段代碼我的理解是,先算出沒有貼圖的高光
color1

然後乘以貼圖(這裡我用了一個黑白棋盤貼圖)
color2

c=color1*color2

棋盤格里白色的顏色為1的話就是color2=1,那color1*color2得出的還是color1。
棋盤格里黑色的顏色為0的話就是color2=0,那color1*color2得出的就是黑色了。

3.現在還可以把題主現在得出的顏色c當成第一段代碼的SpecularColor再加上漫反射

最後就是這樣的了。ps:看到其他答主都是說的鏡面反射就我說的是高光。
其實高光本質也是鏡面反射。只是在實際應用中(可能是早期演算法的原因吧),shader對燈光的鏡面反射為SpecularColor,對從本身不發光只反彈光的物體獲得鏡面反射為ReflectionColor。這就是我看到SpecularColor本能的翻譯成高光的原因,平常叫慣了。


兩個顏色相乘 稱為「調製 (Modulate)」。兩個相乘的顏色通常是 紋理顏色和光源顏色,相乘後得到的最終渲染的顏色。


不同光源的結果都是相加的,而光源作用在材質上就是相乘。


1顏色相加的目的是為了給光源製造強光效果, 例如你有個燈籠,有一張漫反射紋理,一個發光紋理,那麼這兩個紋理顏色就要相加,才能產生燈籠發光效果

2顏色相乘法,是為了模擬光照射到物體上的效果,例如你有個地面,地面有一個漫反射紋理,還有一張光照貼圖,那麼兩個顏色需要相乘,才會產生 正確光照射物體效果


能量不守恆的照明模型,Diffuse + Specular:

該模型在 LDR 照明下,如果相加結果 &> 1 就必須 Clamp。

能量守恆的照明模型:

http://help.autodesk.com/cloudhelp/2015/ENU/3DSMax/files/GUID-7C3BE331-7BBA-4B17-AD38-02204E5C43B8.htm
「Conservation of Energy
One of the most important features of the Arch Design material is that it is automatically energy conserving. This means that it makes sure that diffuse + reflection + refraction &<= 1. In other words, no energy is 「magically」 created, and the incoming light energy is properly distributed to the diffuse, reflection, and refraction components in a way that maintains the first law of thermodynamics.」
如果材質不透明,就只有 Diffuse 和 Reflection/Specular 守恆,所以可以乘以 Specular 所佔比例,沒有 Clamp。http://seblagarde.wordpress.com/2011/08/17/hello-world/
"Energy conservation should take into account the diffuse and specular term together. For simple no-physical based model (model without Fresnel like Phong or Blinn-Phong), respecting the constraint c_diff + c_spec &<=1 is sufficient. It can be achieved with C_newdiff = (1 - c_spec) c_diff"


顏色混合中的數學運算大多是主觀的,而不是數學的
類似Photoshop中的圖層混合 線性減淡 正片疊底
實際效果要自己測試
BlendOp Add Sub等等等等


推薦閱讀:

如何學習計算機圖形學?
如何看待電影《爵跡》於3月28日曝光的渲染序列及其技術水平?
計算機中的圖片為什麼都是矩形的?顯示圓形也只能周圍透明?
是什麼限制了遊戲或實時圖形, 以至於遠景如山脈, 天空都是紙片貼圖?
為什麼Unreal 4引擎能輕易實時渲染出vray要花半天才能渲染出的場景?

TAG:Unity遊戲引擎 | CG | 計算機圖形學 |