簡體   English   中英

將紋理數據寫入深度緩沖區

[英]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.

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