<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《Real-Time Rendering》第二章 圖形渲染管線

      開篇

      ??這個章節會展示實時圖形的核心組件,即圖形渲染管線Graphics Rendering Pipeline)或“管線”。管線的主要功能是在給定一個虛擬相機、一些三維物體、一些光源等條件下,生成或繪制一張二維圖像,下圖描述了使用管線的過程。

      img

      物體的位置和形狀是由它們的幾何、環境的特征、相機在環境中的擺放決定的。物體的外表會被材質屬性、光源、紋理以及著色方程影響。
      ??接下來的部分將解釋圖形管線的不同階段,我們將會聚焦于功能而不是實現。一些相關的細節會在后續的章節被覆蓋。

      架構(Architecture)

      ??從工廠裝配線到快餐廚房,管線這一概念在現實世界中以多種形式展現,它也在圖形渲染中被應用。一條管線由多個階段組成,每個階段會執行大量任務的一部分。
      ??管線的階段是以并行的方式執行的,每個階段會依賴上一個階段執行完的結果。在理想的情況下,把一個非管線系統分成\(n\)個管線階段會獲得\(n\)倍的性能提升。這種性能提升是使用管線的主要原因。例如,非常多的三明治可以被一系列人快速地做好,一個人可以準備面包,一個人加肉,另一個添加配料。每個人把制作后的結果傳遞給管線中的下一個人后,就立即開始下一個三明治的制作。如果每個人要花二十秒來制作,那么每二十秒這幾個人就能制作一個三明治。雖然管線的階段是以并行的方式執行的,但是它們會停止直到最慢的階段完成它自己的任務。如果,肉的添加階段要花費更多的時間,以三十秒為例,那么制作一個三明治就要三十秒。對于這個管線來說,肉的添加階段是瓶頸Bottleneck),因為它決定了整個管線的速度。在等待肉的添加階段完成的時間中,配料階段會處于數據饑餓Starve)狀態(對于顧客也是)。
      ??這種管線的構造也在實時計算機圖形中出現。實時渲染管線可以被粗糙地劃分為四個階段,即應用程序Application)階段、幾何處理Geometry Processing)階段、光柵化Rasterization)階段、像素處理Pixel Processing)階段,下方為一張相關的示例圖。

      img

      這種結構是被用于實時計算機圖形應用中的渲染管線引擎的核心,也是后續章節討論的必要基礎。一般來說,每個階段本身也是管線,會由一些子階段構成。我們區分在這里展示的功能階段與它們的實現結構。一個功能階段有特定的任務要執行,但是不聲明任務在管線中是如何被執行的。一個給定的實現有可能結合兩個功能階段到一個單元或使用使用可編程核心來執行,同時也有可能劃分別的更加耗時的功能階段到一些硬件單元中。
      ??渲染速度有可能使用每秒幀數(FPS)來表達,也就是每秒被渲染的圖像數量。也可以使用赫茲(Hz)來表達,它只是更新的頻率,即\(1/秒\)。還可以使用毫秒(ms)來表達,也就是渲染一張圖像花費的時間。生成一張圖像的時間通常不同,會取決于每幀計算的復雜度。每秒幀數被用來表達一幀的速率或某個時間區間內的平均速率。赫茲則被用于硬件,就比如顯式速率,它是一個固定的速率。
      ??由應用程序階段這個名字可知,這個階段是由應用程序驅動的,通常由運行在通用CPU上的軟件實現。這些CPU通常包含多個核心,有能力以并行的方式處理多個線程Thread)。這就使得CPU可以高效地執行許多不同類型的應用程序階段要完成的任務。有些任務傳統上是在CPU上執行的,包括碰撞檢測、全局加速算法、動畫、物理模擬以及其它取決于應用類型的任務。下一個主要階段是幾何處理階段,它處理變換、投影以及其它所有需要解決的幾何問題。這個階段會計算要繪制的物體、物體如何被繪制、物體要在哪被繪制。幾何階段通常在包含多個可編程核心和固定功能硬件的圖形處理單元(GPU)上執行。光柵化階段通常取三個輸入的頂點構成一個三角形,然后找到所有被認為在三角形內的像素,接著讓這些像素進入下一個階段。最后的像素處理階段會為每個像素執行一個程序,來決定它的顏色。以及可能進行深度測試,來確定像素是否可見。它還有可能執行逐像素的操作,例如將計算出的顏色與之前的顏色進行混色。光柵化以及像素處理階段都是完全在GPU上執行的。第三章將會有更多的GPU如何處理這些階段的細節。

      應用程序階段(The Application Stage)

      ??對于應用程序階段是如何完成的,開發者有完全的控制權,因為它通常在CPU上執行。因此,開發者能決定整個實現方法,后續為了提升性能可以進行修改。在這里進行的改變可以影響后續階段的性能。例如,一個應用程序階段的算法或設置可以減少被繪制的三角形的數量。
      ??當然了,一些應用程序的工作可以在GPU上執行,通過使用一個單獨的叫計算著色器Compute Shader)的模式。這個模式會把GPU當作一個高度并行的通用處理器,而忽略它被用于渲染圖形這一特殊功能。
      ??在應用程序階段末尾,要被渲染的幾何體會被送入幾何處理階段。這些幾何體被稱作渲染圖元Rendering Primitive),包括點、線、三角形以及那些最終會出現在屏幕上的幾何體。這就是應用程序階段最重要的任務。
      ??基于軟件實現的一個結果是這個階段沒有被劃分為子階段。然而,為了提升性能,這個階段通常以并行的方式在多個處理器核心上被執行。在CPU的設計中,這被稱為超標量體系結構Superscalar Construction),因為它能在同一階段和時間執行一些不同的任務。
      ??通常,在這個階段實現的一個處理是碰撞檢測Collision Dectection)。當兩個物體之間的碰撞被檢測到,一個響應有可能產生然后被發送到產生碰撞的物體和力反饋設備。這個階段也會處理來自其它地方的輸入,比如鍵盤、鼠標、頭戴式顯示器。取決于輸入,一些不同類型的行為可能會被采取。加速算法,例如某個剔除算法,也會在這里被實現??傊褪且恍﹦e的階段解決不了的任務。

      幾何處理(Geometry Processing)

      ??在GPU上的幾何處理階段會負責幾乎所有的逐三角形和逐頂點操作。這個階段可以被細分成以下四個功能階段,即頂點著色、投影、裁剪、屏幕映射,如下圖所示。

      img

      頂點著色(Vertex Shading)

      ??頂點著色有兩個主要任務,一個是計算頂點的位置,另一個是計算期望的頂點輸出數據,比如法線和紋理坐標。傳統地說,物體的著色都是在頂點上進行的,為頂點計算出的顏色會在三角形上進行插值。正是因為這樣,可編程的頂點處理單元被稱為頂點著色器。隨著GPU的發展,著色可以逐像素進行,頂點著色階段就變得更加通用化,取決于編程者的意圖,頂點著色階段可能不會評估任何著色方程。在當下,頂點著色器是個更加通用的單元,專門被用來設置和每個頂點關聯的數據。
      ??我們首先描述頂點位置是如何被計算的,一系列坐標總是需要的。在去屏幕的路上,一個模型會被變換到數個不同的空間Space)或坐標系Coordinate System)。一開始,模型存在于它自己的模型空間Model Space)中,這意味著還沒被變換。每個模型可以與一個模型變換Model Transform)關聯,從而讓模型能有位置和朝向。一個模型可能與多個模型變換關聯,這樣能讓相同模型的拷貝(實例Instance))在同一場景中有不同的位置、朝向、大小,而不需要復制基本的幾何體。
      ??會被變換的是模型的頂點和法線。一個物體的坐標叫模型坐標Model Coordinate),模型的坐標被模型變換后,模型會位于世界坐標World Coordinate)或世界空間World Space)。世界空間是獨特的,當模型被各自的模型變換所變換后,所有的模型都會處于世界空間。
      ??正如之前提到的那樣,只有被相機看到的模型才會被渲染。相機在世界空間中有位置和朝向,為了方便投影和裁剪,相機和所有的模型都會進行視圖變換View Transform)。視圖變換是為了把相機放在原點,并且讓相機看著\(-z\)軸,此外還要讓\(+y\)軸為相機的上方,讓\(+x\)軸為相機右方。我們讓相機看著\(-z\)軸,而有些書傾向讓相機看著\(+z\)。這兩者之間只是約定不同,因為從其中一個轉換到另一個很簡單。在視圖變換后,實際的位置和方向會取決于底層的API。視圖變換后的空間被稱為相機空間Camera Space),或更加通常的視圖空間View Space)或眼空間Eye Space)。視圖變換對相機和模型的影響如下圖所示。

      img

      模型變換和視圖變換可能都是用\(4 \times 4\)的矩陣實現的,這是第四章的話題。然而,意識到頂點的位置和法線可以以任何方式來計算很重要。
      ??接下來,我們討論來自頂點著色的第二種輸出類型。為了生成一個真實的場景,僅僅渲染形狀和物體的位置是不夠的,它們的外表應該也被建模。而這包括每個物體的材質以及作用于物體的任何光源。材質和光源可以使用多種方式來建模,從簡單的顏色到物理描述的詳細展示。
      ??決定光源作用于材質的效果的操作被稱為著色Shading)。它涉及為物體的不同位置計算一個著色方程Shading Equation)。通常情況下,這些計算會逐頂點進行,而在另一些情況則會逐像素進行。各種材質數據可以存儲于頂點,比如位置、法線、顏色以及任何需要用來評估著色方程的數據。頂點著色的結果接著會被送入光柵化和像素處理階段,這些結果會被插值然后用來計算表面的著色。
      ??GPU頂點著色器形式的頂點著色在書中會有更深入的討論,特別是在第三章和第五章。
      ??作為頂點著色的一部分,渲染系統會進行投影Projection),接著進行裁剪。這會把視圖體變換到單位立方體,即\(x,y,z \in [-1,1]\)。有些不同的范圍也被使用,例如\(0 \leq z \leq 1\)。單位立方體被稱為規范視圖體Canonical View Volume)。投影是最先被完成的,在GPU上則會由頂點著色器完成。有兩種常用的投影方法,一種為正交Orthographic)投影,另一種為透視Perspective)投影,如下圖所示。

      img

      事實上,正交投影只是平行投影的一種形式。其它的常用形式有斜投影和軸測投影等等。
      ??正交視圖的視圖體通常是一個矩形盒,正交投影會把這種視圖體變換到單位立方體,它的一個主要特點是平行線被變換后會保持平行。這個變換是平移和縮放的結合。
      ??透視投影則更加復雜,在這一類型的投影中,遠離相機的物體被投影后會更小。平行線被投影后可能在地平線匯聚。因此,透視變換模擬了我們如何感知物體的大小。從幾何上說,視圖體被稱為一個截頭錐體Frustum),它是一個有著矩形底面被截取的金字塔,它也會被變換到單位立方體。正交和投影變換都能用\(4 \times 4\)的矩陣來構造,在被任意一種投影矩陣變換后,模型會位于裁剪坐標Clip Coordinate)。這些實際上是齊次坐標,會在第四章被討論,它會在除以\(w\)之前出現。GPU的頂點著色器必須總是輸出這種坐標來讓下一個功能階段(裁剪)正確地工作。
      ??盡管這些矩陣會把一個體變換到另一個體,但是它們都被稱作投影。因為在顯示后,z坐標不會存儲于圖像而是在z緩沖中。這樣,模型就從三維被投影到了二維。

      可選的頂點處理(Optional Vertex Processing)

      ??每條管線都有上述描述的頂點處理。一旦處理完成了,就沒有多少可選的在GPU上執行的階段,以執行順序排列有:鑲嵌細分、幾何著色、流輸出。它們的使用取決于硬件的能力和編程者的想法。此外它們都是相互獨立的,一般都不被常用。在第三章有這些可選的階段的更多討論。
      ??第一個可選階段是鑲嵌細分Tessellation)。想象一下有個跳躍的球物體,如果你使用三角形來表示它,那么就會遇到質量或性能上的問題。從5米觀察可能看起來很好,但是近距離觀察會發現每個三角形。為了解決這一問題,你會用更多的三角形來提升質量,但是從遠處觀察時會浪費可觀的處理時間和內存。使用鑲嵌細分,一個曲面可以用合適數量的三角形來表示。
      ??關于三角形我們只討論了一點,但目前的管線只處理了頂點。這些頂點可以被用來表示點、線、三角形或其它物體。頂點也可以被用來表示曲面,就比如球。這種表面可以使用一系列曲面片來聲明,這些曲面片是由一系列頂點構成的。鑲嵌細分階段由一系列階段構成,包括:外殼著色器、細分器、域著色器。它們能把一系列曲面片頂點轉化成更多頂點的集合,從而生成更多的三角形。場景的相機可以被用來決定有多少三角形要生成,當相機離曲面片近時就生成更多三角形,反之則更少。
      ??下一個可選階段是幾何著色器Geometry Shader)。這個著色器早于鑲嵌細分著色器,因此在GPU中更常見。它與鑲嵌細分著色器類似,會取不同類型的圖元生成更多的頂點。不過它是個簡單得多的階段,這種生成有范圍限制,且輸出圖元的類型被更嚴格地限制。幾何著色器有一些用途,其中一個最受歡迎的就是粒子生成。想象模擬煙花爆炸,每個火球都可以用一個頂點來表示。幾何著色器能取每個頂點,然后將其變成一個面向相機的正方形,這樣就提供了一個更好的圖元讓我們著色。
      ??最后一個可選階段是流輸出Stream Output)。這個階段能讓我們把GPU當作一個幾何引擎。處理后的頂點可以為了后續的處理被輸出到數組,而不是被輸出到管線的剩余部分,直到被渲染在屏幕上。這個階段通常被用于粒子模擬,比如之前說的煙花例子。
      ??這三個階段會以如下順序執行:鑲嵌細分、幾何著色、流輸出,且每個階段都是可選的。

      裁剪(Clipping)

      ??只有那些完全或部分在視圖體內的圖元需要被送入光柵化階段,接著在屏幕上被繪制。完全在視圖體內的圖元可以直接進入下一階段,而完全在視圖體外的圖元不需要被渲染。對于部分在視圖體內的圖元,我們需要進行裁剪。比如有根直線,它的一個頂點在外另一個頂點在內,我們應該使用視圖體來裁剪這根直線,把在外的頂點替換成直線與視圖體的交點。使用投影矩陣意味著被變換的圖元要使用單位立方體來裁剪。在裁剪前進行視圖和投影變換能讓裁剪操作有一致性,要被裁剪的圖元總是會被單位立方體裁剪。裁剪的過程如下圖所示。

      img

      除了六個裁剪平面外,用戶還可以定義額外的平面來裁剪物體,這種類型的可視化叫做剖切Sectioning),如下圖所示。

      img

      ??裁剪步驟會使用通過投影生成的齊次坐標值。在透視空間中,頂點的攜帶的值通常不會在三角形上線性插值。當使用透視投影時,會需要第四個坐標來讓數據被正確地插值和裁剪。最后,會進行透視除法Perspective Division),三角形的位置會處于三維歸一化設備坐標Normalized Device CoordinateNDC)。之前提到過,這個視圖體的范圍為\(x,y,z \in [-1,1]\)。幾何階段的最后一步會把這個空間轉化到窗口坐標。

      屏幕映射(Screen Mapping)

      ??只有在視圖體內(被裁剪)的圖元會被送入屏幕映射階段,在這個階段每個圖元的\(x\)\(y\)坐標會被變換到屏幕坐標Screen Coordinates)。屏幕坐標與\(z\)坐標一起被稱為窗口坐標Window Coordinate)。假設場景要被渲染到有著最小角落\((x_1,y_1)\)和最大角落\((x_2,y_2)\)的窗口,那么屏幕映射是一次平移接著一次縮放的操作。新的\(x\)\(y\)坐標是屏幕坐標。\(z\)坐標(\([-1,+1]\)對于OpenGL,\([0,1]\)對于DirectX)也會被映射到\([z_1,z_2]\),\(z_1=0\)\(z_2=1\)會作為默認值,這兩個值可以用API來改變。窗口坐標與再映射的\(z\)值會被送入光柵器階段。屏幕映射的過程如下圖所示。

      img

      ??接下來,我們描述整數和浮點數是如何與像素聯系的。給定使用笛卡爾坐標的一組水平像素,最左側像素的左邊緣的浮點坐標為\(0.0\)。OpenGL總是使用這個方案,并且DirectX 10和它的繼任者也使用這個方案。這個像素的中心在\(0.5\)。因此,有著范圍\([0,9]\)的像素覆蓋了\([0.0,10.0)\)的范圍。可以使用如下簡單的公式進行轉換。

      \[\begin{align*} d &= \mathrm{floor}(c) \\ c &= d + 0.5 \end{align*} \]

      其中的\(d\)為像素的離散索引,而\(c\)為像素中的連續值。
      ??雖然所有API的像素位置的值都會從左往右增加,但是從下往上則不一致,比如OpenGL和DirectX。OpenGL從始至終傾向于笛卡爾系統,讓左下角為有最低值的元素。取決于上下文,DirectX有時定義左上角為有最低值的元素。這兩者有各自的邏輯,在它們有區別的地方沒有正確的答案。例如,在OpenGL中\((0,0)\)為圖像左下角,在DirectX中則為左上角。當從一個API轉移到另外一個API時要注意這個重要的區別。

      光柵化(Rasterization)

      ??有了變換和投影后的頂點以及與頂點關聯的著色數據后,下一階段的目標就是找到所有在圖元內的像素Picture Element,Pixel)。我們稱這個過程為光柵化,且分為兩個子功能階段,即三角形設定和三角形遍歷,下方為一張示例圖。

      img

      要注意的是光柵化也可以處理點和線,但由于三角形是最常見的,因此子階段的名字中有“三角形”。光柵化也可以被稱為掃描轉換Scan Conversion),是從有著z值和各種著色信息的屏幕空間內的二維頂點到屏幕上的像素的轉換。光柵化還可以被認為是幾何處理和像素處理之間的同步點,因為在這里三角形由三個頂點組成,并且最終要被送入像素處理。
      ??三角形是否與像素重疊取決于你如何設定GPU管線。比如,你可能使用點采樣來確定像素是否在三角形內。最簡單的情況就是判斷每個像素的中心是否在三角形內,如果在那么對應的像素就被認為在三角形內。你也許會使用超采樣或多重采樣抗走樣技術來為每個像素使用多個樣本。還有一個方法是使用保守光柵化,只要像素與三角形重疊,那么就認為這個像素在三角形內。

      三角形設定(Triangle Setup)

      ??在這個階段微分、邊方程以及其它用于三角形的數據都會被計算。這些數據可能被用于三角形遍歷,或從幾何階段生成的各種著色數據的插值。固定功能硬件會被用于這個任務。

      三角形遍歷(Triangle Traversal)

      ??在這里,每個像素會被檢查是否在三角形內,如果在那么會有一個片段Fragment)生成,對應著這個像素。找到在三角形內的樣本或像素通常被稱為三角形遍歷Triangle Traversal)。每個三角形片段的屬性會從組成這個三角形的三個頂點的屬性插值得到。這些屬性包括片段的深度以及任何來自幾何階段的著色數據。所有在圖元內的像素或樣本接著會被送入像素處理階段。

      像素處理(Pixel Processing)

      ??到這里,所有被認為在三角形或其它圖元的像素都被到找了。像素處理階段被劃分為像素著色Pixel Shading)和合并Merging),這兩個階段如下圖所示。

      img

      像素處理是逐像素或逐樣本計算的階段,各種計算會應用于那些在圖元內的像素或樣本。

      像素著色(Pixel Shading)

      ??任何逐像素著色計算會在這里進行,并使用插值后的著色數據。最終的結果是被傳入到下一個階段的一或多個顏色。不像三角形設定和三角形遍歷階段那樣由專用硬件硅芯片執行,像素著色階段是通過可編程GPU核心執行的。編程者需要為像素著色器(對于OpenGL來說是片段著色器)提供一個程序,它可以包含任何期望的計算。有非常多的技術可以在這里實施,最重要之一的是紋理映射Texturing)。第六章中有更多的紋理映射的細節。你可以把紋理映射一個物體當作為了不同目的,把一個或多個圖像“粘”在物體上,下方是這個過程的一個示例。

      img

      圖像可以是一維、二維或三維的,其中二維圖像是最常見的。簡而言之,對于每個片段會有一個顏色計算出來,這些片段接著會被傳遞到下一個子階段。

      合并(Merging)

      ??每個像素的信息存儲于顏色緩沖Color Buffer)中,它是顏色的矩形數組(對于每個顏色有紅、綠、藍三個分量)。合并階段的責任就是結合片段與緩沖中片段對應的像素的顏色。這個階段也被稱為ROP,取決于你問的人,它可以是光柵操作(管線)或渲染輸出單元。不像著色階段,執行這個階段的GPU子單元通常不是完全可編程的。然而,它是高度可配置的,允許各種各樣的效果。
      ??這個階段也會負責確定可見度。這意味著當整個場景被渲染時,顏色緩沖應該包含場景中對于相機可見的圖元的顏色。對于大多數甚至是所有圖形硬件來說,這是通過z緩沖(也被稱為深度緩沖Depth Buffer))算法完成的。一個z緩沖與顏色緩沖有著相同的大小和形狀,對于每個像素,它會存儲圖元在這個像素最近的z值。這意味著當圖元被渲染到某個像素上時,圖元在這個像素位置的z值會被計算,并與z緩沖中相同像素位置存儲的z值比較。如果新的z值比z緩沖存儲的z值小,那么被渲染的圖元在這個像素位置與相機的距離比之前記錄的最近距離還要近。因此,這個像素的z值和顏色會被來自被繪制圖元的z值和顏色更新。如果新的z值比z緩沖存儲的z值小,那么什么都不做。z緩沖算法很簡單,有著\(O(n)\)的時間復雜度,而且適用于任何被繪制的圖元,只要圖元在像素位置的z值是可以被計算的。還要注意這個算法允許大多數圖元以任意順序被繪制,這是另一個它受歡迎的原因。然而,z緩沖只為屏幕上的每個點存儲單獨的深度,因此它不能被用于部分透明的圖元。這種圖元必須在所有不透明圖元被繪制后,以從后往前的順序,或使用一個順序無關的算法進行繪制。透明度是基礎的z緩沖一個主要的弱點。
      ??我們已經提到顏色緩沖會存儲顏色,z緩沖會存儲z值。然而,有其它通道和緩沖可以被用來過濾和捕捉片段信息。阿爾法通道Alpha Channel)會與顏色緩沖相關聯,它會存儲與每個像素關聯的不透明度值。在更老的API中,阿爾法通道被用來通過阿爾法測試特性來選擇性地拋棄像素。如今,拋棄操作可以被插入像素著色器程序中,任何類型的計算都能被用來觸發一次拋棄。這種類型的測試確保了完全透明的片段不會影響z緩沖。
      ??模板緩沖Stencil Buffer)是個離屏緩沖,它被用來記錄被渲染圖元的位置。每像素通常包含8比特。圖元可以使用各種函數被渲染到模板緩沖上,緩沖的內容接著可以被用來控制渲染到顏色緩沖和z緩沖上的內容。假設有個實心圓被繪制到了模板緩沖上。通過模板緩沖,我們可以讓只有實心圓存在的區域才有圖元被繪制。模板緩沖是個強大的工具,能實現一些特殊效果。管線末尾的所有功能可以被稱為光柵操作Raster OperationsROP)或混合操作Blend Operation)。在像素著色階段計算出的顏色可以與顏色緩沖當前存儲的值混合。這能允許透明度或顏色樣本的累積。之前提到過,混合通常是可配置的而不是完全可編程的。然而,有些API支持光柵順序視圖,也被稱為像素著色器排序,它允許可編程的混合能力。
      ??幀緩沖Framebuffer)通常由系統上的所有緩沖組成。
      ??當圖元到達了光柵器階段時,那些對于相機可見的圖元會被顯示到屏幕上。屏幕會顯示顏色緩沖的內容。為了避免觀察到圖元正在被光柵化且被送到屏幕上,雙重緩沖Double Buffering)會被使用。這意味著場景的渲染會在一個叫后緩沖Back Buffer)的地方離屏進行。一旦場景被渲染完了,后緩沖就會與被顯示的前緩沖Front Buffer)進行交換。交換通常發生在垂直回掃Vertical Retrace)期間,在這段時間進行交換是安全的。

      通過管線(Through the Pipeline)

      ??點、線、三角形是組成模型和物體的渲染圖元。想象應用程序是一個交互式計算機輔助設計Computer Aided Design)應用程序,用戶正在檢查華夫餅機的設計。在這里,我們跟隨模型穿過整個圖形渲染管線的四個階段。場景會通過透視渲染到屏幕上的窗口。在這個簡單的例子中,華夫餅機模型包括線和三角形。華夫餅機有一個蓋子能被打開。有些三角形會使用有著制造商Logo的二維圖像進行紋理映射。對于這個例子,表面著色會完全在幾何階段進行,除了有紋理的應用外,它會在光柵化階段進行。

      應用程序(Application)

      ??CAD應用程序允許用戶選擇和移動模型的部件。比如,用戶可能選擇蓋子,接著移動鼠標并打開它。應用程序階段必須把鼠標移動轉換成對應的旋轉矩陣,并確保在渲染時矩陣被正確應用于蓋子。另一個例子是相機隨著預定義的路徑移動,從不同視角展示華夫餅機的動畫。相機的屬性例如位置和觀察方向必須隨著時間被應用程序更新。對于被渲染的每一幀,應用程序階段都會設置相機位置、光照以及進入管線中下一個主要階段的圖元。

      幾何處理(Geometry Processing)

      ??對于透視視圖,我們假設應用程序已經提供了一個投影矩陣。此外,對于每個物體,假設應用程序已經計算出了一個矩陣描述物體的位置和朝向以及它的視圖變換。在我們的例子中,華夫餅機的底座會有一個矩陣,蓋子會有另一個矩陣。在幾何階段,物體的頂點和法線會使用這個矩陣變換到視圖空間。接著在頂點的著色或其它的計算可能會進行。然后另一個單獨的投影矩陣會被用來進行投影,把物體變換到單位立方體空間。所有可見的物體都會在這個空間中,那些在立方體外的圖元都會被拋棄,而那些與單位立方體相交的圖元都會被立方體裁剪。頂點接著被映射到屏幕上的窗口。在所有的逐三角形和逐頂點操作被執行后,結果數據會被傳遞到光柵化階段。

      光柵化(Rasterization)

      ??在上一個階段所有從裁剪存活的圖元接著都會被光柵化,這意味著所有在圖元內的像素會被找到并送往像素處理。

      像素處理(Pixel Processing)

      ??這里的目標是為了給每個可見圖元的每個像素計算顏色。那些與任意紋理(圖像)關聯的三角形在這里會使用紋理映射進行渲染??梢姸葧ㄟ^z緩沖算法確定,伴隨著可選的拋棄和模板測試。每個物體會依此被處理,最終的圖像接著被顯示在屏幕上。

      posted @ 2025-09-24 21:52  TiredInkRaven  閱讀(60)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲暴爽av天天爽日日碰| 中国老熟妇自拍hd发布| 99久久精品久久久久久婷婷| 一区二区三区久久精品国产| 亚洲欧美日韩综合久久| 国产精品无码免费播放| 一区二区三区四区亚洲综合| 亚洲an日韩专区在线| 高清国产av一区二区三区| 久久这里都是精品一区| 日本高清视频网站www| 国产亚洲精品VA片在线播放| 霸州市| 亚洲综合色一区二区三区| 日韩AV无码精品一二三区| 中文有无人妻vs无码人妻激烈| 最新精品国偷自产在线美女足| 五月丁香六月综合缴清无码| 亚洲另类激情专区小说婷婷久| 日韩精品福利一区二区三区 | av资源在线看免费观看| 中文字幕国产精品资源| 国产精品一区二区三区91| 亚洲精品电影院| 亚洲av第二区国产精品| 免费又大粗又爽又黄少妇毛片| 麻豆国产成人AV在线播放| 国产成AV人片久青草影院| 狠狠躁夜夜躁无码中文字幕| 日韩精品久久一区二区三| 一个人在线观看免费中文www| 粉嫩一区二区三区精品视频| 国产成人精彩在线视频| 2019国产精品青青草原| 国产美女久久久亚洲综合| 国产在线啪| 国产极品粉嫩尤物一线天| 日韩中文字幕有码av| 东光县| 视频免费完整版在线播放| 在线涩涩免费观看国产精品|