Shader Introduce (Unity 2017.1.1)

在開始討論正題之前先來聊個天~XD

關於Shader這東西,其實我蠻早之前就知道它的存在了,只是前陣子正在專心處理打包成apk並傳到手機上測試的一些問題,以及練習2D遊戲大量的UGUI設計布局,再加上小弟我今年升大一,開學有一堆事情要處理。最後的結果是懶惰的我拖到大概三天前才開始研究Shader(好慚愧阿…QQ),不過正好和最近想弄部落格收集作品的規劃能配合,於是誕生出了這第一篇Shader簡介筆記,因為是筆記所以沒有潤飾,有些文字邏輯詭異的地方請多包涵。之後會繼續對Shader深入研究一陣子,所以應該會有一系列的文章要寫~XD

這次的筆記是參考ARKAI Studio網站的教學影片所寫的(網址如下)

http://k79k06k02k.com/blog/1078/unity/一起學-unity-shader-一:新手入門

閒話家常到此結束@w@以下是我的筆記,如果有寫錯或是寫得不好的地方麻煩各位大大不吝指教

Shader 流程

  1. Input(輸入參數)
  2. Shader(運算處理改變Render方式)
  3. Output(輸出Render結果)

Mesh Render

  • Shader的選染目標是Mesh
  • Vertex(點)→Edges(邊)→Polygon(多邊形面,在此指三角面)→Mesh(網面物件)

CPU 及 GPU 的運算架構

  • CPU 適合單一複雜運算
  • GPU 適合大量簡易且互不影響的運算

從 CPU 到 GPU

  1. 前置:3ds max / Maya / Blender建模軟體輸出Mesh至HDD
  2. CPU:從HDD讀取Mesh至RAM,再從RAM讀取至VRAM(顯卡記憶體)
  3. 接著設定Render Status(Shader、Materials…)
  4. 底層繪圖API(Unity用OpenGL、Unreal用Direct)
  5. Graphic Driver
  6. GPU Pipline

Graphic Pipline GPU繪圖流水線

Simple Graphic Pipline

  1. Mesh經由Vertex Shader傳入頂點資訊
  2. 頂點透過Triangle Assembly構建Mesh
  3. Rasterization光柵化
  4. Fragment Shader片段著色
  5. testing and blending

programmable Graphic Pipline

舊式顯卡無法程式控制,但新式可以

  1. Application Stage
    • 輸入Vertex Data(Position、Color、Normal Vector、Texture Coordinate(UV))
  2. Geometry Stage
    • Vertex Shader
      • Operate Vertex
      • Vertex Transformations(Module-View-Projection)
        1. Modeling Transformation:Object/Local Space → World Space
        2. Viewing Transformation:World Space → View/Eye Space
        3. (GTX)Projection Transformation:View/Eye Space → Clips Space
      • Texture Coordinate Transformations
      • Per-Vertex Lighting
    • Primitive Assembly
      • Vertex → Edges → Polygons → Mesh
    • Tessellation Shader(Optional)
      • Derect3D 11、OpenGL 4、OpenGL ES 3.2
      • Subdivide into smaller Primitive
    • Geometry Shader(Optional)
      • Derect3D 10、OpenGL 3.2、OpenGL ES 3.2
      • Add/Remove Vertex/Primitive

      Clipping

      • 剃除視野外的物件,卡在視野邊界則裁剪後修補

      Screen Mapping

      • 將視野內的物件投影到屏幕上
    • Clipping
      • 剃除視野外的物件,卡在視野邊界則裁剪後修補

      Screen Mapping

      • 將視野內的物件投影到屏幕上
  3. Rasterizer Staged
    • Rasterization & Interpolation
      • Input Fragment Data(Screen Coordinate、Color、Depth、Normal Vector、Texture Coordinate(UV))
      • 進行光柵化與片元數據插值運算

      Fragment Shader

      • Operate Fragment
      • Texture Mapping

      Raster Operations

      • Input Fragment & Associated DataPixel Ownership Test(片段所有權)→Scissor Test(裁剪)

        →Alpha Test(透明度)

        →Stancil Test(模板測試)

        →Depth Test(深度測試)

        →Blending(混色)

        →Dithering(抖動)

        →Logic Operation(邏輯運算)

      • Early-Z

        Z軸為攝影機深度軸,此功能可以把Depth Test提前至Fragment Shader之前處理,減少不必要的Fragment處理提升效能

      • Double-Buffering

        雙重緩衝,啟用時一共會擁有兩組圖形畫面信息,一組呈現,另一組就渲染,由於渲染需要時間,可能造成畫面閃爍,但是若啟用雙重緩衝使兩組圖形畫面輪流呈現則可以改善此問題

    • Fragment Shader
      • Operate Fragment
      • Texture Mapping

      Raster Operations

      • Input Fragment & Associated DataPixel Ownership Test(片段所有權)→Scissor Test(裁剪)

        →Alpha Test(透明度)

        →Stancil Test(模板測試)

        →Depth Test(深度測試)

        →Blending(混色)

        →Dithering(抖動)

        →Logic Operation(邏輯運算)

      • Early-Z

        Z軸為攝影機深度軸,此功能可以把Depth Test提前至Fragment Shader之前處理,減少不必要的Fragment處理提升效能

      • Double-Buffering

        雙重緩衝,啟用時一共會擁有兩組圖形畫面信息,一組呈現,另一組就渲染,由於渲染需要時間,可能造成畫面閃爍,但是若啟用雙重緩衝使兩組圖形畫面輪流呈現則可以改善此問題

Direct3D 、 OpenGL

開發商 3D API Shading Language Platform
SGI OpenGL GLSL Win、Mac、Linux、Mobile
MSFT Direct3D HLSL Win、Xbox360
MSFT+NVIDIA OpenL & Direct3D Top CG Almost

Material 、 Shader 、 Texture

Shader是渲染的過程、Texture是Shader的參數、Material是渲染的結果

Unity Shader種類

Fixed Function Shader

  • 不能寫Code控制,只能用選項
  • 完全用ShaderLab命令
  • 支援舊設備
  • Unity 5.2+自動轉成Vertex/Fragment Shader

Serface Shader

  • 可以寫Code控制(CGPROGRAM…ENDCG)
  • 有多個Pass
  • 可編輯成Vertex/Fragment Shader
  • Unity以封裝許多光影細節處理模式

Vertex Fragment Shader

  • 可以寫Code控制(CGPROGRAM…ENDCG)
  • 最強大最靈活但最複雜
  • 可進行頂點位移、部分混色
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s