2017-04-22 87 views
0

在OpenGL中,深度緩衝區值基於場景的近端和遠端剪切平面進行計算。 (參考:Getting the true z value from the depth bufferWebGL如何在深度緩衝區中設置值?

這是如何在WebGL中工作?我的理解是,WebGL不知道我的場景中的遠近裁剪平面。近剪裁平面和遠剪裁平面用於計算我的投影矩陣,但我從不告訴WebGL它們是什麼,因此它不能使用它們來計算深度緩衝區值。

WebGL在渲染場景時如何在深度緩衝區中設置值?

回答

3

WebGL的(像現代的OpenGL和OpenGL ES)會從你提供給gl_Position.z在你的頂點着色器值的深度值(雖然你也可以使用特定擴展名直接寫深度緩衝區但是這很不常見)

WebGL中沒有場景也沒有現代OpenGL。這個場景的概念是從90年代初期遺留下來的遺留OpenGL的一部分,並且早已棄用。它不存在於OpenGL ES(在Android,iOS,ChromeOS,Raspberry PI,WebGL等上運行的OpenGL ...)。

現代OpenGL和WebGL只是光柵化API。您可以編寫在GPU上運行的小函數着色器。您可以通過屬性(每個迭代數據),統一(全局變量),紋理(2d/3d數組),變化(從頂點着色器傳遞給片段着色器的數據)爲這些着色器提供數據。

其餘的由您決定,您提供的着色器功能是做什麼的。現代OpenGL和WebGL只是針對所有意圖和目的,只是具有一定限制的通用計算引擎。讓他們做任何事情都取決於你提供着色器。

查看webglfundamentals.org瞭解更多信息。

在Q &您鏈接到它是程序員提供的着色器,決定使用平截球數學來決定如何設置gl_Position.z。截錐數學由程序員提供。 WebGL/GL並不關心如何計算gl_Position.z,只是它的值介於-1.0和+1.0之間,所以如何從深度緩衝區獲取一個值並返回到Z僅取決於程序員如何決定如何計算它第一個地方。

This article涵蓋了使用WebGL/OpenGL渲染3d時設置gl_Position.z最常用的數學方法。根據你的問題,儘管我建議你閱讀前一篇文章的開頭部分。

至於什麼實際值被寫入到深度緩衝是

ndcZ = gl_Position.z/gl_Position.w; 
depthValue = (far - near)/2 * ndcZ + (near - far)/2 

nearfar默認爲0和1分別儘管你可以用gl.depthRange設置他們,但假設他們是0和1,那麼

ndcZ = gl_Position.z/gl_Position.w; 
depthValue = .5 * ndcZ - .5 

那depthValue然後將在0到1範圍內並轉換爲深度緩衝區的任何位深度。通常有一個24位深度緩衝區,所以

bitValue = depthValue * (2^24 - 1)