OpenGL图形渲染管线(Pipeline)学习
OpenGL圖形渲染管線(Pipeline)學習
- 1.0 圖形渲染管線概述
- 2.0 圖形渲染管線處理流程
- 2.1 頂點數據(Vertex Data)
- 2.2 頂點著色器(Vertex Shader)
- 2.2.1 世界坐標
- 2.2.2 局部坐標
- 2.2.3 觀察坐標
- 2.2.4 裁剪坐標:
- 2.3 圖元裝配(Shape Assembly)
- 2.4 幾何著色器(Geometry Shader)
- 2.5 細分著色器(Tesselation shader(s))
- 2.6 光柵化(Rasterization)
- 2.7 片段著色器(Fragment Shader)
- 2.7 測試與混合(Tests And Blending)
學習參考:
https://blog.csdn.net/dcrmg/article/details/53556664
https://zhuanlan.zhihu.com/p/79183044
https://blog.csdn.net/u010356727/article/details/50594401
https://www.cnblogs.com/tandier/p/8110977.html
1.0 圖形渲染管線概述
圖形渲染管線被認為是實時圖形學中的核心部分。渲染管線的功能是通過給定虛擬相機、3D場景物體以及光源等場景要素來渲染一副2D的圖像。如下圖所示,場景中的3D物體通過管線轉變為屏幕上的2D圖像。渲染管線因此是實時渲染的底層工具。畫面中對象物體的位置和形狀是由它們的幾何形狀,環境的特性以及在環境中攝像機的位置所共同決定的。對象物體的外觀表現則是由材質的屬性,光源,紋理貼圖,以及著色模型所影響。
左圖中,一虛擬攝像機放置在棱椎的頂部(即四條線交匯處)。只有可視體內部的圖元會被渲染。因為圖像是以透視投影被渲染的(像這里的情況)。可視體是一個視錐體,一個有著矩形底座的截頭型金字塔。右圖展示了攝像機所能看見的一切。注意在左圖中紅色的甜甜圈形狀的物體在右圖中沒有被渲染,因為它位于是視椎體的外面。左圖中那個扭曲的藍色棱鏡狀物體被視椎體頂部的平面所截斷。
圖形渲染管線主要包括兩個功能:
2.0 圖形渲染管線處理流程
圖形渲染管線的整個處理流程可以被劃分為幾個階段,上一個階段的輸出數據作為下一個階段的輸入數據,是一個串行的,面向過程的執行過程。每一個階段分別在GPU上運行各自的數據處理程序,這個程序就是著色器(shader)。部分著色器允許我們使用著色語言(OpenGL Shading Language)編寫自定義的著色器,這樣就可以更為細致的控制圖像渲染流程中的特定處理過程了,下圖是一個圖形渲染管線每一個階段的抽象表示,藍色部分代表允許自定義著色器。
2.1 頂點數據(Vertex Data)
頂點數據用來為后面的頂點著色器等階段提供處理的數據。是渲染管線的數據主要來源。送入到渲染管線的數據包括頂點坐標、紋理坐標、頂點法線和頂點顏色等頂點屬性。為了讓OpenGL明白頂點數據構成的是什么圖元,我們需要在繪制指令中傳遞相對應的圖元信息。常見的圖元包括:點(GL_POINTS)、線(GL_LINES)、線條(GL_LINE_STRIP)、三角面(GL_TRIANGLES)。
2.2 頂點著色器(Vertex Shader)
頂點著色器主要功能是進行坐標變換。將輸入的局部坐標變換到世界坐標、觀察坐標和裁剪坐標。雖然我們也會在頂點著色器進行光照計算(稱作高洛德著色),然后經過光柵化插值得到各個片段的顏色,但由于這種方法得到的光照比較不自然,所以一般在片段著色器進行光照計算。
2.2.1 世界坐標
世界坐標是不會變的,一直以世界坐標軸的XYZ為標準。
2.2.2 局部坐標
所謂局部坐標系(Local Coordinate),也就是坐標系以物體的中心為坐標原點,物體的旋轉或平移等操作都是圍繞局部坐標系進行的,這時,當物體模型進行旋轉或平移等操作時,局部坐標系也執行相應的旋轉或平移操作。
2.2.3 觀察坐標
觀察坐標系又稱目坐標系( Eye Coordinates),簡稱EC,該坐標系是一個可定義在用戶坐標系中任何方向、任何地方的三維直角輔助坐標系。在觀察坐標系中通常要定義一個垂直于該坐標系Z軸的平面,稱觀察平面。該坐標系主要用于指定裁剪空間,確定三維幾何形體哪一部分需要在屏幕上輸出;此外,通過觀察平面可以把世界坐標系中三維幾何形體需輸岀部分的坐標值轉換為規格化坐標系中的坐標值。
2.2.4 裁剪坐標:
在一個頂點著色器運行的最后,OpenGL期望所有的坐標都能落在一個特定的范圍內,且任何在這個范圍之外的點都應該被裁剪掉(Clipped)。被裁剪掉的坐標就會被忽略,所以剩下的坐標就將變為屏幕上可見的片段。這也就是裁剪空間(Clip Space)名字的由來。
2.3 圖元裝配(Shape Assembly)
圖元組裝將輸入的頂點組裝成指定的圖元,包括點,線段,三角形等,是構成實體模型的基本單位。圖元組裝階段會進行裁剪和背面剔除相關的優化,以減少進入光柵化的圖元的數量,加速渲染過程。在光柵化之前,還會進行屏幕映射的操作:透視除法和視口變換。
2.4 幾何著色器(Geometry Shader)
幾何著色器也是渲染管線一個可選的階段。我們知道,頂點著色器的輸入是單個頂點(以及屬性), 輸出的是經過變換后的頂點。與頂點著色器不同,幾何著色器的輸入是完整的圖元(比如,點),輸出可以是一個或多個其他的圖元(比如,三角面),或者不輸出任何的圖元。幾何著色器的拿手好戲就是將輸入的點或線擴展成多邊形。下圖展示了幾何著色器如何將點擴展成多邊形。
2.5 細分著色器(Tesselation shader(s))
曲面細分是利用鑲嵌化處理技術對三角面進行細分,以此來增加物體表面的三角面的數量,是渲染管線一個可選的階段。它由外殼著色器(Hull Shader)、鑲嵌器(Tessellator)和域著色器(Domain Shader)構成,其中外殼著色器和域著色器是可編程的,而鑲嵌器是有硬件管理的。我們可以借助曲面細分的技術實現細節層次(Level-of-Detail)的機制,使得離攝像機越近的物體具有更加豐富的細節,而遠離攝像機的物體具有較少的細節。
2.6 光柵化(Rasterization)
光柵化是將幾何數據經過一系列變換后最終轉換為像素,從而呈現在顯示設備上的過程。這是一個將模擬信號轉化為離散信號的過程。
光柵化過程產生的是片元,片元中的每一個元素對應于幀緩沖區中的一個像素。光柵化會確定圖元所覆蓋的片段,利用頂點屬性插值得到片段的屬性信息,然后送到片段著色器進行顏色計算,我們這里需要注意到片段是像素的候選者,只有通過后續的測試,片段才會成為最終顯示的像素點。
光柵化其實是一種將幾何圖元變為二維圖像的過程。該過程包含了兩部分的工作。
第一部分工作:決定窗口坐標中的哪些整型柵格區域被基本圖元占用;
第二部分工作:分配一個顏色值和一個深度值到各個區域。
光柵化的本質是坐標變換、幾何離散化,如下圖:
2.7 片段著色器(Fragment Shader)
片段著色器用來決定屏幕上像素的最終顏色。在這個階段會進行光照計算以及陰影處理,是渲染管線高級效果產生的地方。在計算機圖形中,顏色被表示為有4個元素的數據,RGBA(RGBA是代表Red(紅色)Green(綠色)Blue(藍色)和Alpha的色彩空間),當在OpenGL或者GLSL中定義一個顏色,我們把顏色每個分量的強度設置在0.0到1.0之間。
2.7 測試與混合(Tests And Blending)
管線的最后一個階段是測試混合階段。測試包括裁切測試、Alpha測試、模板測試和深度測試。沒有經過測試的片段會被丟棄,不需要進行混合階段;經過測試的片段會進入混合階段。Alpha混合可以根據片段的alpha值進行混合,用來產生半透明的效果,這些測試與混合操作決定了屏幕視窗上每個像素點最終的顏色以及透明度。
Alpha表示的是物體的不透明度,因此alpha=1表示完全不透明,alpha=0表示完全透明。測試混合階段雖然不是可編程階段,但是我們可以通過OpenGL或DirectX提供的接口進行配置,定制混合和測試的方式。
總結
以上是生活随笔為你收集整理的OpenGL图形渲染管线(Pipeline)学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的前同事,阿里大牛的技术感悟
- 下一篇: 昨晚三巨头聚餐,顺便聊了这三个问题