标签:游戏 密度 其他 cti 材质 tar 颜色 unity iss
游戏中摄像机所看到的世界与我们现实中所看到的几乎是一样的。
光线与物体相交的结果有两个:散射(scattering)和吸收(absorption)
用不同的光照模型来计算两种不同的散射方向:漫反射模型和高光反射模型。
把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度。
直接采用了该材质的自发光颜色。
Phong模型公式
specular = (light · shininess)max(0, v · r)^gloss
Blinn模型公式
specular = (light · shininess)max(0, v · h)^gloss
兰伯特定律
diffuse = (light · diffuseColor)max(0, n · l)
代码示例(环境光+漫反射+高光反射)
Shader "Unity My Shader/Diffuse Light" { Properties { _Color("Color", Color) = (1,1,1,1) _Specular("Specular", Color) = (1,1,1,1) _Gloss("Gloss", Range(8.0, 256)) = 20 } SubShader { Pass { Tags{"LightMode"="ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" fixed4 _Color; fixed4 _Specular; float _Gloss; struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 pos : SV_POSITION; float3 worldPos : TEXCOORD0; float3 worldNormal : TEXCOORD1; }; v2f vert (a2v v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.worldPos = mul(unity_ObjectToWorld, v.vertex); // 模型坐标顶点转换世界坐标顶点 o.worldNormal = UnityObjectToWorldNormal(v.normal); // 模型坐标法线转换世界坐标法线 return o; } fixed4 frag (v2f i) : SV_Target { fixed3 worldNormal = normalize(i.worldNormal); // 法线方向 fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos)); // 光照方向 fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos)); // 视角方向 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //环境光 fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir)); // 漫反射 fixed3 halfDir = normalize(worldViewDir + worldLightDir); // Blinn模型 计算 h fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldViewDir, halfDir)), _Gloss); // 高光反射 return fixed4(ambient + diffuse + specular, 1); // 相加后输出颜色 } ENDCG } } }
标签:游戏 密度 其他 cti 材质 tar 颜色 unity iss
原文地址:http://www.cnblogs.com/SHOR/p/7872024.html