- Home /
Question by
Hylus · Sep 10, 2019 at 01:49 PM ·
camerapost processingscreenshotpost-process-effectedge detection
Capture Screen with post effect
Hello. I search my problem but i don't find clear answer. I use Edge Detection and try to save result to render texture then save whole data to png file.
private void CreateScreenShoot()
{
if (DataStorageBase.errorExists == true)
{
return;
}
TakeScreenshot?.Invoke(false);
camera.targetTexture = renderTexture;
camera.Render();
// read pixels will read from the currently active render texture so make our offscreen
// render texture active and then read the pixels
RenderTexture.active = renderTexture;
screenShot.ReadPixels(rect, 0, 0);
// reset active camera texture and render texture
camera.targetTexture = null;
RenderTexture.active = null;
string filename = DataStorageBase.ChosenImage;
SaveTexture(filename,screenShot, format);
TakeScreenshot?.Invoke(true);
}
private static void SaveTexture(string filename, Texture2D screenShot, ImageFormat format)
{
// pull in our file header/data bytes for the specified image format (has to be done from main thread)
byte[] fileHeader = null;
byte[] fileData = null;
if (format == ImageFormat.RAW)
{
fileData = screenShot.GetRawTextureData();
}
else if (format == ImageFormat.PNG)
{
fileData = screenShot.EncodeToPNG();
}
else if (format == ImageFormat.JPG)
{
fileData = screenShot.EncodeToJPG();
}
else // ppm
{
// create a file header for ppm formatted file
string headerStr = string.Format("P6\n{0} {1}\n255\n", screenShot.width, screenShot.height);
fileHeader = System.Text.Encoding.ASCII.GetBytes(headerStr);
fileData = screenShot.GetRawTextureData();
}
int x =filename.LastIndexOf("\\");
string name = filename.Substring(x+1);
filename = Path.Combine(DataStorageBase.MiniatureDirectory, name.Replace("svg", "png"));//DataStorageBase.MiniaturesSavingExtension);
// create new thread to save the image to file (only operation that can be done in background)
new System.Threading.Thread(() =>
{
// create file and write optional header with image bytes
var f = System.IO.File.Create(filename);
if (fileHeader != null)
f.Write(fileHeader, 0, fileHeader.Length);
f.Write(fileData, 0, fileData.Length);
f.Close();
}).Start();
}
But the problem is that i dont know how to transmit image from post process effect to camera target texture. Can anyone solve this problem and give me some advices?
Comment
Your answer
Follow this Question
Related Questions
Post Processing stack - Volume effects have all the fields disabled. 1 Answer
HDRP Edge Detection FullScreen Custom Pass 0 Answers
Post Processing Layer does not have any effect 1 Answer
(Unity 2019.2) Post Processing errors with Deferred Rendering Path 1 Answer
How to change Focus Distance at run time? Using PostProcessing Depth of Field. 1 Answer