計算機圖形學

<p align="center">計算機圖形學</p>


介紹

計算機圖形學(Computer Graphics,簡稱CG)是一種使用數學算法將二維或三維圖形轉化為計算機顯示器的柵格形式的科學,==所有計算機學科中正反饋最強的一個,沒有之一==。

大綱

1. 數學

2. 渲染管線

3. 光照模型


<p align="center">數學</p>

<p align="center">一切科學都起源于數學</p>



<p align="center">渲染管線</p>


  • 渲染管線,也稱渲染流水線,是顯示芯片內部處理圖形信號相互獨立的并行處理單元。渲染管線就是要把一系列的頂點數據,紋理等信息,最終轉換成一張人眼可以看到的圖像。這個過程由CPU和GPU共同完成。

<p align="center">頂點數據為[(1, 1, 1), [1, -1, 1]...]的正方形</p>

<p align="center">↓</p>


1. 準備階段(Input Assembler)

通過索引來定義如何將頂點組成三角形,構成面片

<p align="center">
</p>

<p align="center">↓</p>

<p align="center">
</p>


<p align="center">一個平面是由兩個三角形組成的</p>

<p align="center">
</p>


2. 頂點著色器(Vertex Shader)

a. 局部坐標系(Local)

獲取各個頂點的位置,并表示為矩陣[(1, 1, 1), [1, -1, 1]...]


b. 世界坐標系(World)

將模型通過平移、旋轉、縮放操作,實質是矩陣操作,將模型從局部坐標軸統一到世界坐標軸。
這些平移旋轉縮放矩陣相乘所得矩陣,稱之為世界變換矩陣



c. 觀察坐標系(View)

為了讓模型在觀察者的視角顯示出,最后得把所有坐標系統一到觀察坐標系,所乘矩陣稱之為觀察變換矩陣



d. 投影坐標系(Projection)

透視矩陣變換,產生近大遠小的視覺效果



3. 曲面細分(Tessellator)

dx11引入,曲面細分,或者更準確的說“鑲嵌化處理技術”,就是在頂點與頂點之間自動嵌入新的頂點。在自動插入大量新的頂點之后,模型的曲面會被分得非常細膩,看上去更加平滑致密


4. 幾何著色器(Geometry Shader)

在頂點和片段著色器之間有一個可選的著色器,叫做幾何著色器(Geometry Shader)。幾何著色器以一個或多個表示為一個單獨基本圖形(primitive)的頂點作為輸入,比如可以是一個點或者三角形。幾何著色器有意思的地方在于它可以把(一個或多個)頂點轉變為完全不同的基本圖形(primitive),從而生成比原來多得多的頂點。

==Unity2017開始支持,適用于發毛==



5. 裁剪(Clipping)

視域體以外的頂點忽略


6. 光柵化(Rasterization)

a. 視口變換
當適配不同設備屏幕時,不同比例以及不同分辨率的矩陣變換。



b. 背面剔除(Culling)
為了優化,刪除看不到的面的頂點數據,讓計算機忽略對其的處理

  • 剔除前:


  • 剔除后:



c. 頂點屬性插值

<p align="center"> ==有沒想過頂點有了,像素(屏幕所見的一切都是像素)怎么來==?</p>

<p align="center">
</p>


7. 像素著色器(Fragment Shader)

像素著色引擎是以每像素為單位的圖形處理功能。

像素都匯聚到這個地方了,接下來就可以為所欲為了
代碼層面上逐像素光照可以涉及的領域,Lambert光照(漫射光)Phong Specular高光等光照模型可以套用的地方。


總結一下

<p align="center">準備階段(Input Assembler)

<p align="center">頂點著色器(Vertex Shader)

<p align="center">曲面細分(Tessellator)

<p align="center">幾何著色器(Geometry Shader)

<p align="center">裁剪(Clipping)

<p align="center">光柵化(Rasterization)

<p align="center">像素著色器(Fragment Shader)


<p align="center">不同工種研究不同的領域,作為技術美術,應該深入研究其中的三個

<p align="center">==頂點著色器==(Vertex Shader)

<p align="center">==幾何著色器==(Geometry Shader)

<p align="center">==像素著色器==(Fragment Shader)


<p align="center">什么是著色器?


<p align="center">所有復雜的兩層關系,可以通過==中間層==解決,著色器就是程序員告訴計算機如何渲染的方式


<p align="center">講得太抽象,結合實際代碼走一遍


一個只顯示白色的材質


