opengl glsl 深度計算 - w3c學習教程

文章推薦指數: 80 %
投票人數:10人

gl_fragcoord和gl_fragdepth分別是片元著色器的輸入和輸出變數。

gl_fragcoord是個vec4,四個分量分別對應x, y, z和1/w。

其中,x和y ... openglglsl深度計算 2021-06-0919:16:17字數1554閱讀6837 本文出自: gl_fragcoord和gl_fragdepth分別是片元著色器的輸入和輸出變數。

gl_fragcoord是個vec4,四個分量分別對應x,y,z和1/w。

其中,x和y是當前片元的視窗相對座標,不過它們不是整數,小數部分恆為0.5。

x-0.5和y-0.5分別位於[0,windowwidth-1]和[0,windowheight-1]內。

windowwidth和windowheight都以畫素為單位,亦即用glviewport指定的寬高。

w即為乘過了投影矩陣之後點座標的w,用於perspectivedivide的那個值。

gl_fragcoord.z/gl_fragcoord.w可以得到當前片元和camera之間的距離。

參見foginglslpage4。

gl_fragcoord.z是固定管線計算出的當前片元的深度。

它已經考慮了多邊形偏移,並經過了投影變換。

它位於[0.0,1.0]之間。

如果用gl_fragcolor=vec4(vec3(gl_fragcoord.z),1.0)將其視覺化,多半會看到一片白。

這是由於變換的非線性,大多數點的深度都非常接近於1。

用gl_fragcolor=vec4(vec3(pow(gl_fragcolor.z,exp)),1.0)並將exp取為合適的值,就能看到從黑到白的深度變化了。

距離觀察者近的顏色深,接近0.0;距離觀察者遠的顏色淺,接近1.0;這說明一直以來的右手座標系在投影變換後變成了左手座標系。

關於深度的變換和精確性參見openglfaq-12thedepthbuffer。

根據glslangspec.full.1.30.08(p61),gl_fragcoord.z是固定功能計算所得的結果。

如果片元著色器不寫gl_fragdepth,那麼這個值將用在後續處理中。

openglshadinglanguage提到(p104),即使將gl_fragcoord.z賦值給gl_fragdepth也不能保證產生和固定功能完全相同的值。

但是,可以保證相對正確。

加之片元著色器一旦寫入gl_fragdepth,就必須保證在每個分支都有寫入。

因此,如果一個著色器需要在某些條件下自己計算深度,其它條件下的正確做法就是gl_fragdepth=gl_fragcoord.z。

在opengl的固定管線中,深度座標是在視口變換期間變換到gldepthrange指定的範圍之內(opengl程式設計指南-原書第五版,88頁)。

視口變換也就是光柵化(rasterization),在進行到片元著色器的時候自然已經編碼完畢了。

自行計算片元深度可以用下面的方法(參考openglfaq-12thedepthbuffer): [cpp]viewplain copy print? // vertex shader varying vec4 position;   void main(void)   // fragment shader uniform float zfar;   uniform float znear;   varying vec4 position;   void main()     這樣計算出的深度與gl_fragcoord.z基本一致。

opengl深度1直觀理解深度其實就是該象素點在3d世界中距離攝象機的距離,深度快取中儲存著每個象素點繪製在螢幕上的的深度值!深度測試決定了是否繪製... openGL深度測試opengl裡常出現深度測試,一直不清楚。

今天就來弄清楚。

1什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離繪製座標,... openGL及GLSL的小知識uniform表明是外部程式傳遞給頂點著色器和片段著色器的變數attribute表明是只能在頂點著色器使用的變數,用來表示頂點座標,法... 相關推薦 什麼是OpenGL中的深度深度快取深度測試? 相關推薦 什麼是OpenGL中的深度深度快取深度測試? 相關閱讀 七夕,染紅了我的相思 cronExpression配置說明 Flex轉義字串 openglglsl深度計算 iphone5處理螢幕解析度 Oracle日期比較 topic 科技 教育 python linux 社會 數碼 java c++ 遊戲 演算法 資料庫 健康 文化 mysql 汽車 娛樂 科學 財經 資料結構 C語言 職場 php C oracle c# 作業系統 工作 體育 sql 網路



請為這篇文章評分?