unity shader学习笔记(三)——在Unity中计算高光反射光照
来源:互联网 发布:js给时间控件赋值 编辑:程序博客网 时间:2024/05/02 00:25
逐顶点计算高光反射光照
Phong模型计算方法
以下是在顶点着色器中使Phong模型计算高光反射光照的shader代码:
Properties{ _Diffuse("Diffuse", Color) = (1.0, 1.0, 1.0, 1.0) _Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0) _Gloss("Gloss", Range(8.0, 256)) = 20}SubShader{ Pass { Tags{ "LightMode" = "ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _Diffuse; fixed4 _Specular; float _Gloss; struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 position : SV_POSITION; fixed3 color : COLOR; }; v2f vert(a2v a) { v2f v; v.position = UnityObjectToClipPos(a.vertex); //把法线转化为世界坐标下的法线 fixed3 worldNormal = normalize(mul(a.normal, (float3x3)unity_WorldToObject)); //环境光 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //光照 fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); //漫反射光 fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight)); //摄像机方向 fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul((float3x3)unity_WorldToObject, a.vertex)); //反射光 fixed3 reflectDir = normalize(reflect(-worldLight, worldNormal)); //高光反射 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(viewDir, reflectDir)), _Gloss); //颜色 v.color = ambient + diffuse + specular; return v; } fixed4 frag(v2f a) : SV_Target { return fixed4(a.color, 1.0); } ENDCG }}FallBack "Specular"
_WorldSpaceCameraPos是世界空间下摄像机的位置。
reflect方法是用来计算入射方向。
Blinn-Phong模型计算方法
Blinn-Phong模型只需要将下面代码:
//反射光fixed3 reflectDir = normalize(reflect(-worldLight, worldNormal));//高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(viewDir, reflectDir)), _Gloss);
替换为:
fixed3 halfDir = normalize(worldLight + viewDir);//高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);
逐像素计算高光反射光照
以下是在片元着色器中使Phong模型计算高光反射光照的shader代码:
Phong模型计算方法
Properties{ _Diffuse("Diffuse", Color) = (1.0, 1.0, 1.0, 1.0) _Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0) _Gloss("Gloss", Range(8.0, 256)) = 20}SubShader{ Pass { Tags{ "LightMode" = "ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _Diffuse; fixed4 _Specular; float _Gloss; struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 position : SV_POSITION; float3 worldNormal : TEXCOORD0; float3 worldPos : TEXCOORD1; }; v2f vert(a2v a) { v2f v; v.position = UnityObjectToClipPos(a.vertex); //把法线转化为世界坐标下的法线 v.worldNormal = normalize(mul(a.normal, (float3x3)unity_WorldToObject)); //把顶点坐标转化为世界坐标 v.worldPos = normalize(mul(unity_ObjectToWorld, a.vertex)); return v; } fixed4 frag(v2f a) : SV_Target { //环境光 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //光照 fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); //漫反射光 fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(a.worldNormal, worldLight)); //摄像机方向 fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - a.worldPos.xyz); //反射光 fixed3 reflectDir = normalize(reflect(-worldLight, a.worldNormal)); //高光反射 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(viewDir, reflectDir)), _Gloss); //颜色 fixed3 color = ambient + diffuse + specular; return fixed4(color, 1.0); } ENDCG }}FallBack "Specular"
Blinn-Phong模型计算方法
同上……
阅读全文
0 0
- unity shader学习笔记(三)——在Unity中计算高光反射光照
- unity shader学习笔记(二)——在Unity中计算漫反射光照
- Unity Shader入门精要笔记(十):Unity 的基础光照——高光反射的实现
- Unity Shader 学习笔记(7) 高光反射
- unity之shader学习笔记(四)--高光反射
- unity shader (6)--实现高光反射光照模型
- unity shader学习笔记(十五)——Unity中的复杂光照之光照衰减
- unity shader (7)--实现高光反射光照模型--逐像素光照
- unity shader中高光反射光照模型之顶点光照
- unity shader学习笔记(十三)——Unity中的复杂光照之渲染路径
- unity shader学习笔记(十四)——Unity中的复杂光照之光源类型
- unity shader学习笔记(一)——基础光照之标准光照模型定义
- Unity Shader学习笔记:反射
- Unity Shader学习笔记:标准光照模型
- Unity Shader学习笔记:光照衰减
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
- Unity Shader入门精要笔记(八):Unity 的基础光照——概念与理论
- Unity Shader入门精要笔记(九):Unity 的基础光照——漫反射的实现
- 利用purecss和zepto构建响应式网站
- dom写一个write xml文件
- 51NOD-1018 排序
- QZXing 的编译和使用
- python处理Excel文件
- unity shader学习笔记(三)——在Unity中计算高光反射光照
- HDU 1238 Substrings(strstr函数)
- CNN目标检测与分割(一):Faster RCNN详解
- 【bzoj3522】[Poi2014]Hotel 树形dp
- JVM之字节码执行引擎
- 2440核心初始化
- 位运算
- 第11章 进入保护模式
- 注册JDBC驱动的三种方式