- Home /
Texture2D.EncodeToPng() saves gray PNG, all texture data missing
I pass a native texture pointer to a native plugin, where I do some writing to the texture.
I can draw the texture in my 3D environment on a mesh and inspect the proper data within the Unity Editor, it looks as expected.
However, when I call Texture2D.EncodeToPng(), it returns all gray (uninitialized) data.
The same call does not do this for my other textures.
I'm assuming it has something to do with the fact that I'm writing to the texture from native code, and the Texture2D.EncodeToPng() is maybe being run at a different part of the pipeline (before the texture is written to, or after it is cleared).
I've tried running the command after waiting for end of frame, OnPreRender(), OnRender(), OnPostRender() but nothing works!
Answer by SunnyChow · Aug 12, 2016 at 02:36 AM
You cannot get color information from a texture like that. the texture is stored in GPU side. and all SetPixels() EncodeToPng() is in CPU side.
But there is one thing you can do.
You can render the texture on a RenderTexture and then use Texture2D.ReadPixels() to read it to a Texture2D (this step is quite slow). Then you can do EncodeToPng().
Good to know, I thought that EncodeToPng() will copy from the GPU side. Is there any other way to copy this data from the GPU side? I'm surprised that you can't just do this on a regular Texture2D object.
If this is the case, then how come I'm able to get image data from EncodeToPng() call on a texture written to with the Graphics.Blit function? Am I to assume that every Graphics.Blit call is also copying shader output to the CPU memory??
Also, I know the EncodeToPng() is slow, this is just for taking screenshots every so often.
Hi SunnyChow, can you help us with the steps you mentioned? Actually we don't know how to render the texture into a RenderTexture, neither use ReadPixels to copy it into a new Texture2D.
Thanks in advance
Did you guys manage to get over this problem? I'd deeply appreciate an example of how to implement it.
Cheers!