Three.js 中的深度分量 readRenderTargetPixels?
Depth component readRenderTargetPixels in Three.js?
是否可以从 THREE.WebGLRenderer
中提取深度像素数,类似于 .readRenderTargetPixels
功能?基本上,this question 有更新吗?我的起点是 Three.js r80。如果我也可以转换为距离,则归一化值就可以了。
相关方法:
我看到 WebGL 的 gl.readPixels
不像 OpenGL 的 .glReadPixels
那样支持 gl.DEPTH_COMPONENT
。
THREE.WebGLRenderTarget
通过 THREE.WebGLRenderer
的 WEBGL_depth_texture
扩展支持 .depthTexture
。尽管 THREE.DepthTexture
不像 THREE.DataTexture
那样包含 .image.data
。
我还看到 THREE.WebGLShadowMap
使用 .renderBufferDirect
和 THREE.MeshDepthMaterial
。
数据类型:
- A 非渲染 canvas,可以使用
.getContext('2d')
和 .getImageData(x,y,w,h).data
作为 topToBottom 像素作为 Uint8ClampedArray
。
- 对于呈现的 canvas,
render()
使用 getContext('webgl')
并且上下文只能查询一次,因此 getImageData
不能被使用。
- 改为渲染到 目标 并使用
.readRenderTargetPixels(...myArrToCopyInto...)
访问(复制)Uint8Array
中的 bottomToTop 像素。
- 任何 canvas 都可以在模式
"data:image/png;base64,theBase64PixelData"
. 中使用 .toDataURL("image/png")
到 return 一个 String
您不能使用readPixels 直接获取FrameBuffer 的深度附件的内容。无论是 RenderBuffer 还是 (Depth) Texture。
您必须在颜色附件中写入深度数据。
您可以使用 MeshDepthMaterial 渲染您的场景,就像阴影贴图技术一样。您最终得到了颜色附件中编码的深度 RGBA。您可以使用 readPixels(仍然是 RGBA 编码)获取它。这意味着您必须渲染场景两次,一次用于深度渲染,一次用于在屏幕上显示场景。
如果您想要的深度与您在屏幕上显示的深度相匹配(相同 camera/point 视图),您可以使用 WEBGL_depth_texture 渲染深度并在一个渲染循环中显示。如果您的场景包含很多 objects/materials.
,它会更快
最后,如果您的硬件支持 OES_texture_float,您应该能够将深度数据绘制到 LUMINANCE/FLOAT 纹理而不是 RGBA。这样就可以直接得到浮点深度数据,省去js中昂贵的解码过程
是否可以从 THREE.WebGLRenderer
中提取深度像素数,类似于 .readRenderTargetPixels
功能?基本上,this question 有更新吗?我的起点是 Three.js r80。如果我也可以转换为距离,则归一化值就可以了。
相关方法:
我看到 WebGL 的
gl.readPixels
不像 OpenGL 的.glReadPixels
那样支持gl.DEPTH_COMPONENT
。THREE.WebGLRenderTarget
通过THREE.WebGLRenderer
的WEBGL_depth_texture
扩展支持.depthTexture
。尽管THREE.DepthTexture
不像THREE.DataTexture
那样包含.image.data
。我还看到
THREE.WebGLShadowMap
使用.renderBufferDirect
和THREE.MeshDepthMaterial
。
数据类型:
- A 非渲染 canvas,可以使用
.getContext('2d')
和.getImageData(x,y,w,h).data
作为 topToBottom 像素作为Uint8ClampedArray
。 - 对于呈现的 canvas,
render()
使用getContext('webgl')
并且上下文只能查询一次,因此getImageData
不能被使用。 - 改为渲染到 目标 并使用
.readRenderTargetPixels(...myArrToCopyInto...)
访问(复制)Uint8Array
中的 bottomToTop 像素。 - 任何 canvas 都可以在模式
"data:image/png;base64,theBase64PixelData"
. 中使用
.toDataURL("image/png")
到 return 一个 String
您不能使用readPixels 直接获取FrameBuffer 的深度附件的内容。无论是 RenderBuffer 还是 (Depth) Texture。 您必须在颜色附件中写入深度数据。
您可以使用 MeshDepthMaterial 渲染您的场景,就像阴影贴图技术一样。您最终得到了颜色附件中编码的深度 RGBA。您可以使用 readPixels(仍然是 RGBA 编码)获取它。这意味着您必须渲染场景两次,一次用于深度渲染,一次用于在屏幕上显示场景。
如果您想要的深度与您在屏幕上显示的深度相匹配(相同 camera/point 视图),您可以使用 WEBGL_depth_texture 渲染深度并在一个渲染循环中显示。如果您的场景包含很多 objects/materials.
,它会更快
最后,如果您的硬件支持 OES_texture_float,您应该能够将深度数据绘制到 LUMINANCE/FLOAT 纹理而不是 RGBA。这样就可以直接得到浮点深度数据,省去js中昂贵的解码过程