private void Bake(RenderTexture temporary, int width, int height, RenderTextureFormat format, int scale) { if (bakedPixels == null) { bakedPixels = new List <bool>(); } else { bakedPixels.Clear(); } baked = true; bakedMesh = mesh; bakedSize = new Vector2Int(width, height); if (cachedMaterial == null) { cachedMaterial = P3dShader.BuildMaterial("Hidden/Paint in 3D/White"); } cachedMaterial.SetVector(P3dShader._Channel, P3dHelper.IndexToVector((int)PaintableTexture.Coord)); // Write to temp RenderTexture var oldActive = RenderTexture.active; var renderTexture = temporary; if (temporary == null) { var desc = new RenderTextureDescriptor(width, height, format, 0); renderTexture = P3dHelper.GetRenderTexture(desc); } RenderTexture.active = renderTexture; GL.Clear(true, true, Color.black); cachedMaterial.SetPass(0); Graphics.DrawMeshNow(mesh, Matrix4x4.identity, PaintableTexture.Slot.Index); RenderTexture.active = oldActive; // Get readable copy var readable = P3dHelper.GetReadableCopy(renderTexture); if (temporary == null) { P3dHelper.ReleaseRenderTexture(renderTexture); } // Run through pixels to count total and build binary mask bakedPixels.Capacity = width * height; total = 0; for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { if (readable.GetPixel(x, y).r > 0.5f) { bakedPixels.Add(true); total += scale; } else { bakedPixels.Add(false); } } } // Clean up P3dHelper.Destroy(readable); }