//定義=告訴計算機
Shader "PeroPero/Unlit" //顯示材質在Unity面板的位置,如上圖
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {} //定義一個外部獲取的貼圖
    }
    SubShader
    {
        Tags { "LightMode"="ForwardBase" } //定義光照模式為ForwardBase

        Pass    //定義一個pass,代表一次渲染,多個pass代表多次渲染
        {
            CGPROGRAM   //定義用CG語言的語法溝通
            #pragma vertex vert //定義頂點著色器在vert函數中
            #pragma fragment frag //定義像素著色器在frag函數中
            
            #include "UnityCG.cginc" //引用外部程序集,用于一些快捷API

            //定義一個數據結構
            struct appdata
            {
                float4 vertex : POSITION; //釋義,告訴計算機這個值用于緩存頂點的本地坐標的位置
            };

            struct v2f
            {
                float4 vertex : SV_POSITION; //釋義,告訴計算機這個值用于緩存頂點的最終位置
            };
    
            //頂點著色器
            v2f vert (appdata v)
            {
                v2f o; 
                //頂點坐標乘以世界坐標系的混合矩陣M,再乘以觀察矩陣V,再乘以投影矩陣P,得到最終的坐標
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
                //返回給計算機算出來的最終頂點坐標
                return o;
            }
            
            //像素著色器
            fixed4 frag (v2f i) : SV_Target
            {
                //像素的顏色都是白色
                return fixed4(1, 1, 1, 1);
            }
            ENDCG
        }
    }
}


頂點著色器(Vertex Shader)

image

在這里可以獲得所有頂點的控制權,可以做任何和頂點有關的效果。如UV動畫,頂點動畫,逐頂點光照




像素著色器(Fragment Shader)


在這里可以獲得所有像素的控制權,可以做一切渲染相關的效果,如光照、貼圖映射、凹凸貼圖等。

什么是光照效果?如Lambert(漫射光)、Phong Specular(馮氏高光)、Ramp Texture(漸變貼圖)、BRDF(雙向反射分布函數)、Fresnel Reflection(菲涅爾反射)等

<p align="center">Lambert(漫反射)

<p align="center">
</p>

<p align="center">Phong Specular(馮氏高光)

<p align="center">


<p align="center">BRDF(雙向反射分布函數))

<p align="center">

<p align="center">Fresnel Reflection(菲涅爾反射)

<p align="center">


<p align="center">把以上所有模擬真實環境的Shader都寫到一個材質中

<p align="center">那么這個材質就是大家天天吹牛所說的==PBR材質(Physically Based Rendering)==,即基于物理的渲染,沒什么深奧的。它就是是基于很多==光照模型==。

<p align="center">所以說,所有復雜的東西都是簡單的東西拼湊起來的。即積木原理,那大家知道什么叫拼圖原理呢?


<p align="center">光照模型</p>


什么是光照模型呢?

當光照射到物體表面時,物體對光會發生反射、透射、吸收、衍射、折射、和干涉,其中被物體吸收的部分轉化為熱,反射、透射的光進入人的視覺系統,使我們能看見物體。為模擬這一現象,我們建立一些數學模型來替代復雜的物理模型,這些模型就稱為明暗效應模型或者光照明模型

簡而言之,就是復雜的數學算法


Lambert漫反射

模擬漫反射。

漫反射,是投射在粗糙表面上的光向各個方向反射的現象。當一束平行的入射光線射到粗糙的表面時,表面會把光線向著四面八方反射,所以入射線雖然互相平行,由于各點的法線方向不一致,造成反射光線向不同的方向無規則地反射,這種反射稱之為“漫反射”或“漫射”



漫反射光的強度近似地服從于Lambert定律,即漫反射光的光強僅與入射光的方向和反射點處表面法向夾角的余弦成正比。

Phong Specular高光

模擬高光。

Phong 高光模型是最基礎且表現最友好的高光類型。它會計算出光在物體表面的反射方向與觀察者視線方向之間的對比結果。它是一種非常常見的高光模型,從游戲到電影都有諸多的應用。雖然在鏡面反射的精確建模上它并不是最接近現實的,但在大多數情況下它都顯得極為逼真。




BlinnPhong Specular高光

廉價高效模擬高光。

Blinn 是另一種計算和估算鏡面高光更有效的方式。它是通過視線方向和光線方向所形成的半角向量來完成的。它是由一位名叫吉姆·博林(Jim Blinn)的人帶進CG 世界的。他發現使用半角向量而不是我們自己形成的反射向量來進行計算顯得更加高效。這樣既減少了代碼量也減少了運算時間。




Anisotropic各向異性高光

模擬頭發和金屬絲的光照模型

(來自B站Aniraiden)



首先,經Anisotropic Normal Map擾動后,表面法線已經具備凹槽特性。
float3 anisoDir = normalize(s.Normal + s.AnisoDir);
float aniso = dot(anisoDir, halfVector);
==其次,Sin函數的目的中為了產生一個環。如下圖。如果沒有sin,則不會產生光環。==
最后,_AnisoOffset的作用是控制光環位置。使得光環可以水平位移,達到你想要的任何位置。
aniso = max(0, sin((aniso + _AnisoOffset) * 3.14));
如何成環呢,忽略_AnisoOffset
算式為 aniso = max(0, sin((aniso) * 3.14));
對比aniso = max(0, aniso);
則如下圖


<p align="center">僅高光的圖:

<p align="center">

<p align="center">加入Anisotropic各向異性后

<p align="center">

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375