原创 【UnityShader】透明度混合

快速瀏覽總述透明度混合基本原理透明度混合的實現Blend 命令關閉深度寫入帶來的問題開啓深度寫入的半透明效果ColorMaskShaderLab的混合命令注意Blend命令詳述混合因子BnendOp BlendOperation(

原创 【UnityShader】透明效果和渲染順序

Unity 中實現透明效果的方法: 透明度測試; 透明度混合; 深度緩衝 深度緩衝,根據深度緩存中的值來判斷該片元距離攝像機的距離,當渲染一個片元時,需要把它的深度值和已經存在於深度緩衝中的進行比較(如果開啓了深度測試),如果

原创 【UnityShader】透明度測試

透明度度測試缺點 透明度度測試結果,要麼完全透明,要麼完全不透明;而且,得到的透明度效果在邊緣處往往參差不齊,有鋸齒,這是因爲在邊界處紋理的透明度的變化精度問題。 透明度測試基本原理: 只要一個片元的透明度不滿足條件(通常是小於某

原创 【UnityShader】雙面渲染的透明效果

目錄總述透明度測試的雙面渲染透明度混合的雙面渲染透明度測試雙面渲染的實現透明度混合雙面渲染的實現 總述 在現實生活中,如果一個物體是透明的,意味着我們不僅僅可以透過它看到其他物體的樣子,也可以看到它內部的結構。但是在前面實現的透明

原创 【UnityShader】基礎光照類型

目錄綜述準光照模型自發光(Cemissive)高光反射(Cspecular)漫反射(Cdiffuse)環境光(Cambient)標準光照模型公式環境光自發光漫反射高光反射Phong 模型計算高光反射的部分:Blinn 模型的公式比

原创 【UnityShader】紋理基礎與屬性

紋理基礎知識 紋理的最初目的是使用一張圖片來控制模型的外觀,使用紋理映射技術,可以把一張圖“黏”在模型的表面,逐紋素的控制模型的顏色。 UV座標通常被歸一化到[0, 1]範圍內。 在 OpenGL 中,紋理空間的原點位

原创 【UnityShader】遮罩紋理

基礎知識 遮罩運行我們可以保護某些區域,使它們免於某些修改。 常見使用 在之前的實現中,我們都是把高光反射應用到模型表面的所有地方,即所有的像素都使用同樣大小的高光強度和高光指數。但有時,我們希望模型表面某些區域的反光強

原创 【UnityShader】高光反射光照模型

光照模型 基本光照模型中高光反射部分的計算公式 Cspecular = (Clight * Mspecular)max(0, v*r)Mgloss 參數:   Mgloss 光澤度,反光度,控制高光區域的大小,值越大,亮點越小  

原创 【UnityShader】漫反射光照模型

蘭伯特光照模型 Cdiffuse = (Clight*Mdiffuse)max(0,n*l) 參數:   n 表面法線   I 指向光源的單位矢量   Mdiffuse 材質的漫反射顏色   Clight 光源顏色   max 防

原创 【UnityShader】常用的內置變量、函數、語義等

目錄UnityCG.cgincUnityCG.cginc中一些常用的結構體常用的幫助函數宏Lighting.cgincUnityShaderVariables.cginc內置變換矩陣Unity內置的攝像機和屏幕參數語義從應用階段傳

原创 【UnityShader】漸變紋理

基礎知識 使用漫反射浮點值來映射到漸變圖上的某一個顏色值,最終根據燈光計算後的方向來映射整個漸變紋理到物體表面。 紋理其實可以用於存儲任何表面屬性。一種常見的用法就是使用漸變紋理來控制漫反射光照的結果。在之前計算漫反射光照

原创 【UnityShader】座標變換之法線變換

  一般來說,點和絕大部分方向矢量都可以使用同一個 4x4 或者 3x3 的變換矩陣把其從座標空間 A 變換到座標空間 B中。但變換法線的時候,如果使用同一個變換矩陣,可能無法維持法線的垂直性。如下圖所示,在進行非統一縮放時,如果

原创 【UnityShader】凹凸映射之高度貼圖和法線貼圖

目錄基礎知識高度紋理Unity 中的法線紋理類型法線紋理 基礎知識 紋理的另一種場景的應用就是凹凸映射。凹凸映射的目的是使用一張紋理來修改模型表面的法線,以便爲模型提供更多的細節。這種方法不會真的改變模型的頂點位置,只是讓模型

原创 【UnityShader】座標空間與座標變換

座標空間變換 每個座標空間都是另一個座標空間的子空間,反過來,每個座標空間都有一個父座標空間; 對座標空間的變換實際上就是在父空間和子空間之間點和矢量進行變換; 假設 現有父座標空間 P 以及子座標空間 C,已知在父座標空間中子

原创 【UnityShader】數學基礎

總結 對於觀察空間(以攝像機爲原點的座標系),Unity使用的是右手座標系。對於模型空間和世界空間,Unity使用的是左手座標系。 矢量是指n維空間中一種包含模和方向的有向線段。 在Unity中,常規做法是把矢量放在矩陣的右側,