上一篇我們講解了關於圖像學的一點基礎知識,我們了解到GPU是如何將3D場景及3D遊戲對象顯示到2D屏幕上。本篇開始,我們就開始真正接觸Shader的具體寫法。

首先,我們要了解UnityShader的分類,UnityShader分為三類:固定管線著色器(Fixed Function Shader),表面著色器(Surface Shader),頂點片段著色器(Vertex and Fragment Shader),劇情使然,我們先來看固定管線著色器

  • 首先,我們先了解一下UnityShader的基本框架。

//設置Shader的目錄路徑 Shader "FixedShader/Fixed001" { //設置Shader所需要的外部屬性 Properties { } //子著色器(表示一種渲染方案) SubShader { //例如針對PC機 Pass//表面著色器沒有Pass通道 { } } SubShader { //例如針對高端手機 } SubShader { //例如針對低端手機 } //備用著色器:一般用最簡單的Shader Fallback "Diffuse" }

  • Shader框架細節
    • 最前面的Shader 「FixedShader/Fixed001」,是設置當前Shader的路徑,方便在材質球中選擇。

選擇Shader
    • 之後的SubShader是子著色器,由於Unity跨平台,因此Unity的工程可能發布的平台很多,有可能是PC,有可能是移動端,也有可能是掌機,不同設備的渲染能力不同,也就造就了在執著跨平台項目時,Shader的編寫需要分多個SubShader,以適用於所有的平台。SubShader從上至下,渲染效果依次提高,性能消耗也依次提高。硬體設備會選擇自身能使用的最佳SubShader,保證能渲染,效果儘可能的好。如果前面的所有SubShader都不能使用(硬體渲染能力太差),則使用Fallback(備胎Shader)渲染,一般Fallback會選擇最簡單Shader,以防止材質不渲染。

      if(當前設備可以使用SubShader01的渲染方案去渲染) { **按照SubShader01去渲染** } else if(當前設備可以使用SubShader02的渲染方案去渲染) { **按照SubShader02去渲染** } else if(當前設備可以使用SubShader03的渲染方案去渲染) { **按照SubShader03去渲染** } ... ... ... else { **使用Fallback去渲染** }

    • Pass通道指的是在圖像渲染時,可以分多通道去渲染。例如分正反兩通道渲染,透明度以0.5為分界兩通道去渲染等等。

分正反兩通道渲染

  • 接下來,我們來詳細了解一下Shader屬性的設置方式。

Shader屬性介面

著色器是一個加工廠,是一種圖像渲染的解決方案,所以大部分好的Shader都是給用戶流出了很多可選的屬性介面,方便用戶添加自己項目的素材,從而實現需求渲染特效。

  • Shader的數據類型
    • 語法:變數名(屬性提示文字,屬性數據類型)=初值
    • _FloatValue("一個浮點數",float)=0.5//範圍浮點數
    • _RangeValue("一個範圍浮點數",Range(0,5))=0//四維數
    • _VectorValue("一個四維數",Vector)=(1,0,0,1)

      //顏色值

    • _MainColor("主顏色",Color)=(1,0,0,1)//2階貼圖
    • _MainTexture("主紋理",2D)=""{}//非2階紋理
    • _RectTexture("非2階紋理",Rect)=""{}//立方體貼圖
    • _CubeTexture("立方體貼圖",Cube)=""{}

Shader外部屬性設置

鏈接:jianshu.com/p/71cf99dd8

好啦,講解結束~如果想獲取更多編程相關資訊,歡迎關注我呀。戳這裡:

狗尾草的小確幸?

www.zhihu.com
圖標


推薦閱讀:
相关文章