BaseTexture.readPixels() support for 3D Textures

Is your feature request related to a problem? Please describe.

I noticed that when I call Texture.readPixels() on a 3D texture, it only returns a buffer containing top 2D slice of pixel data. In the linked example, I create a 2x2x2 3D texture a fill it iteratively with data. I then log the data array and see the expected 2 x 2 x 2 x 4 = 32 data points. After the data is fed to a RawTexture3D, I read the textures pixels but only see the first 16 data points.

According to @Evgeni_Popov, reading anything other than the top layer of a 3D texture is not supported.

Describe the solution you’d like

I need some way of accessing all the pixel data in a 3D texture. This could be achieved by either updating the current BaseTexture.readPixels() method to return all (or specified) layers of the 3D texture or creating a new RawTexture3D.readPixels3D() method on Rawtexture3D. I would lean toward updating BaseTexture.readPixels() or even creating a new method on BaseTexture that could bring 2D, 2DArray, and 3D textures to parity. Below is an example of such a method.

readPixelData(faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean, x?: number, y?: number, z?: number, width?: number, height?: number, depth?: number): Nullable<Promise<ArrayBufferView>>

https://doc.babylonjs.com/typedoc/classes/BABYLON.BaseTexture#readPixels

Discussion

*Ported From GitHub

2 Likes