Unity3D shader(9)——vertex shader(phong光照和BlinnPhong光照)
来源:互联网 发布:网络arp攻击怎么办 编辑:程序博客网 时间:2024/05/03 15:54
首先来看一下反射原理:首先通过L和N来求出R的向量,然后求出视角的向量V,最后将V和R点乘,可以求出光照强度。
承接上一篇,具体代码如下:
Shader "Custom/Vf Shader" {properties{_SpecularColor("SpecularColor",color)=(1,1,1,1)_Shininess("Shininess",range(1,8))=4}SubShader {PASS{tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" float _Shininess; float4 _SpecularColor; struct v2f{ float4 pos:POSITION; float4 col:COLOR; }; v2f vert(appdata_base v){ v2f o; o.pos=UnityObjectToClipPos(v.vertex); float3 N=normalize(v.normal); float3 L=normalize(_WorldSpaceLightPos0); //float3 L2=mul(_World2Object,float4(L,0)).xyz; //float ndotl=saturate(dot(N,L2)); N=mul(float4(N,0),_World2Object); N=normalize(N); float ndotl=saturate(dot(N,L)); float3 I=-WorldSpaceLightDir(v.vertex); float3 R=reflect(I,N); float3 V=WorldSpaceViewDir(v.vertex); R=normalize(R); V=normalize(V); float specularScale=pow(saturate(dot(R,V)),_Shininess); float3 wpos=mul(_Object2World,v.vertex); o.col=_LightColor0*ndotl*specularScale*_SpecularColor; o.col.rgb+=Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb, unity_4LightAtten0, wpos,N ) ; return o; } float4 frag(v2f IN):COLOR{ return IN.col+UNITY_LIGHTMODEL_AMBIENT; }ENDCG}}FallBack "Diffuse"}最后的效果如图:
接着来看一下BlinnPhong的原理,通过L和V得到H向量,然后将H向量和N向量点乘得到光照强度。BlinnPhong的计算速度更快,因为它少了反射向量的计算。
Shader "Custom/Vf Shader" {properties{_SpecularColor("SpecularColor",color)=(1,1,1,1)_Shininess("Shininess",range(1,8))=4}SubShader {PASS{tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" float _Shininess; float4 _SpecularColor; struct v2f{ float4 pos:POSITION; float4 col:COLOR; }; v2f vert(appdata_base v){ v2f o; o.pos=UnityObjectToClipPos(v.vertex); float3 N=normalize(v.normal); float3 L=normalize(_WorldSpaceLightPos0); //float3 L2=mul(_World2Object,float4(L,0)).xyz; //float ndotl=saturate(dot(N,L2)); N=mul(float4(N,0),_World2Object); N=normalize(N); float ndotl=saturate(dot(N,L)); float3 I=normalize(-WorldSpaceLightDir(v.vertex)); float3 V=normalize(WorldSpaceViewDir(v.vertex)); float3 H=I+V; float specularScale=pow(saturate(dot(H,N)),_Shininess); float3 wpos=mul(_Object2World,v.vertex); o.col=_LightColor0*ndotl*specularScale*_SpecularColor; o.col.rgb+=Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb, unity_4LightAtten0, wpos,N ) ; return o; } float4 frag(v2f IN):COLOR{ return IN.col+UNITY_LIGHTMODEL_AMBIENT; }ENDCG}}FallBack "Diffuse"}
阅读全文
0 0
- Unity3D shader(9)——vertex shader(phong光照和BlinnPhong光照)
- Unity3D Shader(10)——Fragment Shader(漫反射、phong效果、blinnPhong效果、阴影、halfLambert、渐变纹理)
- <Shader>phong 光照模型和 blinn phong 模式
- Shader基于顶点编程的Lambert光照,Phong光照和Blinn-Phong光照
- Shader基于片段编程的Lambert光照,Phong光照和Blinn-Phong光照
- Vertex Shader - 散射光照处理
- Unity3D 自动光照 shader
- Unity3d Shader光照模型
- Unity3D shader(5)——vertex shader(一)
- Unity3D Shader(8)——Vertex Shader(漫反射)
- Unity Shader-Phong光照模型与Specular
- Unity Shader-Phong光照模型与Specular
- Shader山下(二)光照模型——漫反射
- unity shader学习笔记(一)——基础光照之标准光照模型定义
- unity shader学习笔记(十五)——Unity中的复杂光照之光照衰减
- Shader自学笔记 2.2.3 BlinnPhong光照模型
- Unity3D -- 光照常用函数和变量(Shader学习之二)
- Unity3D shader(6)——vertex shader(顶点颜色变换)
- jdbc参数量、subList、jsp卡
- The 3n + 1 problem
- Python中reduce与lambda的结合使用
- zoj3609----Modular Inverse (扩展欧几里德)
- JavaScript离线应用与客户端存储
- Unity3D shader(9)——vertex shader(phong光照和BlinnPhong光照)
- git学习
- 决策树分类的一个入门示例
- TensorFlow:Object_Detection_API在Windows10上的配置
- Mac系统隐藏和显示文件
- 用最简单快捷的方法用js写一个计算器
- HashMap的实现原理
- brctl网桥配置命令、网卡的链路聚合
- Log4j类详解(org.apache.log4j.Logger)