opengl glsl 深度計算 - w3c學習教程
文章推薦指數: 80 %
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
網路
延伸文章資訊
- 1How to access depth buffer values? - Or: gl_FragCoord.z vs ...
gl_FragCoord.z is the window-space depth value of the current fragment. It has nothing to do with...
- 2关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量。 gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w。其中,x和y是当前片元的窗口 ...
- 3What does (gl_FragCoord.z / gl_FragCoord.w) represent?
z / gl_FragCoord.w is not the camera-space (or world-space) distance to the camera. Nor is it the...
- 4opengl glsl 深度計算 - w3c學習教程
gl_fragcoord和gl_fragdepth分別是片元著色器的輸入和輸出變數。 gl_fragcoord是個vec4,四個分量分別對應x, y, z和1/w。其中,x和y ...
- 5LearnOpenGL - Depth Testing
The x and y components of gl_FragCoord represent the fragment's screen-space coordinates (with (0...