如果要在Fragment中处理光照,不需要将Index,LightDir,传入,因为这些数据不会被插值计算,而Normal会被插值计算,所以只需要将Normal传入计算即可,插值后的数据未被规一化。
Fragment中的Normal被GPU插值计算后,没有规一化,所以用Normal前需要规一化。
Specular_PP中使用的Normal没有被规一化,结果光照不光滑,跟Specular效果没差别.漫反射与纹理颜色混合
漫反射的面积比较大,如果直接与纹理颜色相加,则很容易曝光。需要将其与纹理颜色相乘后,再与其相加,得到的结果才不会过曝。高光与纹理颜色混合
高光颜色与纹理颜色,可以直接相加,或者与纹理颜色相乘后再相加,但得到的效果同不同的。
color.rgb = color.rgb + specColor.rgb // 陶瓷,玻璃的光滑效果
color.rgb = color.rgb + color.rgb * specColor.rgb // 没有了光滑效果,比较写实
Vertex Render Path
a. 只能取 unity_LightPosition[8] unity_LightColor[8] unity_LightAtten[8]中的数据
b. unity_LightPosition存储了平行光,点光源,坐标系为相机空Forward Render Path
a. _WorldSpaceLightPos0只会含有Pixel光源,在ForwardBase中只有场景中存在RenderMode为Important的Pixel平行光时,才可以用_WorldSpaceLightPos0和_LightColor0,坐标为世界坐标
b. ForwardBase中,unity_LightPos[x,y,z]0 unity_LightColor[4]只含有点光源