- Home /
Issue With Simultaneous ReadPixels Calls
Hi, first time asking, really couldn't find the answer I was looking for.
I have these entities called "torches" that receive a portion of the a camera's view port via ReadPixles, and uses it as it's texture.
It works, but I get into problems when I have multiple torches calling for a Screen Grab in the same frame. I have tried using co-routines, but when I do, I don't get a texture. I am probably doing it wrong.
If multiple calls are done in the same frame, the first call receives the texture, while the others get the default purple one.
How can I edit my code to make it readpixels multiple times in the same frame without having to attach a camera to each torch?
Attach is picture (I hope)
Thanks,
Ed
Code in Screen Grabber
using UnityEngine;
using System.Collections;
public class ScreenGrabber : MonoBehaviour {
private bool grab;
private Renderer display;
private Texture2D tex;
private int pixelDiam;
private int pixelX;
private int pixelY;
//Takes a picture of where it is, and then applies it to the object
//due to screen dimensions and game dimensions being different, it has to calcualte what resolution it needs to be
void OnPostRender() {
if (grab) {
tex = new Texture2D(pixelDiam, pixelDiam);
tex.ReadPixels(new Rect(pixelX,pixelY,pixelDiam,pixelDiam),0,0);
tex.Apply();
display.material.mainTexture = tex;
grab = false;
}
}
public void setGrab(Renderer rend, int size, Transform target)
{
//Finding the co ords on screen that are 0,0 for the texture;
pixelX = (int)camera.WorldToScreenPoint (target.position + new Vector3 (size, 0, 0)).x;
pixelY = (int)camera.WorldToScreenPoint (target.position - new Vector3 (0, size, 0)).y;
//Finding the diametre in pixels of the cirlce, by getting the sccreen pos of either side of the cirlces centre
pixelDiam = ((int)camera.WorldToScreenPoint(target.position - new Vector3 (size,0,0)).x - pixelX);
display = rend;
grab = true;
}
}
Code that calls it
//getting the texture that will be applyed to it
GameObject camera = GameObject.FindGameObjectWithTag ("MainCamera");
camera.GetComponent<ScreenGrabber>().setGrab(renderer, (int)maxSize, transform);
Your answer
Follow this Question
Related Questions
Can a Texture2D be created at runtime from a snapshot of a RenderTexture? 3 Answers
Render a list of objects into a Texture2D array 0 Answers
Why is ReadPixels on my RenderTexture creating a pure gray texture? 1 Answer
Render Texture does not work on only IOS devices 0 Answers
yield return waitforseconds not waiting? 3 Answers