1. 程式人生 > >一、Unity中Shader的三種基本類型

一、Unity中Shader的三種基本類型

ron 光照 llb 代碼 com unity3d ogr 不同 部分

一、固定功能著色器(Fixed Function Shader)

固定功能著色器為固定功能渲染管線的具體表現。功能較簡單兼容比較老的機器

二、表面著色器

存在於Unity3D中由U3D發揚光大的一門技術。Untiy3D為我們把Shader的復雜性包裝起來,降低shader的書寫門檻,創建了表面著色器

三、頂點著色器和片段著色器

GPU上含有兩個組件:可編程頂點處理器和可編程片段處理器,頂點和片段處理器被分離成可編程單元,可編程頂點處理器是一個硬件單元,可以運行頂點程序,而可編程片段處理器則是一個可以運行片段程序的單元。頂點著色器:頂點著色程序從GPU前端(寄存器)中提取圖元信息(頂點位置、法向量、紋理坐標),並完成頂點坐標空間變換、法向量空間轉換、光照計算等操作,最後將計算數據傳送到指定寄存器中。片段著色器片段程序從上述寄存器中獲取需要的數據:紋理坐標與光照信息等,並根據這些信息以及從應用程序傳遞的紋理信息進行每個片段的顏色計算(紋理查詢),最後將處理後的數據傳送光柵操作模塊。

三種著色器的共同點:

都必須從唯一一個根Shader開始
Prooerties參數部分,作用以及語法完全相同。
具體功能都在SubShader裏。
都可以打標簽
都可以Fallback
都可以處理基本的功能,例如光照漫反射以及鏡面反射。但如uv計算效果等高級功能,固定功能著色器無法完成。
三種著色器的不同點
表面著色器沒有通道pass{},加了會報錯,該著色器已經把具體內容打包在光照模型中了。
固定渲染管線每句代碼之後都沒有“;”
核心結構不同:

固定渲染管線的核心是:

Material{}以及SetTexture[_MainTex]{}

頂點與片段著色器的核心是:

CGPROGRAM

#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
ENDCG

表面著色器的核心是:

1.表面著色器使用Unity3D自帶光照模型Lambert,也不做頂點處理,只需要一個表面處理函數surf即可。
CGPROGRAM
#Pragma surface surf Lambert
ENDCF
2.這套表示使用的是自己寫的光照模型lsyLightModel,並且使用了頂點處理函數vert
CGPROGRAM
#pragma surface surf lsyLightModel vertex:vert
ENDCG

二、shader整體框架

技術分享

1、從這幅圖可以看到,Unity中的shader可以分為以下三個模塊: Properties一般定義中著色器的起始部分。屬性模塊可以定義一些屬性,用來指定那個這段代碼有哪些輸入。在使用shader 的時候可以直接中材質面板裏編輯這些屬性。Properties塊內的語法都是單行的。屬性的定義格式如下所示:

技術分享

屬性可以劃分為以下幾類:

1)、數字與滑動條
name ("display name", Range (min, max)) = number //滑動條調節
name ("display name", Float) = number//數字調節
name ("display name", Int) = number//數字調節
顏色與向量(註意是四元數)
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
2)、貼圖
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}//立方體貼圖
name ("display name", 3D) = "defaulttexture" {}
3)、細節
Range與float的屬性只能是單精度值。
在後面的著色器程序中,屬性值通過[name]來訪問。而display name將顯示在材質檢視器中。
可以使用在屬性定義加上等號為每個屬性提供缺省值。
對於紋理(2D, Rect, Cube) 缺省值既可以是一個空字符串也可以是某個內置的缺省紋理:"white", "black", "gray" or"bump"
使用示例
// properties for a water shader
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

2、子著色器SubShader

這個我會在下一篇文章中詳細說明

3、回滾FallBack
Shader基本框架的最後是指定一個回滾函數Fallback,用來處理所有的子著色器都不能運行時的情況(當目標設備太老時,所有的設備都有其不支持的特性時使用了Fallback),可以認為是一種defult。

一、Unity中Shader的三種基本類型