[英]Writing texture data onto depth buffer
我正在嘗試實現下面描述的技術: 用深度合成圖像 。
我們的想法是使用現有紋理(從圖像加載)作為深度蒙版,基本上偽造3D。
我面臨的問題是在openglES中沒有glDrawPixels。 有沒有辦法在iPhone上完成同樣的事情?
深度緩沖區比您在OpenGL ES中想象的更加模糊; 不僅glDrawPixels缺席,而且gl_FragDepth已從GLSL中刪除。 因此,您無法編寫自定義片段着色器以將值假脫機到深度緩沖區,因為您可能會推送顏色。
最明顯的解決方案是將深度信息打包到紋理中,並使用自定義片段着色器,在它生成的片段和從您提供的紋理中查找的片段之間進行深度比較。 只有當生成的片段更近時才允許繼續。 普通深度緩沖區將捕獲其他遮擋情況 - 原則上 - 您可以使用幀緩沖對象來創建深度紋理,為您提供完整的GPU上往返,盡管它與您的直接相關問題。
缺點是繪圖將花費您額外的紋理單位和紋理使用整數組件。
編輯:為了保持示例簡單,假設您將所有深度信息打包到紋理的紅色通道中。 這會給你一個非常低精度的深度緩沖區,但為了保持清晰,你可以寫一個快速片段着色器,如:
void main()
{
// write a value to the depth map
gl_FragColor = vec4(gl_FragCoord.w, 0.0, 0.0, 1.0);
}
在紅色通道中存儲深度。 因此,您已經部分地重新創建了舊的深度紋理擴展 - 您將擁有一個更亮的紅色像素更近的圖像,更暗的紅色像素更遠。 我認為在您的問題中,您實際上是從磁盤加載此圖像。
然后在未來的片段着色器中使用紋理,您可以執行以下操作:
uniform sampler2D depthMap;
void main()
{
// read a value from the depth map
lowp vec3 colourFromDepthMap = texture2D(depthMap, gl_FragCoord.xy);
// discard the current fragment if it is less close than the stored value
if(colourFromDepthMap.r > gl_FragCoord.w) discard;
... set gl_FragColor appropriately otherwise ...
}
EDIT2:你可以看到從深部更聰明映射到一個RGBA值這里 。 要直接綁定到該文檔,iPad上或第三代iPhone上肯定不支持OES_depth_texture。 我沒有在其他地方進行過完整的測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.