編寫shader之前必須的基本認識


Vertex shader (頂點着色器):通過編程的方式實現對頂點的操作,如空間轉換,顏色,紋理坐標,燈光 得到最終的頂點數據后,輸出到片元着色器

頂點着色器可以用來指定一系列完全通用的(如坐標,燈光,顏色,紋理)、並將應用於各個頂點及相關數據上的操作。

Fragment shader(片元着色器):在像素沒顯示到屏幕之前,將要執行一些列操作,這些操作可能會修改甚至丟棄這些片斷。所有這些操作都可以被啟用或禁用。第一個可能執行的操作時紋理處理。在紋理內存中為每個片斷生成一個紋理單元(texel,也就是紋理元素,也就是uv),並應用到這個片斷上。接着可能進行的是霧計算,然后是剪裁測試,alpha測試,模板測試和深度緩沖區測試(深度緩沖區用於消除被隱藏的表面)。如果一個片斷無法通過一個啟用的測試,它的連續處理過程可能會被中斷。隨后,將要執行的可能是混合,抖動,邏輯操作以及根據一個位掩碼的屏蔽操作。最后,經過完整處理的片斷就被繪制到適當的緩沖區,最終成為一個像素並到達它的最終棲息地。

 

物體的坐標抓換:本地坐標(原點為自身軸向為自身)->慣性坐標-(原點為自身軸向與世界坐標系重合)->世界坐標(原點與世界坐標重合 然后旋轉到本地的軸向)->相機坐標(我個人比較喜歡叫相機坐標,書面化說法又稱視錐體坐標,其實就是相機的視角是個四棱錐或長方體)->在相機視角中對三維的坐標進行降維操作(https://www.bilibili.com/video/av37614073?from=search&seid=2402871598313506313   1:09了解一下)->

接下來就介紹下Shader的三大測試:

深度測試:

  深度:指該像素距離攝像機的距離。離攝像機越遠,深度越大。

    深度緩沖:存儲着每個像素對應的深度值。

       顏色緩沖:存儲着每個像素對應的顏色值。

       深度測試:將像素的深度與深度緩沖的深度進行比較。如果通過了深度測試,就有機會去改寫深度緩沖的對應值;否則該像素會被舍棄

  

  

   Zwrite

      參數 On/Off    開啟/關閉深度寫入

   ZText 

   Greater  GEqual  Equal Less LEqual  NotEqual  Always  Never         

            分別對應

     >              >=       ==       <        <=         !=            總是     從不

   像素對比GBuffer中的像素,滿足條件則替換。否則舍棄,物體的像素渲染並不是直接就到屏幕上,需要計算,符合條件則通過測試,最終到屏幕上。

Alpha測試:

  Alpha Test ,中文就是透明度測試。簡而言之就是V&F shader中最后fragment函數輸出的該點顏色值(即上一講frag的輸出half4)的alpha值與固定值進行比較。 AlphaTest語句通常位於Pass{}中的起始位置。

  語法:
  第一種: AlphaTest Off: 不測試,全渲染
  第二種:Alpha 比較符 目標alpha值
  其中目標alpha值取值范圍是 0至1, 也可以用參數 ,如 AlphaTest [varName]。
 
  比較符:(目標alpha值下面記作x)
  Always  全渲染(任意x值)
  Never   全不渲染
  Greater  點的alpha值大於x時渲染
  GEuqal   點的alpha值大於等於x時渲染
  Less       點的alpha值小於x時渲染
  LEqual    點的alpha值小於等於x時渲染
  Equal  點的alpha值等於x時渲染
  NotEqual  點的alpha值不等於x時渲染
 
  例:
  AlphaTest never  0      全不渲染(這個0可以是任意值,但必須填)
  AlphaTest always 0      全渲染(這個0可以是任意值,但必須填)
  AlphaTest off               全渲染
  AlphaTest Greater 0.4  當alpha大於0.4渲染,   缺點是邊緣過於鋒利並且顯示不完整,alpha小於0.4的部分被忽略掉了
  Alpha Blend                 邊緣柔和,但是中心也太柔和,沒有實體的感覺
  AlphaTest Greater 0.4 / AlphaTest LEqual 0.4 兩個部分,大於0.4不混合,小於0.4混合。效果是既有實體感覺,邊緣也柔和。

 

模板測試:

  模版測試較為復雜,它不像Alpha測試一樣,單單通過簡單的大於小於等運算符來比較,但是和Alpha測試一樣,都是測試像素點,符合要求的就渲染,不符合要求的就不渲染。了解模版測試,需要理解較多術語:

  1.GBuffer:幾何緩沖,相當於一個容器

  2.RefenceValue:模版值,Guffer中的像素點就是與這個值按位與后進行比較

  3.stencilOperation:比較后進行的操作

  4.ReadMask|WriteMask:讀遮罩|寫遮罩

  理解了以上的術語,那么模版測試的公式就差不多可以理解了:其公式為:

  referenceValue&readMask comparisonFunction stencilBufferValue&readMask

 

轉:https://blog.csdn.net/coolbeliever/article/details/81979089

 關於逐頂點和逐像素:

  per-vertex是先計算再插值,per-pixel是先插值后計算。后者的控制粒度是pixel(像素),前者是triangle(三角形)。

左邊逐個像素 右邊逐個頂點 可以明顯的看到分割處的三角面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM