黄色电影一区二区,韩国少妇自慰A片免费看,精品人妻少妇一级毛片免费蜜桃AV按摩师 ,超碰 香蕉

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

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

 

一、unity shader基礎(chǔ)

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

在unity中shader一般由兩種用途:

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

2、unity渲染管線shader的編寫(xiě)方式

  • 頂點(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ǔ)言編寫(xiě)著色器函數(shù)時(shí),函數(shù)的輸入?yún)?shù)和輸出參數(shù)都需要填充一個(gè)語(yǔ)義(semantic)來(lái)表示它們要傳遞的數(shù)據(jù)信息。

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

參數(shù)后被冒號(hào)隔開(kāi)并且全部大寫(xiě)的關(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)搜索碩編程以前的文章,希望以后支持碩編程!

下一節(jié):unity游戲開(kāi)發(fā)中的設(shè)計(jì)模式之策略模式

c# 教程

相關(guān)文章