์ง€๊ธˆ 2์ผ๋™์•ˆ ์ด๊ฒƒ๋งŒ ๋ถ™์žก๊ณ ์žˆ์—ˆ์Œ..


ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ ์ ์šฉ๋œ๊ฑฐ (๊ฒŒ์ž„๋ทฐ ์นด๋ฉ”๋ผ)


ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ ์ ์šฉ ์•ˆ๋œ๊ฒƒ (์Šคํฌ๋ฆฐ ์บก์ณํ›„ ๋งŒ๋“ค์–ด์ง„ Texture2D)




๋‚ด๊ฐ€ ์•Œ๊ธฐ๋กœ๋Š” ๋ Œ๋”๋ง ์ˆœ์„œ์—์„œย 


์นด๋ฉ”๋ผ ๋ Œ๋”๋ง -> ์”ฌ ๋ Œ๋”๋ง -> ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ ์ ์šฉ ์ธ๊ฑธ๋กœ ์•Œ๊ณ ์žˆ๋Š”๋ฐ


https://docs.unity3d.com/kr/2022.1/Manual/ExecutionOrder.html

์ด๋ฒคํŠธ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ˆœ์„œ - Unity ๋งค๋‰ด์–ผUnity ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‚ฌ์ „์— ์ง€์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ์‹คํ–‰ ์‹œํ€€์Šค์— ์–ด๋–ป๊ฒŒ ํฌํ•จ๋˜๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.docs.unity3d.com


์ฝ”๋ฃจํ‹ด์œผ๋กœย WaitForEndOfFrame ๋งˆ์ง€๋ง‰ ํ”„๋ ˆ์ž„ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค๋„ ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ์ด ์ ์šฉ๋˜์„œ ์Šคํฌ๋ฆฐ ์บก์ณ๊ฐ€ ์•ˆ๋จ..


๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์€ URP๋ฅผ ์‚ฌ์šฉํ•ด์„œย OnRenderImageย ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์—†์—ˆ์–ด


๊ทธ๋ฆฌ๊ณ ย RenderPipelineManager.endCameraRenderingย  ,ย endFrameRendering


์ด๊ฑฐ ์ฝœ๋ฐฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋„ ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋œ๋”๋ผ;; ์ง„์งœ ๋ฏธ์ณ๋ฒ„๋ฆฌ๊ฒ ์Œย ย 



๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์œผ๋กœ ์•ˆํ•ด๋ณธ๊ฑด

OnRenderImageย ๋Œ€์‹ ์— URP์—์„œ๋Š”ย ScriptableRenderPass ๋ฅผ ์‚ฌ์šฉํ•ด์„œย OnRenderImageย ย ๋ž‘ย ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ ํ˜น์‹œ ์•„๋Š”์‚ฌ๋žŒ ์žˆ์Œ ๋‹ต๋ณ€์ข€..ย ย 



<์ง€๊ธˆ ์‚ฌ์šฉ์ค‘์ธ ์ฝ”๋“œ>


1. ๋ Œ๋” ํ…์Šค์ณ ์ƒ์„ฑ ๋ฐ ์นด๋ฉ”๋ผ ํƒ€๊ฒŸ ํ…์Šค์ณ์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋ Œ๋” ํ…์Šค์ณ ํ• ๋‹น

2. ์ฝ”๋ฃจํ‹ด - WaitForEndOfFrame์‹คํ–‰

private static IEnumerator RecordFrame(RectTransform rectTransform = null, RawImage rawImage = null)
{
TurnOffOtherCameras();

rt = RenderTexture.GetTemporary((int)rectTransform.rect.width, (int)rectTransform.rect.height, 24,

RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default, 1);

_camera.targetTexture = rt;

yield return new WaitForEndOfFrame();

CaptureScreenAndSave(rectTransform, rawImage);

TurnOnOtherCameras();
}


ํ•˜๋‹จ์€

CaptureScreenAndSaveย ๋‚ด๋ถ€ ์ฝ”๋“œ๋“ค์ž„ย 

3. ์นด๋ฉ”๋ผ ๋ Œ๋”

_camera.Render();
_camera.targetTexture = null;
RenderTexture.active = rt;



4. ํŒŒ์ผ ๊ฒฝ๋กœ์— ์ €์žฅํ•  Texture2D ์ƒ์„ฑ ํ›„ย ReadPixels() ๋ฐ Apply() ์‹คํ–‰

screenTex = new Texture2D(pixelWidth, pixelHeight, TextureFormat.RGBA32, false);

Rect area = new Rect(0f, 0f, pixelWidth, pixelHeight);

screenTex.ReadPixels(area, 0, 0);
screenTex.Apply();

File.WriteAllBytes(totalPath, screenTex.EncodeToPNG());



์œ ๋‹ˆํ‹ฐ์—”์ง„์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” ScreenCapture ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๊ฑธ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์žˆ์ง€๋งŒ,

https://forum.unity.com/threads/how-to-capture-screenshot-with-post-processing.701432/

ScreenCapture.CaptureScreenshotIntoRenderTexture();

์š”๋†ˆ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ผ๋‹จ ์ƒํ•˜ ๋ฐ˜์ „๋˜์„œ ์ฐํžˆ๊ธฐ๋„ ํ•˜๊ณ ย ์•„๋ฌด๋ฆฌ RenderTexture ๋ฅผ ํ•ด์ƒ๋„ ๋Œ€์‘ํ•ด์„œ ์ง„ํ–‰ํ•ด๋„ ์ฐŒ๊ทธ๋Ÿฌ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Œ.


ํ˜น์‹œ camera.Render() ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Graphics.Blit ์„ ์ ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ?

์•„๋‹ˆ๋ฉด camera.Render()๋ฅผ ํ•˜๋Š” ์‹œ์ ์ž์ฒด๊ฐ€ ํฌ์ŠคํŠธํ”„๋กœ์„ธ์‹ฑ ์ด์ „์‹œ์ ์ด๋ผ์„œ

์ฆ‰ ๋ Œ๋” ํ…์Šค์ณ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ํ”„๋ ˆ์ž„์— Texture2D๋กœ ์ €์žฅํ•˜๋Š”ย ์‹œ์ ์ด ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ ๋ณด๋‹ค ํ›จ์”ฌ ์ด์ „์ด๋ผ ์Šคํฌ๋ฆฐ์ƒท์— ํฌํ•จ์ด ์•ˆ๋˜๋Š”๊ฑธ๊นŒ.. ์ข€ ๋„์™€์ฃผ์ด์†Œ..