欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity Shader片段著色器使用基礎(chǔ)詳解

 更新時(shí)間:2023年05月05日 10:59:02   作者:iukam  
頂點(diǎn)-片段著色器是Unity Shader中最基礎(chǔ)的著色器類型,用于控制3D模型的渲染效果。通過(guò)頂點(diǎn)著色器計(jì)算模型的頂點(diǎn)位置和法線方向,再通過(guò)片段著色器計(jì)算模型表面的顏色、光照、陰影等效果

一、Unity Shader基礎(chǔ)

1、創(chuàng)建和使用Shader

在Unity中Shader一般由兩種用途:

  • 指定給材質(zhì),用于物理渲染;
  • 指定給腳本,用于圖像處理,比如后期處理(Post Processing);

2、Unity渲染管線Shader的編寫方式

  • 頂點(diǎn)-片段著色器(Vertex and Fragment Shader);
  • 表面著色器(Surface Shader);
  • 固定函數(shù)著色器(Fixed Function Shader,目前逐漸被拋棄);

二、CG語(yǔ)法基礎(chǔ)

1、編譯指令

CG常用的編譯指令:

(1) 編譯目標(biāo)等級(jí)

CG代碼編譯到不同的Shader Models中,要適應(yīng)對(duì)應(yīng)的GPU平臺(tái),否則會(huì)出現(xiàn)一些Shader在GPU上無(wú)法運(yùn)行。

聲明編譯目標(biāo)的級(jí)別#pragma target name也可以使用#pragma require feature指令直接聲明某個(gè)特定的功能。

#pragma target 3.5  //目標(biāo)等級(jí)3.5
#pragma require geometry tessellation  //需要幾何體細(xì)分功能

(2) 渲染平臺(tái)

Unity具有跨平臺(tái)的特性,它支持很多渲染API,例如Direct3D、Opengl。默認(rèn)情況下,Unity會(huì)為所有支持的平臺(tái)編譯一份Shader程序,但需要指定編譯某些平臺(tái)或不編譯某些平臺(tái)。

使用示例:

#pragma only_renderers d3d11  //目標(biāo)只編譯Direct3D 11/12 平臺(tái)
#pragma exclude_renderers glcore //不編譯 OpenGL 3.x/4.x

2、著色器函數(shù)

一個(gè)基本的Shader示例:

Shader "Custom/Simplest  Shader"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            void vert (in float4 vertex : POSITION,
                    out float4 position : SV_POSITION)
            {
                position = UnityObjectToClipPos(vertex);
            }
            void frag (in float4 vertex : SV_POSITION,
                    out fixed4 color : SV_TARGET)
            {
                color = fixed4(1, 0, 0, 1);
            }
            ENDCG
        }
    }
}

在Shader中,頂點(diǎn)-片元著色器主要通過(guò)頂點(diǎn)函數(shù)和片元函數(shù)來(lái)實(shí)現(xiàn)的。

(1) 無(wú)返回值函數(shù)

上述Shader中的頂點(diǎn)函數(shù)和片元函數(shù)使用的是無(wú)返回值的函數(shù),通過(guò)out關(guān)鍵字將變量輸出。

語(yǔ)法結(jié)構(gòu)如下:

 void name(in 參數(shù),out 參數(shù))
 {
 	//函數(shù)體
 }

void:函數(shù)以void開(kāi)頭,表示返回值為空;

name:定義函數(shù)名稱;

in:輸入?yún)?shù),語(yǔ)法為:in+數(shù)據(jù)類型+名稱,一個(gè)函數(shù)可以有多個(gè)輸入,關(guān)鍵詞 in 可省略。

out:輸出參數(shù),語(yǔ)法為:out+數(shù)據(jù)類型+名稱,一個(gè)函數(shù)可以有多個(gè)輸出。

(2) 有返回值的函數(shù)

語(yǔ)法結(jié)構(gòu)如下:

 type name(in 參數(shù))
 {
 	//函數(shù)體
 	return 返回值;
 }

3、語(yǔ)義

CG語(yǔ)言編寫著色器函數(shù)時(shí),函數(shù)的輸入?yún)?shù)和輸出參數(shù)都需要填充一個(gè)語(yǔ)義(Semantic)來(lái)表示它們要傳遞的數(shù)據(jù)信息。

語(yǔ)義可以執(zhí)行大量繁瑣的操作,使用戶能夠避免直接于GPU底層進(jìn)行交流。

參數(shù)后被冒號(hào)隔開(kāi)并且全部大寫的關(guān)鍵詞就是語(yǔ)義。

(1) 頂點(diǎn)這著色器的輸入語(yǔ)義

頂點(diǎn)數(shù)據(jù)是以輸入?yún)?shù)的方式傳遞給頂點(diǎn)函數(shù)的,每一個(gè)輸入的參數(shù)都需要填充一個(gè)語(yǔ)義,用于表示所傳遞的數(shù)據(jù)。

注意:

