簡體   English   中英

openGL如何使用無符號的int頂點數據進行繪制

[英]openGL how to draw using unsigned int vertex data

我正在做一個簡單的openGL程序,該程序涉及在屏幕外渲染到深度紋理。 但是,我正在處理的深度超過浮子精度所能代表的深度。 結果,我需要使用unsigned int繪制點。 當我嘗試實現這一點時,我遇到了兩個問題。

1)每當我嘗試繪制使用unsigned int(屏幕坐標)進行繪制的VBO時,它都不在-1到1的范圍內,因此沒有一個繪制到屏幕上。 我能找到解決此問題的唯一方法是使用正交投影矩陣來調整它以繪制到屏幕坐標。
這種理解是正確的還是有更簡單的方法來做到這一點。
如果是正確的,您如何正確地實現我想要的功能。

2)其次,以這種方式繪制時,有任何方法可以保留初始值(繪制時不將其轉換為浮點數),因此當您再次讀取它們時,它們沒有什么不同,這是必要的,因為我的目標是創建一個深度緩沖區隨機深度最大為2 ^ 32的隨機點。 如果將其轉換為浮點數,則會失去精度,因此再次讀出的數據與輸入的數據不同。

這是對問題的錯誤解決方案。 為了回答您自己的問題, gl_Position是一個vec4 因此,OpenGL看到的深度是浮動的。 除了完全忽略深度緩沖區並在片段着色器中自己進行“深度測試”之外,您無法做任何更改。

該問題的首選解決方案是使用浮點深度緩沖區。 使用GL_DEPTH_COMPONENT_32F或類似的東西。 但是,僅由於OpenGL如何定義其坐標變換的不幸遺留問題,這還不夠。 可以看到,浮點數在[0,1]范圍內具有很高的精度,但其偏差接近於零。 但是由於OpenGL定義其轉換的方式, 這種精度會一直丟失 有效地,浮點數的指數部分永遠不會被使用。 它使32位浮點數看起來像24位定點值。

OpenGL已使用ARB_clip_control解決了該問題,該功能恢復了有效使用完整32位浮點數的功能。 如果可能,您應該嘗試使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM