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.