일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 주식단테
- 2023 게이밍 인 구글 클라우드
- 작계훈련
- 1일차
- 리팩터링
- 이득우의 언리얼 프로그래밍 1
- 구글 컨퍼런스
- 이득우의 언리얼 프로그래밍1
- 산토리 하이볼
- 스즈메의 문단속
- 언리얼 5
- 224일선
- 2023 구글 클라우드
- unity
- 2023 게이밍
- GenAI
- URP
- JavaScript
- 스포일러 주의
- 448일선
- 주식
- 리팩터링 3장
- 112일선
- 리팩터링 4장
- 2023 Gaming
- 전주비빔 라이스 버거
- 상계9동
- 공부
- shader
- 언리얼5
- Today
- Total
개발 이야기 안하는 개발자
PIXELSHADER 본문
https://www.youtube.com/watch?v=kTZf1ePy86w
화면 픽셀화 하기
이번엔 URP Renderer Feature을 제작할 예정.
해당 기능은 URP asset 에 기능을 넣을때 들어가는 ScriptableObject 이다.
using System;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class CustomRenderPassFeature : ScriptableRendererFeature
{
class CustomRenderPass : ScriptableRenderPass
{
public RenderTargetIdentifier source;
private Material material;
private RenderTargetHandle tempRenderHandler;
public CustomRenderPass(Material material)
{
this.material = material;
tempRenderHandler.Init("_TemporaryColorTexture");
}
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer commandBuffer = CommandBufferPool.Get();
commandBuffer.GetTemporaryRT(tempRenderHandler.id, renderingData.cameraData.cameraTargetDescriptor);
Blit(commandBuffer, source, tempRenderHandler.Identifier(), material);
Blit(commandBuffer, tempRenderHandler.Identifier(), source);
context.ExecuteCommandBuffer(commandBuffer);
CommandBufferPool.Release(commandBuffer);
}
public override void FrameCleanup(CommandBuffer cmd)
{
}
}
[Serializable]
public class Settings
{
public Material material = null;
}
public Settings settings = new Settings();
CustomRenderPass m_ScriptablePass;
public override void Create()
{
m_ScriptablePass = new CustomRenderPass(settings.material);
m_ScriptablePass.renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
m_ScriptablePass.source = renderer.cameraColorTarget;
renderer.EnqueuePass(m_ScriptablePass);
}
}
외부에서 material을 가져와서
화면(RenderTexture)을 외부의 material과 합치고,
합친 결과물을 다시 화면으로 가져와서 비춰주는 스크립트이다.
해당 내용은 Execute안에 있는 Blit 메서드가 하는 일인데, Blit은 소스 텍스처를 타깃 텍스처에 복사하는 프로세스 이다.
Unlit URP Graph Shader 제작한다.
스크린에 나오는 상하 값을 Scaling으로 줄이고 , 축소하고 할 예정이다.
해당 Scaling은 float 으로, 0.2~0.01 사이의 값이다.
해당 값들은 Combine으로 하나로 합치고,
2벡터로 나오게 된다.
나온 값을 Screenpoision을 가져와서 해당 값만큼의 크기로 화면을 반복하게 만든다. 즉, 화면이 작아진 화면이 타일식으로 여러개가 있다.
Floor 는 같거자 작은 최대 정수값을 반환한다.
즉, 정수만 반환하게 된다.
반환된 정수값을 확대배율 만큼으로 나눈다.
들어올 Texture2D는 Main카메라가 비추는 화면이다.
참조값은 "_CameraOpaqueTexture"로 지정한다.
해당 참조값은 URP가 제공하는 카메라가 촬영하는 OpaqueTexture를 가져다 쓸수 있게 해주는 Reference이다.
해당 로직을 정리하면,
높은 해상도화면을 같은 해상도 크기에 같은 이미지를 여러개 배치한다.
그리고, 그중 하나의 화면을 다시 전체화면으로 바꾸는 로직이다.
즉, 높은해상도 화면을 작은 화면(낮은 해상도)으로 바꾸고, 화면을 키우는 방식이다.
제작된 Mat을 URP에 넣는다.
_CameraOpaqueTexture를 사용하기 때문에 Opaque Texture를 활성화 한다.
빼왔던 Scaling값을 수정해보면 화면에 모자이크가 들어가는 것을 볼 수 있다.
최종 결과물
'Unity > URP_Shader' 카테고리의 다른 글
SPACE TRAVEL_2 (0) | 2023.04.11 |
---|---|
SPACE TRAVEL_1 (0) | 2023.04.11 |
Galaxy Shader (0) | 2023.04.11 |
Liquid Effect (0) | 2023.04.11 |
ToxicWaterFall (0) | 2023.04.11 |