首页 > 编程知识 正文

shader常用算法,计算shader

时间:2023-05-03 10:51:00 阅读:270289 作者:4542

原谅我,不是很懂这些公式的含义,所以用这个土方法,我想应该有不少人都是这样的,下面的步骤对应是在什么地方做这些动作

1. struct a2v{};(application to view)

2. struct v2f{}

3.v2f vert(a2v v){}

4.fixed4 frag(v2f f){}

一.转换坐标(必有)

1 .float4 vertex:POSITION;

2 .float4 svpos:SV_POSITION;

3 .//将坐标从模型空间转换到剪裁空间
f.svpos = UnityObjectToClipPos(v.vertex);

二.获得法线的直线(必有)

1.float3 normal:NORMAL;

2.float3 worldNormal:TEXCOORD0;

3.f.worldNormal = UnityObjectToWorldNormal(v.normal);

4.//获取法线的直线
   fixed3 normalDir = normalize(f.worldNormal);

三.获取平行光的直线

2.float4 worldVertex:TEXCOORD1;

3.//获得世界顶点(用来获取光源的直线)//(获取摄像机的直线也是这个?)
f.worldVertex = mul(v.vertex, unity_WorldToObject);

4.//获取平行光的直线
fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex));

四.获取相机的视野直线

//相机的视野直线
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex));

五.//平分线的直线
fixed3 halfDir = normalize(lightDir + viewDir);

六.//获取漫反射颜色
fixed3 diffuse = _LightColor0 * _Diffuse.rgb * max(dot(normalDir, lightDir)*0.5+0.5, 0);

七.//获取高光反射的颜色值
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir,halfDir), 0), _Gloss);

八获取环境光的颜色

UNITY_LIGHTMODEL_AMBIENT.rgb

九.设置纹理

Pro_MainTex("Textur",2D) = "white"{}

sampler2D _MainTex;
float4 _MainTex_ST;

1.float4 texcoord:TEXCOORD0;

2.float2 uv:TEXCOORD2;

3.//取得纹理顶点
f.uv = v.texcoord.xy * _MainTex_ST.xy+_MainTex_ST.zw;

4.//获取漫反射颜色(此处将漫反射的颜色抹去,换成了纹理的颜色)
fixed3 texColor = tex2D(_MainTex,f.uv.xy);
fixed3 diffuse = _LightColor0 * texColor * max(dot(normalDir, lightDir)*0.5+0.5, 0);

10.对物体表面的凹凸性进行处理(只需要改变切线空间的法线)

Pro: _BumpScale("Bump Scale",Float)=1//保持默认的样子

Float _BumpScale;

tangentNormal.xy = tabgentNormal.xy * _BumpScale ; (在单位化之前处理)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。