著色器快速入門

2021-02-15 泰鬥社區

免責聲明:
實際上我不是Unity專家,我之所以開始更認真地研究Unity,是為了我教的課。但是我必須說,目前來看,Unity可能是原型測試平臺最佳的解決方案之一。
本文不是一篇渲染(工程)教程,而是為那些了解渲染、想要嘗試Unity的人寫的文章,為效果和技術建立原型。

簡介


我特別喜歡用Nvidia的FXComposer來徹底檢驗我的想法,直到現在也很喜歡,但是不幸的是,該產品已經被棄用多年。
從那時起,我開始使用MJP框架,加入了我需要的功能(之後他自己也加上了相應功能),有非常優秀的框架是幾個成熟程式設計師寫的,但是在各種成熟的引擎中,目前Unity看起來是快速原型的最佳選擇。
我喜歡Unity的主要原因是其簡單性。我甚至不能上手Unreal 或者 CryEngine,但我也不怎麼想花時間學它們。另一方面,Unity足夠簡單,你只要打開它就可以開始隨便亂戳,這就是其強大之處。人們經常糾結太多的技術細節,其實優化和細化是相對簡單的,我們應該在實驗階段快速完成!

Unity 基礎


實際上你只需要知道三個主要概念:
1) 項目是由「資產(asset)」組成的 (紋理,網格……)。你只需要把文件拖拽到項目窗口,之後文件就會被拷貝到一個文件夾下,一點元數據是用來描述怎樣處理這些文件的。所有的資產都是熱加載的。腳本 (C# 或者JavaScript 代碼)也是資產!!


2) Unity採用一個場景圖系統(你也可以直接發出繪製命令,在此可以忽略)。你可以把網格拽到場景層級中,之後它們會出現在遊戲和編輯器視圖中,你可以創建光線、攝像頭和各種圖元。


遊戲和編輯器間的區別是:遊戲是通過一個遊戲攝像頭看到的,編輯器可以自由漫步。在遊戲視圖中時,你可以改變對象屬性(如果你已經暫停),但是這些改變是不可保存的(在場景中不是序列化的),但是在編輯器中,改變是保存的。


3) Unity 為任何事物都使用一個組件系統。 C#腳本只是定義了一個類(與腳本文件名相同),它繼承自"MonoBehaviour",並且實現了特定的回調函數。
所有的共有類成員作為可編輯的屬性(可以使用C#注釋自定義),都在組件UI中自動暴露,在場景中可序列化/反序列化。


一個組件可以附屬於任何場景對象(攝像頭,網格,光線……),而且可以訪問/修改對象屬性,在特定時刻執行操作(在渲染前,在場景加載之後、更新之前,在啟用組件時,當繪製調試對象時……)


組件可以在場景中自由改變任何內容,因為有一種方法可以通過名稱、類型等找到對象,也可以創建新對象等等。做一些操作的性能特徵有時是……令人驚訝的,在實際遊戲中,你可能需要緩衝區/緩衝池這樣的東西,但是對於建立原型來講,這是不相干的。

著色器& 渲染


在渲染角度,事情也一樣很簡單。可能對於不熟悉渲染的人來說,最複雜的部分就是著色器系統。
正如大多數引擎一樣,Unity有一個著色器系統,這個系統允許著色器排列自動生成(例如:正向著色器需要按光線類型和陰影排列),而且Unity也需要處理跨平臺問題(從HLSL到GLSL跨平臺編譯)。
通過使用著色器描述「ShaderLab」的小DSL,Unity實現了著色,著色器代碼實際上是嵌入其中的。
Unity還有其他方式可以製造著色器,無需HLSL和一個可以避免寫VS和PS的「表面著色器」系統,但是這對於渲染工程師來講沒什麼意思,所以我也不會詳述了:)
ShaderLab可以設置渲染狀態和聲明渲染參數,當一個材質與一個給定著色器綁定時,後者中可以自動在材質UI中體現出來。我不會詳細描述這個系統,因為你會發現ShaderLab著色東西是很明顯的,但是我會在結尾處給出一些例子。
對於幾何材質來說,過程非常簡單:你需要ShaderLab著色器 (.shader) 資產,一個材質資產與其綁定,之後你可以把它分配給一個網格(拖拽),就完成了。
Unity支持三種渲染系統(目前):VertexLit(是一種正向著色器,沒有多通道,每個對象最多有八個光線),Forward(多通道,一次一道光),Deferred(著色,也有舊系統做「deferred lighting」)。
著色器必須聲明系統已經編碼的內容, Unity把光照信息傳遞給著色器的方式也會基於上述內容改變。
對於後處理材質,你需要一個著色器和一個組件。組件應該是C#腳本,腳本可以附屬於攝像頭,在OnRenderImage回調函數中觸發渲染事件。在一個可以以編程方式創建材質的腳本中,把它綁定到著色器、設置參數,所以不需要再有一個獨立的材質資產。
Unity發布的渲染API非常小,但是創建渲染目標和繪製全屏Quad都非常簡單。如果有多個組件覆寫了OnRenderImage,Unity會自動連結後處理,回調函數會提供一個源和一個目地渲染目標,所以這種連結對於腳本來說是完全透明的。
對於更高級的效果,支持繪製和創建網格(包括網格的頂點屬性)、繪製直接幾何圖形(直線等等,通常用於調試)、甚至做「程序化繪製」(假定頂點是從緩衝區中取出的,沒有附加網格數據的繪製)和分配計算著色器。
當手動使用一個延遲著色器和樣本陰影貼圖時,也可以訪問到g-buffer,但是沒有規定要在創建時改變方式,而且你其實不能訪問到任何基礎圖形API(除非你寫C++插件)。
最後一項要點,在PC上,Unity與RenderDoc 和 Visual Studio集成,更方便調試, 這真不錯。
以上最好可以用實際代碼來解釋, 所以,如果你想要嘗試, 這裡 是一些注釋得很好的樣本著色器(雖然非常基礎/在著色器技巧方面大多數是錯的),都是我在開始教課之前學Unity時做的例子。

