Using SetPixel in Update()

I’ve been working on making a perlin procedural texture generator, and I have come to a strange dilema. I cannot seem to use the SetPixel function within the Update function. When using SetPixel in awake it works, but I need to be able to change my textures pixels in real time.

My awake function

function Awake(){
	colors = new Array(16384);
	texture = new Texture2D(128, 128);
    renderer.material.mainTexture = texture;

    // Fill the texture with Sierpinski's fractal pattern!
    for (var y : int = 0; y < texture.height; ++y) {
        for (var x : int = 0; x < texture.width; ++x) {
            setTex(x, y);
        }
    }
    // Apply all SetPixel calls
    texture.Apply();
	//setTex();
}

I fear even the optimizations proposed by @robertbu in the comments above might not help much. I think the performance hit is more likely to come from transferring the texture from main memory to the graphics card than from a pixel operation on the CPU, i.e. it’s the call to texture.Apply() that kills your frame rate. Unfortunately, the PCI bus is always going to be a lot slower than computing things on either the GPU or the CPU.

I’m sorry to say that the only way to efficiently make real-time changes to a texture is to render them to a RenderTexture on the graphics card itself, since this avoids the expensive transfer. This is a Unity Pro feature, so if you’re on the free version, you’re out of luck. Unless some wizard pops by who has a brilliant solution, in which case I will follow this post closely. :wink: