2017-03-07 58 views
2

我正在嘗試使用MeshDepthMaterial在three.js中實現一個簡單的GPU選取器。我已經成功使用下面的示例中提取顏色值: https://github.com/mrdoob/three.js/blob/master/examples/webgl_interactive_cubes_gpu.html在three.js中解壓縮RGBA深度值

而且通過移植unpackRGBAToDepth功能從這裏到JavaScript來重建深度:

https://github.com/mrdoob/three.js/blob/acdda10d5896aa10abdf33e971951dbf7bd8f074/src/renderers/shaders/ShaderChunk/packing.glsl

但價值出來的一個在0.0到255.0之間的浮點數(我期望它在0.0到1.0之間或實際深度)。我的問題如下:我怎樣才能使用這個值,它可以被翻譯成實際的深度?如果是這樣,怎麼樣?

+0

http://stackoverflow.com/questions/6652253/getting-the-true-z-value-from-the-深度緩衝和https://www.opengl.org/discussion_boards/showthread.php/171104-Convert-value-from-Z-buffer-to-Z-coordinate – gaitat

+0

我的實現是非常接近的stackoverflow答案,但我使用對數深度緩衝區,因此它略有不同。我創建了一個例子:http://jsfiddle.net/1x4Lk8w6/1/在那裏我試圖得到實際的深度,但它最終總是1,如果有鼠標下的東西。 – Avocher

+0

在更改相機的遠平面時檢查效果。 10000很大。 – gaitat

回答

0

自己在運行這個問題後(可能遵循從three.js中複製代碼的相同路徑),我可能會發現問題。

從JS中的RGBA-Texture讀取時,將以Uint8格式獲取顏色值,而GLSL中的紋理查找(我懷疑計算是從那裏複製的)返回rgba-float值。

所以你需要拆包之前1/255乘以顏色向量:

// ... 

renderer.readRenderTargetPixels(
    depthRenderTarget, x, y, 1, 1, pixelBuffer); 

vec4 
    .fromArray(pixelBuffer) 
    .multiplyScalar(1/255); 

var logz = vec4.dot(unPackFactors); 

// ...