Unity shader学习之高光反射光照模型
2017-06-28 09:37
417 查看
高光反射光照模型的公式如下:
Cspecular = Clight * mspecular * max(0, dot(v, r))gloss
要计算高光反射需要知道4个参数:入射光线颜色Cspecular,材质高光反射系数gloss,视角方向v和反射方向r。
其中r可由cg函数reflect(i, n)求得。
转载请注明出处:http://www.cnblogs.com/jietian331/p/7088297.html
逐顶点高光反射shader如下:
Custom/Specular Fragment-Level
效果分别如下:
Cspecular = Clight * mspecular * max(0, dot(v, r))gloss
要计算高光反射需要知道4个参数:入射光线颜色Cspecular,材质高光反射系数gloss,视角方向v和反射方向r。
其中r可由cg函数reflect(i, n)求得。
转载请注明出处:http://www.cnblogs.com/jietian331/p/7088297.html
逐顶点高光反射shader如下:
1 Shader "Custom/Specular Fragment-Level" 2 { 3 Properties 4 { 5 _Diffuse ("Diffuse Color", Color) = (1,1,1,1) 6 _Specular ("Specular Color", Color) = (1,1,1,1) 7 _Gloss ("Gloss", Range(8, 256)) = 8 8 } 9 SubShader 10 { 11 Tags { "RenderType"="Opaque" } 12 LOD 100 13 14 Pass 15 { 16 Tags { "LightMode"="ForwardBase" } 17 18 CGPROGRAM 19 #pragma vertex vert 20 #pragma fragment frag 21 22 #include "UnityCG.cginc" 23 #include "Lighting.cginc" 24 25 struct appdata 26 { 27 float4 vertex : POSITION; 28 float3 normal : NORMAL; 29 }; 30 31 struct v2f 32 { 33 float4 vertex : SV_POSITION; 34 float3 worldPos : TEXCOORD0; 35 float3 worldNormal : TEXCOORD1; 36 }; 37 38 fixed4 _Diffuse; 39 fixed4 _Specular; 40 float _Gloss; 41 42 v2f vert (appdata v) 43 { 44 v2f o; 45 o.vertex = UnityObjectToClipPos(v.vertex); 46 o.worldNormal = UnityObjectToWorldNormal(v.normal); 47 o.worldPos = mul(unity_ObjectToWorld, v.vertex); 48 return o; 49 } 50 51 fixed4 frag (v2f i) : SV_Target 52 { 53 // specular 54 float3 worldNormal = normalize(i.worldNormal); 55 float3 lightDir = UnityWorldSpaceLightDir(i.worldPos); 56 lightDir = normalize(lightDir); 57 float3 refLightDir = reflect(-lightDir, worldNormal); 58 refLightDir = normalize(refLightDir); 59 float3 viewDir = UnityWorldSpaceViewDir(i.worldPos); 60 viewDir = normalize(viewDir); 61 float d = max(0, dot(refLightDir, viewDir)); 62 float3 spec = _LightColor0.rgb * _Specular.rgb * pow(d, _Gloss); 63 64 // diffuse 65 float3 diff = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(lightDir, worldNormal)); 66 67 float3 c = spec + diff + UNITY_LIGHTMODEL_AMBIENT.rgb; 68 return fixed4(c, 1); 69 } 70 ENDCG 71 } 72 } 73 }
Custom/Specular Fragment-Level
效果分别如下:
相关文章推荐
- unity shader (6)--实现高光反射光照模型
- unity shader (7)--实现高光反射光照模型--逐像素光照
- 《unityshader 入门精要》漫反射光照与高光反射光照模型学习笔记
- unity shader中高光反射光照模型之顶点光照
- UnityShader初级篇——实现逐顶点高光反射光照模型
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
- Unity Shader学习-3.光照模型
- UnityShader入门精要学习笔记(六):Unity中实现高光反射模型
- 基本光照模型实现-高光反射
- Shader自学笔记 2.2.2 逐像素高光反射光照模型
- Unity Shader入门精要笔记(十):Unity 的基础光照——高光反射的实现
- 高光和金属反射光照模型
- Unity3D - Shader - 高光反射光照模型
- UnityShader初级篇——实现逐像素高光反射光照模型
- Unity shader学习之半兰伯特光照模型
- 高光和金属反射光照模型
- Shader自学笔记 2.2.1 逐顶点高光反射光照模型
- Unity Shader基础的使用 基础、法线贴图及光照模型代码的注释
- 进阶光照与材质之光照和反射模型
- 3D图形学编程基础-基于Direct3D11-学习记录(二)光照模型的实现