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!

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().