1. 程式人生 > >Shader學習筆記(三)自定義光照模型,經典光照模型Lambert與HalfLambert

Shader學習筆記(三)自定義光照模型,經典光照模型Lambert與HalfLambert

自定義光照模型

#pragma surface surfaceFaction lightModel

surfaceFaction:著色器程式碼的方法的名字

lightModel:光照模型的名稱

自定義光照模型的命名規則是Lighting+光照模型的名稱

光照模型有5種原型:

half4 LightingName(SurfaceOutput s,fixed3 lightDir,half atten);

half4 LightingName(SurfaceOutput s,fixed3 lightDir,fixed3 viewDir,half atten);

half4 LightingName_PrePass(SurfaceOutput s,half4 light);

half4 LightingName_DirLightmap(SurfaceOutput s,fixed4 color,fixed4 scale,bool surfFuncWritesNormal);

half4 LightingName_DirLightmap(SurfaceOutput s,fixed4 color,fixed4 scale,fixed3 viewDir,bool surFuncWritesNormal,out half3 specColor);

例子:Lambert光照模型

#pragma surface surf BasicDiffuse
inline float4 LightingBasicDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){
		float difLight=max(0,dot(s.Normal,lightDir));
		float4 col;
		col.rgb=s.Albedo*_LightColor0.rgb*(difLight*atten*2);//
		col.a=s.Alpha;
		return col;
	}

LightBasicDiffuse函式輸出的是一個surface上某一點的顏色值和透明度值。s是上一個surf函式的輸出,LightDir是光線方向,光源到物體表面上的點的向量,是單位向量。atten是衰減度,光線被物體反射之後會有能量損失,是Unity內建的一個引數。

float difLight=max(0,dot(s.Normal,lightDir));//計算漫反射的光強,值越大表示法線與光線間的夾角越小,這個點越亮

col.rgb=s.Albedo*_LightColor0.rgb*(difLight*atten*2);//_LightColor0.rgb表示光線的顏色,根據場景中的光源得到的,在Lighting.cginc中有宣告,顏色值=反射值X平行光的顏色值X漫反射光強X衰減度X2

HalfLambert光照模型

#pragma surface surf HalfLambert

inline float4 LightingHalfLambert(SurfaceOutput s,fixed3 lightDir,fixed atten){
		float difLight=dot(s.Normal,lightDir);
		float halfLambert = 0.5 * difLight + 0.5;
		float4 col;
		col.rgb=s.Albedo*_LightColor0.rgb*(halfLambert*atten*2);
		col.a=s.Alpha;
		return col;
	}


Lambert光照模型的漫反射光強區間dot(s.Normal,lightDir)小於0 的部分直接為0,效果是背光的一面也是黑色的,HalfLambert光照模型,小於0的部分會從0漸變到0.5,顏色的灰度是有變化的。同時,亮部的亮度也提高了。 用於低光區域照亮物體,防止某個物體背光面丟失形狀顯得太過平面化。

 #Lambert#


#HalfLambert#


相關推薦

Shader學習筆記定義光照模型經典光照模型LambertHalfLambert

自定義光照模型 #pragma surface surfaceFaction lightModel surfaceFaction:著色器程式碼的方法的名字 lightModel:光照模型的名稱 自

攜程 Apollo 配置中心 | 學習筆記 定義Spring Boot專案通過配置中心啟動專案

一、前言二、專案搭建   2.1 建立Spring Boot專案    因為專案用的是Eureka作為服務註冊與發現,因此這裡我加入了Eureka Client的依賴pom.xml檔案 <dependency> <grou

AngularJs學習筆記4——定義指令

ref 告訴 ack 生命周期 .com bsp ctrl 參數變量 ng- 對指令的第一印象:它是一個自定義標簽! 先來看一個簡單的指令: <!doctype html> <html ng-app="myApp"> <head>

Ehcache學習筆記2--定義ehcache工具類

二:自定義EhcacheUtils 1、CacheUtils package cn.kexq.commons.utils; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.eh

shiro學習筆記3--定義realm、授權

