【Unity Shaders】Vertex Magic —— 訪問頂點顏色,unityshaders

來源:互聯網
上載者:User

【Unity Shaders】Vertex Magic —— 訪問頂點顏色,unityshaders

本系列主要參考《Unity Shaders and Effects Cookbook》一書(感謝原書作者),同時會加上一點個人理解或拓展。

這裡是本書所有的插圖。這裡是本書所需的代碼和資源(當然你也可以從官網下載)。

========================================== 分割線 ==========================================



寫在前面


啦啦啦~我又回來看書啦。文章開始說一些題外話。因為寫部落格和在群裡比較活躍(為什麼QQ給我的稱謂是“吐槽”。。。我這麼乖。。。),最近有一些朋友給我發郵件或者私信,很多人都給了我鼓勵,我很開心,也有人給了我很好的學習建議,這些經曆讓我覺得堅持寫部落格是正確的一條路~也謝謝所有鼓勵、支援和關注我的人!我會堅持下去的。


好啦,言歸正傳~這篇開始,我決定開始一個新的章節——Vertex Magic。顧名思義,就是學習頂點相關的內容。自從看了下面Unity Gems裡面的一張圖,我對整個Surface Shader的工作流程有了更好的理解,在此再重溫一下。




可以看出來共有四個階段我們可以參與。我們之前學習的大多是在的第二和第三個階段,也就是編寫surf和LightingXXX函數來影響表面著色和光照函數的。在卡通風格的Shader中,我們也對最後一個更改像素顏色的機會——finalcolor命令有了一個初步的嘗試。而現在,我們將用一章的時間來學習如何利用第一個階段——頂點函數來影響像素顏色。


頂點函數是在每個頂點被傳送到GPU之前被調用一次。它的作用是從模型座標系中得到三維座標,然後再轉換到其渲染到螢幕時在螢幕座標系中的二維位置。因此,通過頂點函數,我們可以修改頂點的位置、顏色和UV座標。一旦我們完成了對頂點的修改後,就會進入到surf函數的執行。與頂點函數是逐頂點執行的方式不同,surf函數則是逐像素執行的。


通過頂點函數,我們可以創造像海上的波浪、旗幟飄動的動態效果,或者使用Shader來給頂點著色。這一篇,我們來學習如何在一個Surface Shader中建立一個最簡單的頂點函數!



準備工作


在深入學習頂點函數之前,我們得首先瞭解如何通過頂點函數得到和儲存頂點相關資訊。


你的情境應該看起來是這樣的:





實現


下面,我們開始編寫Shader。


完整代碼如下:

Shader "Custom/SimpleVertexColor" {Properties {_MainTint("Global Color Tint", Color) = (1,1,1,1)}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM#pragma surface surf Lambert vertex:vertfloat4 _MainTint;struct Input {float2 uv_MainTex;float4 vertColor;};void vert(inout appdata_full v, out Input o){o.vertColor = v.color;}void surf (Input IN, inout SurfaceOutput o) {o.Albedo = IN.vertColor.rgb * _MainTint.rgb;}ENDCG} FallBack "Diffuse"}

效果如下:




解釋

通過頂點函數,我們可以修改頂點的位置、顏色、UV座標等值。在本節中我們使用了一個從Maya匯入的已給頂點著色的模型,但我們可以發現,在使用預設材質的情況下這些顏色在Unity中是不顯示的。我們需要編寫Shader,提取這些顏色再在模型上顯示出來。
我們首先通過在#pragma聲明中添加vertex:vert語句。這實際上告訴Unity,嘿,不要用你自己內建的頂點函數訪問模型頂點資訊啦,去我寫的Shader裡找一個名叫vert的傢伙,用它去處理資訊!如果Unity沒有找到,它就會報一個編譯錯誤。
vert函數裡,除了我們熟悉的Input結構體,還有一個很特別的參數——appdata_full 。這個參數也是Unity內建的一個變數,它包含了模型頂點的所有資訊,包括位置、切線、法線、兩個紋理座標和顏色資訊。其他的還有appdata_base和appdata_tan,具體可以看見官網。
你還可以發現,vertColor是一個float4類型的變數,這意味著我們還可以訪問它的透明通道。像下面這樣:
void surf (Input IN, inout SurfaceOutput o) {o.Albedo = IN.vertColor.rgb * _MainTint.rgb;o.Alpha = IN.vertColor.a;}






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.