【版權聲明】
原文作者未做權利聲明,視為共享智慧財產權進入公共領域,自動獲得授權;

注意:關注了泰鬥微信公眾號,想獲得《用Unity5做一款即時戰略遊戲》課程觀看權的童鞋,可以聯繫晴天(QQ:986671381)或Lisa(QQ:2109365042),他們會添加你到該課程中,感謝!

相關焦點

  • 使命召喚戰區怎麼刪除著色器 著色器刪除方法
    ———————————————————————————————————— 使命召喚戰區怎麼刪除著色器?著色器刪除要注意些什麼?著色器刪除有什麼技巧嗎?
  • 使命召喚戰區怎麼刪除著色器 刪除著色器方法
    使命召喚戰區著色器的好壞影響到玩家個人的遊戲體驗,關乎到局內的畫面質量,和玩家的表現掛鈎。那麼,使命召喚戰區怎麼刪除著色器?著色器有什麼作用呢?這是一部分玩家好奇的問題。因此,為了揭開上述疑問,以下我們帶來了最全面的講解,希望大家喜歡哦。
  • 《使命召喚16》著色器安裝暫停怎麼辦 著色器安裝暫停解決方法一覽
    使命召喚16著色器安裝暫停怎麼辦?
  • 《戰地1》SweetFX著色器使用圖文教程 SweetFX著色器怎麼使用
    導 讀 今天小編給大家帶來的是一位玩家分享的《戰地1》SweetFX著色器使用圖文教程,可以幫助各位更加清楚的看清敵人哦
  • 《使命召喚16戰區》著色器無法安裝怎麼解決 著色器無法安裝解決攻略
    導 讀 使命召喚16戰區著色器無法安裝怎麼辦,相信不少玩家都有這樣的疑問,今天小編就為大家帶來使命召喚16
  • 《使命召喚16》安裝著色器報錯怎麼辦 安裝著色器報錯解決方法
    相信不少玩家都出現過單人劇情卡著色器提示致命錯誤的問題,這也著實影響大家的遊玩體驗...   《使命召喚16》作為現代戰爭系列的復興,有個好故事。 此外,這種多人遊戲模式的體驗也非常令人耳目一新。
  • 《使命召喚戰區》著色器無法安裝怎麼解決 著色器無法安裝解決方法
    > 導 讀 《使命召喚:戰區》作為最近推出的十分熱門的大逃殺遊戲,相信吸引了很家的目光,不過在下載遊戲時可能會出現著色器無法安裝的問題所以小編下面要為大家帶來的就是
  • OpenGL現代編程第三課——著色器
    一、 著色器概述從基本意義上來講,著色器只是一種把輸入轉化為輸出的程序。它們之間唯一的「通訊」方式只有通過輸入和輸出來實現。著色器是使用一種叫GLSL的類C語言寫成的,GLSL是為圖形計算量身定製的,它包含一些針對向量和矩陣操作的有用特性。
  • Google 開源圖形著色器測試框架 GraphicsFuzz
    近日,Google 的 GitHub 頁面上悄然出現了 GraphicsFuzz 的源碼存儲庫,從文檔來看,該測試框架除了適用於 GLSL 著色器,還在努力擴展到其他目標,如 SPIR-V、D3D HLSL 和 Apple Metal 。
  • 著色器語言,圖形計算量身定做、支持3D特效
    著色器是運行在GPU上的小程序,它是使用著色器語言GLSL編寫的。前面的文章中已經介紹了基於OpenGL如何畫出三角形和長方形,在這個過程中說明了著色器程序的創建、編譯和連結。著色器程序上則需要附著上頂點著色器、片段著色器。而頂點著色器、片段著色器是採用著色器語言編寫的。
  • 基於bada的OpenGL ES2.0:著色器和程序(一)
    著色器和程序什麼是著色器?(我將儘可能簡化回答 - 有興趣者可以多查查資料以了解更多信息)在OpneGL ES2.x中,著色器是渲染管線的可編程組件。著色器有兩種類型:1、頂點著色器:允許在頂點上進行一般操作的可編程組件。
  • 《使命召喚:戰區》著色器無法安裝解決方法
    《使命召喚戰區》作為最近推出的大逃殺模式,吸引了很多新玩家,但在下載時有一些玩家發現著色器無法安裝
  • 《OpenGL編程指南(原書第8版)》——計算著色器
    然而加上通用的顯存讀寫操作,這些看上去似乎有限的功能使計算著色器獲得一定程度的靈活性,同時擺脫圖形相關的束縛,以及打開廣闊的應用空間。OpenGL中的計算著色器和其他著色器很相似。計算著色器使用GLSL編寫,原則上,所有其他圖形著色器(比如頂點著色器,幾何著色器或者片元著色器)能夠使用的功能它都可以使用。當然,這不包括諸如幾何著色器中的EmitVertex()或者EndPrimitive()等功能,以及其他類似的與圖形管線特有的內建變量。另一方面,計算著色器也包含一些獨有的內置變量和函數,這些變量和函數在OpenGL管線的其他地方無法訪問。
  • Valve為AMD GPU開發新的Mesa著色器編譯器
    而近日,Valve宣布,專為AMD硬體設計的Mesa著色器編譯器ACO開放測試,原始碼將發布在GitHub上。 AMD OpenGL和Vulkan驅動目前使用的編譯器來自LLVM項目,該項目規模龐大,而且有許多不同的用途,在線編輯遊戲著色器只是其中之一。這導致開發者沒有精力為特定遊戲功能進行優化,著色器編譯緩慢,可能會導致遊戲中的卡頓。Valve贊助的項目組開發了專為AMD硬體設計的Mesa著色器編譯器ACO,原始碼發布在GitHub上。
  • 初學者秘籍:混合紋理和著色器的14種使用方法
    在本教程中,你將學到使用Blender混合紋理和著色器的14種方法。創造出真實材質無非就是調整和混合。每一個逼真的表面都由幾十層組成,完成本Blender教程之後,你會在實際應用中得到巨大的提升。本教程的亮點:14種混合紋理的方法,Blender 2.80版本進行演示。公開課·第二期用Blender多邊形繪製紋理Blender中的每個對象可以有一個不同的標識。
  • VentuzShader入門案例-2
    把高光和漫反射計算放在像素著色器中,得到了文章開頭的第七個小球。至此,Ventuz中的shader我們已經算是入門了。通過這兩篇文章,我們學習了在渲染管線中可自由編程的頂點著色器和像素著色器。    頂點著色器發生在渲染管線的幾何階段,主要作用是將模型的頂點從物體空間變換到齊次裁剪空間,之後數據交給GUP做裁剪和屏幕映射。
  • Steam更新著色器預緩存 改善了首次遊戲啟動時間
    Valve表示無論用戶的硬體設備如何,都會根據硬體和驅動的不同,為用戶的顯卡下載預編譯的著色器配置,這會明顯改善遊戲初次啟動的加載時間,並減少遊戲的卡頓、帶來更流暢的體驗。 其實對於遊戲玩家來說,無論是著色器,還是對於著色器緩存都不陌生。當我們看到地面、植被和水體的表面栩栩如生的細節,以及明朗清澈的反射效果的時候,其實都是需要著色器的工作。
  • Arnold渲染器萬能著色器aiStandardSurface標準曲面介紹
    本文和大家分享一下Arnold渲染器的萬能著色器標準曲面著色器——aiStandardSurfaceaiStandardSurface是一種基於物理世界的著色器,能夠模擬生成多種類型材質。如何給模型賦予aiStandardSurface著色器,主要有下面的兩種方法01給對象賦予著色器
  • Github霸榜:從零開始學3D著色器編程
    Shader,是運行在GPU上的程序,中文稱為著色器。它的主要用途是對三維物體進行著色處理,對光與影進行計算,以及控制紋理顏色的呈現等,最終,將遊戲引擎中的幾何數據轉化為屏幕上的模型、場景以及特效。吃雞、農藥、戰地、塞爾達…都離不開著色器,著色器被譽為照亮虛擬世界的"魔法"。 著色器還可以用來做後期處理,類似PS。
  • 多隊列並行前進 AMD異步著色器技術解析
    日前,AMD正式公布了一項名為異步著色器(Asynchronous Shaders)的技術,其功效在於可以讓GPU分出三條隊列,同步、獨自的運行渲染、計算、複製任務,從而提高工作效率,增加遊戲的流暢度。