一:自定義Realm 1、繼承AuthorizingRealm(因為該類中有認證、授權的抽象方法,實現簡單) public class MyRealm1 extends AuthorizingRealm{ @Override public String getName(

Vue:學習筆記-定義指令

提醒 原帖完整收藏於IT老兵驛站,並會不斷更新。 前言 前面總結到了元件,對混入也進行了研究,不過感覺沒有啥需要總結的,就先總結指令吧,參考這裡,記錄筆記。 正文 簡介 全域性註冊 // 註冊一個全域性自定義指令 `v-focus` Vue.di

Robot framework學習筆記通過定義自己的python庫連結mysql

今天看了一些連結資料庫的方法,發現官網提供的DatabaseLibrary只提供了和資料庫直連的方法,現實中很多公司出於安全考慮,都是通過跳板機的方式連結。(跳板機是開發者登入到網站分配給應用伺服器的唯一途徑。開發者必須首先登入跳板機,再通過跳板機登入到應用伺服器)。 顯然

springmvc學習筆記26——定義型別轉換器

資料繫結流程 使用springmvc框架有諸多好處,其中較為突出的就是它的資料繫結。 當我們的前端傳過來一個表單的時候,我們只需要使用一個類物件(如Student物件)就接收,springmvc將幫我們把屬性一一對應的填充進去。這就是資料繫結。 資料繫結過程中,springmvc幫我們把前端

springmvc學習筆記28——定義攔截器

1. 自定義攔截器 所謂的攔截器,就是用來攔截請求,因此我們可以對使用者發來的請求做處理。  寫一個類,實現攔截器的介面 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.H

類的學習筆記3——定義裝飾器及裝飾器的理解

例一: 實現多加100 def fun1(x):      def fun2(y):           return x(y)+100       return fun2              #裝飾器 def ff(y):       return y*y   

Shader學習筆記Shader中的光照

這篇文章討論shader中用到的光照。 理解光照 Unity中的光照技術包括: 實時光照(realtime lighting) 烘焙後的光照貼圖(baked lightmaps) 預計算的實時全域性光照(precomputed realtime gl

Maven學習筆記——定義maven變數以及maven內建常量

在建立Maven工程後,外掛配置中通常會用到一些Maven變數,因此需要找個地方對這些變數進行統一定義,下面介紹如何定義自定義變數。 在根節點project下增加properties節點,所有自定義變數均可以定義在此節點內,如下所示: <!-- 全域性屬性配置 --

Latex學習筆記——定義Latex模板

前言:         對於一個給定的模板,自己做了修改,用於日常工作寫報告使用(主要去除了封面和摘要部分),包含兩個檔案:(1) cls 檔案裡面定義好了常用的格式和環境;(2) tex 檔案裡面是我們文件內容的原始碼。當然,大家也可以根據自己的需要進行更改。 一、

MyBatis學習筆記mybatis-config.xml都有哪些配置之typeAliasesplugins

類型別名(typeAlicases) 在mybatis-config.xml配置檔案中加入類描述 <typeAliases> <typeAlias type="org.mybatis.example.User" alias="User" />

Python學習筆記:pip安裝方法import相關用法

就當是記個筆記了。這是Linux系統下的pip安裝方法: pip安裝方法 一: get http://python-distribute.org/distribute_setup.py sudo python distribute_setup.py

【web框架】【zheng學習筆記】【阿里雲定義映象的使用】

要想成功執行zheng專案,必須要安裝JDK,Tomcat,Redis,Zookeeper等工具,如果下次再買新的伺服器,又重新安裝這些軟體,阿里雲提供了自定義映象功能,可以快速複製伺服器,免除了再次配置環境的痛苦。 背景: 華東2區有原來的A伺服器,在華北3區新購了B伺服器,想要把A的系統

Opengl es2.0 學習筆記shader的使用

一.shader Opengl es渲染管線中有兩處可以程式設計,一個是頂點著色器 一個是畫素著色器/片圓著色器 不清楚的可以 看看OpenGLes 渲染管線 二.API //建立shader,返回shader Id //param: //GL_VERTE

Maven學習筆記—— 使用Maven帶的功能建立Java和JavaWeb專案

一、使用Maven建立Java專案1、開啟命令視窗,輸入建立命令使用shift+右鍵單擊,選擇在此處選擇開啟命令視窗,輸入如下命令:mvn archetype:generate -DgroupId=com.mengfei.demo -DartifactId=MavenJava

unity shader學習筆記——基礎光照之標準光照模型定義

標準光照模型 標準光照模型只關心直接光照(direct light)。它把進入攝像機的光照分為4個部分: 自發光(emissive),這部分用於給定一個方向時,物體表面會向這個方向產生多少的光,當沒有使用全域性光照時,自發光物體不會照亮周圍物體,只是本身看

JAVA學習筆記

byte repl efi ber 時間 clas 區分大小寫 增強for size @SuppressWarnings("resource")是用來壓制資源泄露警告的。比如使用io類,最後沒有關閉。Set集合特點:1)無序,不隨機2)元素唯一3)沒下標註意:Collect