當(dāng)頂點(diǎn)信息包含的元素少于頂點(diǎn)著色器輸入所需要的元素時(shí),缺少的部分會(huì)被0填充, w分量會(huì)被1填充; 如:輸入語(yǔ)義TEXCOOED0被聲明為float4類型,那么頂點(diǎn)著色器最終獲取到的數(shù)據(jù)為 ( x , y , 0 , 1 ) (x,y,0,1) (x,y,0,1)

(2) 頂點(diǎn)這著色器輸出和片元著色器輸入語(yǔ)義

在整個(gè)渲染流水線中,頂點(diǎn)著色器最重要的的一項(xiàng)人物就是需要輸出頂點(diǎn)在裁剪空間中的坐標(biāo),這樣GPU就可以知道頂點(diǎn)在屏幕上的柵格化位置以及深度值。在頂點(diǎn)函數(shù)中這個(gè)輸出參數(shù)值需要使用float4類型的SV_POSITION語(yǔ)義填充。

頂點(diǎn)著色器產(chǎn)生的輸出值將會(huì)在三角形便利階段經(jīng)過(guò)插值計(jì)算,最終作為像素值輸入到片元著色器。

換句話說(shuō),頂點(diǎn)著色器的輸出就是片元著色器的輸入。

片元著色器會(huì)自動(dòng)獲取頂點(diǎn)著色器輸出的裁切空間頂點(diǎn)坐標(biāo),所以片元函數(shù)輸入的SV_POSITION可以省略。

注意:

與頂點(diǎn)函數(shù)的輸入語(yǔ)義不同,TEXCOORDn不再特指模型的UV坐標(biāo),COLORn也不在特指頂點(diǎn)顏色。它們使用范圍更廣,可以用于聲明任何符合要求的數(shù)據(jù)。

(3) 片元著色器輸出語(yǔ)義

片元著色器通常只會(huì)輸出一個(gè)fixed4類型的顏色信息,輸出的值會(huì)存儲(chǔ)到渲染目標(biāo)(Render Target),輸出參數(shù)使用SV_TARGET語(yǔ)義進(jìn)行填充。

到此這篇關(guān)于Unity Shader片段著色器使用基礎(chǔ)詳解的文章就介紹到這了,更多相關(guān)Unity Shader片段著色器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#特性 匿名類型與隱式類型局部變量使用介紹

    C#特性 匿名類型與隱式類型局部變量使用介紹

    這篇文章主要介紹了C#特性-匿名類型與隱式類型局部變量,需要的朋友可以參考下
    2014-12-12
  • C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(一)

    C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(一)

    這篇文章主要介紹了C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(一),本文講解了switch語(yǔ)句可以用來(lái)測(cè)試string型的對(duì)象、多維數(shù)組、foreach語(yǔ)句、索引器和Property等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • C# ManagementObjectSearcher操作window案例詳解

    C# ManagementObjectSearcher操作window案例詳解

    這篇文章主要介紹了C# ManagementObjectSearcher操作window案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C#生成注冊(cè)碼的實(shí)例代碼

    C#生成注冊(cè)碼的實(shí)例代碼

    C#生成注冊(cè)碼的實(shí)例代碼,下面是一個(gè)小例子,需要的朋友可以參考一下
    2013-03-03
  • c#訪問(wèn)this關(guān)鍵字和base關(guān)鍵字示例

    c#訪問(wèn)this關(guān)鍵字和base關(guān)鍵字示例

    this關(guān)鍵字引用類的當(dāng)前實(shí)例。靜態(tài)成員方法中不能使用this關(guān)鍵字,this關(guān)鍵字只能在實(shí)例構(gòu)造函數(shù)、實(shí)例方法或?qū)嵗L問(wèn)器中使用。base關(guān)鍵字用于從派生類中訪問(wèn)基類的成員。下面學(xué)習(xí)一下這二個(gè)關(guān)鍵字的使用方法
    2014-01-01
  • C#實(shí)現(xiàn)獲取文件大小并進(jìn)行比較

    C#實(shí)現(xiàn)獲取文件大小并進(jìn)行比較

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)獲取文件大小進(jìn)行單位轉(zhuǎn)換與文件大小比較功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的示例詳解

    C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的示例詳解

    AForge是一個(gè)專門為開(kāi)發(fā)者和研究者基于C#框架設(shè)計(jì)的,這個(gè)框架提供了不同的類庫(kù)和關(guān)于類庫(kù)的資源,本文為大家介紹了C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的相關(guān)教程,需要的可以了解下
    2023-11-11
  • C#異常處理詳解

    C#異常處理詳解

    這篇文章介紹了C#異常處理,有需要的朋友可以參考一下
    2013-10-10
  • Unity實(shí)現(xiàn)坦克模型

    Unity實(shí)現(xiàn)坦克模型

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)坦克模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#實(shí)現(xiàn)子窗體與父窗體通信方法實(shí)例總結(jié)

    C#實(shí)現(xiàn)子窗體與父窗體通信方法實(shí)例總結(jié)

    這篇文章主要介紹了C#實(shí)現(xiàn)子窗體與父窗體通信方法,實(shí)例總結(jié)了常用的四種窗體通信方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09

最新評(píng)論