博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity Shaders and Effects Cookbook (3-5) 金属软高光
阅读量:5777 次
发布时间:2019-06-18

本文共 2251 字,大约阅读时间需要 7 分钟。

书上这一节看得我头昏脑胀,数学渣表示自理不能…… 并且也不了解这个效果的实际意义。

先记录下来,后面真正看懂了再来补充具体理论。

通过一张纹理贴图,定义高光的形状,利用到的纹理贴图有三种

这里并非把纹理 UV映射。而是读取了 R通道值。

这几张图都是黑白的,也就是说。像素的一个点的 RGB 是同样值,所以 读取 R 或者 读取 G、B都是同等的。

着色器代码为高光生成了一些粗糙度值。

然后这节利用菲涅尔法则,当我们的视线刚好正对着物体表面的时候,会帮我们屏蔽高光。

转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn

这一节的完整Shader代码:

Shader "CookBookShaders/Metallicsoft" {	Properties 	{		_MainTex ("Base (RGB)", 2D) = "white" {}		_MainTint ("Diffuse Tint",Color)=(1,1,1,1)		_RoughnessTex("Roughness Texture",2D)="white"{}		_Roughness("Roughness",Range(0,1))=0.5		_SpecularColor("Specular Color",Color)=(1,1,1,1)		_SpecularPower("Specular Power",Range(0,30))=2		_Fresnel("Fresnel",Range(0,1.0))=0.05	}	SubShader {		Tags { "RenderType"="Opaque" }		LOD 200				CGPROGRAM		#pragma surface surf Metallicsoft		sampler2D _MainTex;		float4  _MainTint;		sampler2D _RoughnessTex;		float _Roughness;		float4 _SpecularColor;		float _SpecularPower;		float _Fresnel;		struct Input {			float2 uv_MainTex;		};		void surf (Input IN, inout SurfaceOutput o) 		{			half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;			o.Albedo = c.rgb;			o.Alpha = c.a;		}		inline fixed4 LightingMetallicsoft(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)		{			//先计算出来全部的漫反射以及视点相关的向量;			float3 halfVector=normalize(lightDir + viewDir);			float NdotL=saturate(dot(s.Normal,normalize(lightDir)));			float NdotH_raw=dot(s.Normal,halfVector);			float NdotH = saturate(dot(s.Normal,halfVector));			float NdotV=saturate(dot(s.Normal,normalize(viewDir)));			float VdotH=saturate(dot(halfVector,normalize(viewDir)));			//生成一些粗糙度值,然后从纹理中读取高光形状			float geoEnum=2.0*NdotH;			float3 G1=(geoEnum * NdotV)/NdotH;			float3 G2=(geoEnum * NdotL)/NdotH;			float3 G= min(1.0f,min(G1,G2));			float roughness=tex2D(_RoughnessTex,float2(NdotH_raw * 0.5 +0.5,_Roughness)).r;			//菲涅尔准则;当我们视线正好对着物体表面时,会帮我们屏蔽高光;			float fresnel=pow(1.0-VdotH,5.0);			fresnel*=(1.0-_Fresnel);			fresnel+=_Fresnel;			//组合计算高光值;			float3 specular=float3(fresnel * G * roughness * roughness) * _SpecularPower;			//漫反射 加上 高光 			float4 c;			c.rgb=(s.Albedo * _LightColor0.rgb * NdotL)+(specular * _SpecularColor.rgb)*(atten * 2.0f);			c.a=s.Alpha;			return c;		}		ENDCG	} 	FallBack "Diffuse"}
測试效果

演示样例project下载:

http://pan.baidu.com/s/1bpDfEpT

你可能感兴趣的文章
20个Linux服务器性能调优技巧
查看>>
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
实时编辑
查看>>
KVO原理分析及使用进阶
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
Microsoft发布了Azure Bot Service和LUIS的GA版
查看>>
Google发布Puppeteer 1.0
查看>>
.NET开源现状
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>
ChPlayer播放器的使用
查看>>
js 经过修改改良的全浏览器支持的软键盘,随机排列
查看>>
Mysql读写分离
查看>>