zoukankan      html  css  js  c++  java
  • unity shader入门(三)逐像素光照,Blinn-Phong模型

    与上篇逐顶点光照很像,只是改为在片元着色器中计算光照,下为逐像素光照shader

    Shader "study/Chapter6/PixelShader"{
    	Properties{
    		_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
    		}
    	SubShader{
    		Pass{
    			Tags{"LightMode"="ForwardBase"}
    
    			CGPROGRAM
    
    			#pragma vertex vert
    			#pragma fragment frag
    
    			#include "Lighting.cginc"
    
    			fixed4 _Diffuse;
    			struct a2v {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    			};
    			
    			struct v2f {
    				float4 pos : SV_POSITION;
    				float3 worldNormal : TEXCOORD0;
    			};
    
    			v2f vert(a2v v) {
    				v2f o;
    				// Transform the vertex from object space to projection space
    				o.pos = UnityObjectToClipPos(v.vertex);
    
    				// Transform the normal from object space to world space
    				o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
    
    				return o;
    			}
    
    			fixed4 frag(v2f i) : SV_Target {
    				// Get ambient term
    				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
    				
    				// Get the normal in world space
    				fixed3 worldNormal = normalize(i.worldNormal);
    				// Get the light direction in world space
    				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
    				
    				// Compute diffuse term
    				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));
    				
    				fixed3 color = ambient + diffuse;
    				
    				return fixed4(color, 1.0);
    			}
    			ENDCG
    		}
    	}
    	FallBack "Diffuse"
    }
    

    下为半兰伯特光照模型

    广义的半兰伯特光照模型公式如下:

    漫反射(Cdiffuse)=((Clight) * (Mdiffuse))(α(n*I)+β)

    半兰伯特模型没有使用max防止表面法线和光照方向的点成为负值,而是进行了α倍的缩放和一个β倍的偏移,大多情况下α和β均为0.5

    Shader "study/Chapter6/Half Lambert" {
    	Properties {
    		_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
    	}
    	SubShader {
    		Pass { 
    			Tags { "LightMode"="ForwardBase" }
    		
    			CGPROGRAM
    			
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "Lighting.cginc"
    			
    			fixed4 _Diffuse;
    			
    			struct a2v {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    			};
    			
    			struct v2f {
    				float4 pos : SV_POSITION;
    				float3 worldNormal : TEXCOORD0;
    			};
    			
    			v2f vert(a2v v) {
    				v2f o;
    				// Transform the vertex from object space to projection space
    				o.pos = UnityObjectToClipPos(v.vertex);
    				
    				// Transform the normal from object space to world space
    				o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
    				
    				return o;
    			}
    			
    			fixed4 frag(v2f i) : SV_Target {
    				// Get ambient term
    				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
    				
    				// Get the normal in world space
    				fixed3 worldNormal = normalize(i.worldNormal);
    				// Get the light direction in world space
    				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
    				
    				// Compute diffuse term
    				fixed halfLambert = dot(worldNormal, worldLightDir) * 0.5 + 0.5;
    				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert;
    				
    				fixed3 color = ambient + diffuse;
    				
    				return fixed4(color, 1.0);
    			}
    			
    			ENDCG
    		}
    	} 
    	FallBack "Diffuse"
    }
    

      

  • 相关阅读:
    使用vue vantUi框架 根字体是37.5 和默认根字体75不一致,导致页面组件样式变小
    html2canvas ---- canvas里的width和style里面的width区别
    禁止浏览器记住密码操作
    微信小程序的学习和应用
    关于swiper的使用 安卓没有反应
    iconfont阿里云的使用
    Node.js与MongoDB的合作
    Hacker2
    SR选取公式
    树莓派设置静态ip2
  • 原文地址:https://www.cnblogs.com/lanrenqilanming/p/7704101.html
Copyright © 2011-2022 走看看