OpenGL超級寶典筆記8


第十四章 深度紋理和陰影

陰影貼圖是一種實用的技巧,可以實現逼真的光照效果,而不需要大量的額外處理。光源的視點可以用於確定哪些物體被照射以及哪些物體被陰影所遮掩。深度紋理是一種特殊的紋理,它存儲深度緩衝區的內容,把它作爲陰影貼圖使用。

a) 一種新類型的紋理 我們需要把深度值從深度緩衝區複製到一個紋理中,作爲陰影貼圖使用。OpenGL允許通過glCopyTexImage2D函數直接把顏色值複製到紋理中。

b) 首先繪製陰影,模擬一些環境光,然後就是光照。 我們需要以紋理座標爲結束,它將索引到光源的裁剪空間的陰影貼圖中。首先把視覺線性紋理座標投影到照相機的視覺空間。因此要回溯到場景空間,然後再變換到光源的視覺空間並最終變換到光源的裁剪空間。矩陣乘法表示爲M=P_light*MV_light*MV_camera-1 。設置一個紋理矩陣,負責實現必要的紋理座標操作。然後,將使用與視覺線性紋理座標生成相關聯的平面方程式,使紋理矩陣發揮作用。

c) 陰影比較 最後把深度測試設置爲“小於等於”,這樣我們就可以在微弱的基礎上進行光照下的繪圖。否則,由於幾何圖形是相同的,光照將無法通過深度測試,這樣在弱光陰影之後就不會顯示任何東西,接着將生成紋理把它綁定到陰影貼圖中,把紋理座標環境模式設置爲截取到邊緣紋理單元。

 

第十五章 可編程管線:這已不是舊式的OpenGL

學習OpenGL着色語言GLSL的基礎知識,討論所有的變量類型、操作符以及操控流機制。還描述如何使用命令加載和編譯着色器對象,以及鏈接和使用程序對象。

a) 新的佔主導,着色器 它的實質是應用程序所定義的自定義程序,用於接替固定功能管線階段的職責。可編程頂點着色器,能夠替代頂點變換、光照、紋理座標處理。固定功能膠水:在頂點着色器和片段着色器之間,仍然保留了一些固定功能階段,它們將作爲粘貼兩種着色器的膠水。可編程片段着色器能夠替代紋理、顏色求和、替代霧。

b) 管理高層着色器 GLSL使用兩種類型的對象:着色器對象和程序對象。着色器對象加載着色器文本並對它進行編譯。調用glGreateShader函數創建着色器,而glDeleteShader函數是刪除着色器。着色器對象的目標是簡單地接受着色器文本並對它進行編譯,當着色器文本被加載到一個着色器對象之後,需要對它進行編譯。編譯過程就是解析着色器並確保其中不存在錯誤。

c) 第二種類型對象是程序對象 這種對象作爲着色器對象的容器使用,把它們鏈接到一個可執行文件。關於程序對象操作的函數有:創建和刪除、粘附和分離、鏈接程序、驗證程序和使用程序。

d) 變量和函數必須預先進行聲明。變量包括:基本類型、結構、數組、限定符、內置的變量。表達式包括:操作符、數組訪問、構造函數、成分選擇。控制流包括:循環、if/elsediscard、函數。

 

第十六章 頂點着色,自行轉換、光照和Texgen

講述頂點着色器能夠讓讀者對它有一個清晰的認識。在現實應用中,頂點着色器常常只扮演與它們對應的片段着色器的支持角色,執行一些諸如準備紋理座標之類的輔助任務。

a) 散射光照 需要考慮表面相對於入射光線的方向,方程式如下:C_diff = max{N*L,0} x C_mat x C_li // N是這個頂點的單位法線,L是表示從頂點到光源的單位向量的方向。C_mat是表面材料的顏色,C_li是光線的顏色,C_diff是最終的散射顏色。

b) 鏡面光照 需要考慮表面相對於入射光線的方向,方程式如下:C_spec = max{n*h,0}^Sexp x C_mat x C_li //H是代表光線向量和視圖向量之間夾角正中的方向,稱爲半角向量。Sexp是鏡面指數,用於控制鏡面光照的緊密程度。C_spec是最終產生的鏡面顏色。

c) 基於頂點的霧 儘管霧是基於片段的光柵化階段才指定的,出現在紋理階段之後。但是,在OpenGL實現常常把絕大多數必要的計算提前到頂點階段,然後把結果插值到圖元中。這樣可以大大的提高性能,對圖像精確度的損失幾乎可以忽略不計。

d) 基於頂點的點大小 對於遠離觀察點的物體,應用霧效果後,顏色也會變淡。類似地,靠近觀察點的物體的點大小要大於距觀察點較遠的點大小。和霧一樣,點縮減也是一種非常實用的傳遞透視信息的視覺線索,它所需要的計算也非常類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章