커스텀 렌더 텍스처는 셰이더로 텍스처를 업데이트할 수 있도록 해주는 특별한 타입의 텍스처이며, Render Textures의 확장입니다. 커스텀 렌더 텍스처를 사용하면 부식물 같은 복잡한 시뮬레이션, 비 효과를 위한 물결 시뮬레이션, 액체가 튀는 모습 등을 구현할 수 있습니다.
커스텀 렌더 텍스처 기능은 다양한 업데이트 빈도, 부분, 멀티 패스 업데이트와 같은 복잡한 설정에 도움이 되는 스크립팅 및 셰이더 프레임워크를 제공합니다.
이 프레임워크를 사용하려면 커스텀 렌더 텍스처 에셋에 머티리얼을 할당해야 합니다. 커스텀 렌더 텍스처에는 호환되는 머티리얼이 필요합니다. 자세한 내용은 커스텀 렌더 텍스처용 셰이더 작성을 참조하십시오.
호환 가능 머티리얼을 커스텀 렌더 텍스처 에셋에 할당하려면 다음 단계를 따르십시오.
이 머티리얼은 해당 파라미터에 따라 텍스처의 콘텐츠를 업데이트합니다.
이 페이지는 다음에 관한 정보를 제공합니다.
다음 표에는 커스텀 렌더 텍스처 기능과 각 렌더 파이프라인 간의 호환성이 설명되어 있습니다.
기능 | 빌트인 렌더 파이프라인 | 유니버설 렌더 파이프라인(URP) | 고해상도 렌더 파이프라인(HDRP) | 커스텀 스크립터블 렌더 파이프라인(SRP) |
---|---|---|---|---|
커스텀 렌더 텍스처 | 지원(1) | 지원(1) | 지원(1) | 지원(1) |
참고:
커스텀 렌더 텍스처 인스펙터 창에는 렌더 텍스처 인스펙터와 동일한 프로퍼티가 다수 표시되며, 그중 일부 프로퍼티는 커스텀 렌더 텍스처 전용입니다.
프로퍼티: | 기능: |
---|---|
Dimension | 렌더 텍스처의 차원입니다. |
2D | 렌더 텍스처를 2차원으로 만듭니다. |
Cube | 렌더 텍스처를 큐브맵으로 만듭니다. |
3D | 렌더 텍스처를 3차원으로 만듭니다. |
Size | 렌더 텍스처의 크기(픽셀)입니다. |
Color Format | 렌더 텍스처의 포맷입니다. |
sRGB (Color Render Texture) | 활성화하면 렌더 텍스처가 sRGB 읽기/쓰기 변환(읽기 전용)을 사용합니다. |
Enable Mip Maps | 이 프로퍼티를 활성화하면 렌더 텍스처가 밉맵을 사용합니다. |
Auto generate Mip Maps | 이 프로퍼티를 활성화하면 밉맵이 자동으로 생성됩니다. |
Wrap Mode | 바둑판식으로 배열한 텍스처가 동작하는 방법을 정의합니다. |
Repeat | 텍스처가 바둑판식으로 반복 배열됩니다. |
Clamp | Unity가 텍스처의 모서리를 스트레치합니다. |
Filter Mode | Unity가 3D 변환을 통해 스트레치된 텍스처를 필터링하는 방식을 정의합니다. |
Point | 텍스처가 가까워지면 블럭 현상이 나타납니다. |
Bilinear | 텍스처가 가까워지면 흐릿해집니다. |
Trilinear | Bilinear와 유사하지만, 텍스처가 다른 밉 레벨 사이에서 흐릿해집니다. |
Aniso Level | 비스듬한 각도에서 텍스처를 볼 때 텍스처의 품질이 향상됩니다. 바닥이나 그라운드 텍스처에 적합합니다. |
이러한 프로퍼티는 커스텀 렌더 텍스처에서만 제공됩니다. 커스텀 텍스처 파라미터는 다음의 세 가지 카테고리로 분류됩니다.
프로퍼티: | 기능: |
---|---|
Material | Unity가 커스텀 렌더 텍스처를 업데이트하는 데 사용하는 머티리얼입니다. |
Shader Pass | Unity가 커스텀 렌더 텍스처를 업데이트하는 데 사용하는 셰이더 패스입니다. 드롭다운에는 머티리얼에서 사용할 수 있는 모든 패스가 표시됩니다. |
Initialization Mode | Unity가 텍스처를 초기화하는 속도입니다. |
OnLoad | Unity가 생성 시 텍스처를 한번 초기화합니다. |
Realtime | Unity가 프레임마다 텍스처를 초기화합니다. |
OnDemand | Unity가 필요에 따라 스크립트에서 텍스처를 초기화합니다. |
Source | Unity 텍스처가 텍스처를 초기화하는 방식입니다. |
Texture and Color | Unity가 컬러와 곱한 텍스처를 사용하여 텍스처를 초기화합니다. |
Initialization Color | Unity가 커스텀 렌더 텍스처를 초기화하는 데 사용하는 컬러를 정의합니다. 초기화 텍스처도 제공하는 경우 Unity는 컬러와 텍스처를 곱하여 커스텀 렌더 텍스처를 초기화합니다. |
Initialization Texture | Unity가 커스텀 렌더 텍스처를 초기화하는 데 사용하는 텍스처를 정의합니다. 초기화 컬러도 제공하는 경우 Unity는 컬러와 텍스처를 곱하여 커스텀 렌더 텍스처를 초기화합니다. |
Material | Unity가 머티리얼을 사용하여 텍스처를 초기화합니다. |
Initialization Material | Unity가 커스텀 렌더 텍스처를 초기화하는 데 사용하는 머티리얼을 정의합니다. |
Update Mode | 셰이더가 커스텀 렌더 텍스처를 업데이트하는 속도입니다. |
OnLoad | 셰이더가 생성 시 텍스처를 한 번 업데이트합니다. |
Realtime | 셰이더가 프레임마다 텍스처를 업데이트합니다. |
OnDemand | 셰이더가 필요에 따라 스크립트에서 텍스처를 업데이트합니다. |
Period | Unity가 실시간 텍스처를 업데이트하는 시간(초)입니다. 값을 0.0으로 설정하면 프레임마다 업데이트를 수행합니다. 이 프로퍼티는 Update Mode 프로퍼티가 Realtime으로 설정된 경우에만 사용할 수 있습니다. |
Double Buffered | 텍스처를 이중 버퍼링합니다. 각 업데이트는 두 개의 버퍼를 스왑하여 사용자가 셰이더에서 이전 업데이트의 결과를 읽을 수 있도록 합니다. |
Wrap Update Zones | 활성화하면 부분 업데이트 영역이 텍스처 경계를 래핑할 수 있습니다. |
Cubemap Faces | (큐브맵 전용) 사용자가 각 큐브맵 면의 업데이트를 활성화/비활성화하도록 허용하는 일련의 토글입니다. |
Update Zone Space | Unity가 업데이트 영역을 정의하는 좌표 시스템입니다. |
Normalized | 모든 좌표와 크기는 0과 1사이이며 왼쪽 상단 코너는 (0, 0)에서 시작됩니다. |
Pixel | 모든 좌표와 크기는 텍스처의 너비와 높이로 제한된 픽셀로 표현됩니다. 왼쪽 상단 코너는 (0, 0)에서 시작됩니다. |
Update Zone List | 텍스처의 업데이트 영역 목록입니다. 자세한 내용은 업데이트 영역을 참조하십시오. |
Export 메뉴에서 커스텀 렌더 텍스처를 텍스처 포맷에 따라 PNG나 EXR 파일로 익스포트할 수 있습니다.
기본적으로 Unity는 커스텀 렌더 텍스처를 업데이트할 때 머티리얼을 사용하여 전체 텍스처를 한 번에 업데이트합니다. 커스텀 렌더 텍스처를 사용하면 부분 업데이트 영역을 정의할 수 있습니다. 이렇게 하면 원하는 영역 개수와 영역의 처리 순서를 정의할 수 있습니다.
업데이트 영역은 다양한 목적으로 사용할 수 있습니다. 예를 들어, 텍스처 위에 물방울이 튀는 여러 개의 작은 영역을 만들 수 있고, 그런 다음 잔물결을 시뮬레이션하기 위해 풀 패스를 수행할 수 있습니다. 또한 전체 텍스처를 업데이트할 필요가 없다는 것을 인지하고 있는 경우에도 최적화로서 이 업데이트 영역을 사용할 수 있습니다.
업데이트 영역에는 고유의 프로퍼티 세트가 있으며, Update Zone Space가 디스플레이에 표시됩니다. 좌표는 텍스처의 차원에 따라 다른데, 2D와 큐브 텍스처의 경우에는 2D이고 3D 텍스처의 경우에는 3D입니다.
프로퍼티: | 기능: |
---|---|
Center | 업데이트 영역의 중심 좌표입니다. |
Size | 업데이트 영역의 크기입니다. |
Rotation | 각도로 표시되는 업데이트 영역의 방향입니다(3D 텍스처에는 사용 불가). |
Shader Pass | 이 업데이트 영역에 사용할 셰이더 패스를 정의합니다. 이 프로퍼티를 기본값으로 유지하면 이 업데이트 영역은 인스펙터의 주요 부분에서 정의된 셰이더 패스를 사용하고, 그렇지 않은 경우에는 제공된 셰이더 패스를 사용합니다. |
Swap (Double Buffer) | (이중 버퍼핑 텍스처 전용) 이 프로퍼티를 활성화하면 Unity는 이 업데이트 영역을 처리하기 전에 버퍼를 스왑합니다. |
스크립팅 API에서 대부분의 커스텀 렌더 텍스처 기능에 액세스할 수 있습니다. 스크립트를 사용하여 머티리얼 파라미터를 변경하고, 빈도를 업데이트하고, 영역을 업데이트하고, 업데이트를 요청하는 등의 작업을 수행할 수도 있습니다.
Unity가 커스텀 렌더 텍스처를 업데이트하거나 초기화할 때 현재 프로퍼티를 사용하여 다음 프레임을 렌더링합니다. 이렇게 하면 이 텍스처를 사용하는 모든 머티리얼이 최신 결과를 얻을 수 있습니다. 예를 들어 다음 스크립트에서 Unity는 두 번째 업데이트 영역 배열을 사용하여 두 가지 업데이트를 수행합니다.
customRenderTexture.updateZones = updateZones1;
customRenderTexture.Update();
customRenderTexture.updateZones = updateZones2;
customRenderTexture.Update();
참고: Unity는 Update()
또는 Initialize()
를 호출하는 동시에 커스텀 렌더 텍스처를 업데이트하거나 초기화하지 않습니다. 이는 Unity가 항상 다음 프레임이 시작될 때 커스텀 렌더 텍스처를 업데이트하고 초기화하기 때문입니다.
커스텀 렌더 텍스처를 이중 버퍼링할 수 있습니다. 이렇게 하려면 Custom Render Textures 컴포넌트에서 Double Buffered를 활성화하거나, CustomRenderTexture.doubleBuffered
를 사용하십시오.
이중 버퍼링은 하나의 커스텀 렌더 텍스처 안에 Unity가 각각 업데이트 후 스왑할 수 있는 두 개의 텍스처가 있음을 의미합니다. 이를 통해 커스텀 렌더 텍스처에 새로운 결과를 작성하는 동안 마지막 업데이트의 결과를 읽을 수 있습니다.
이중 버퍼링은 셰이더가 Unity가 텍스처에 이미 작성한 콘텐츠를 사용해야 하지만 클래식 블렌딩 모드로 값을 혼합할 수 없는 경우 특히 유용합니다. 또한 셰이더가 이전 결과와 다른 픽셀을 샘플링해야 하는 경우에도 필요합니다.
성능 경고: 현재 이중 버퍼링은 스왑 빈도와 텍스처 해상도에 따라 성능 저하를 초래할 수 있는 각 스왑에서의 텍스처 복사를 수반합니다.
커스텀 렌더 텍스처를 함께 체이닝할 수 있습니다. 이렇게 하려면 한 커스텀 렌더 텍스처를 다른 커스텀 렌더 텍스처의 Material 또는 Initialization Mode > Texture에 할당된 머티리얼의 입력으로 사용하십시오.
체이닝된 커스텀 렌더 텍스처를 사용하면 여러 단계의 시뮬레이션을 생성할 수 있습니다.
체이닝된 커스텀 렌더 텍스처는 서로 종속됩니다. Unity는 각 업데이트가 올바른 순서로 진행되도록 이러한 종속성을 자동으로 계산합니다. 이 작업은 Custom Render Textures 인스펙터 창의 Material 및 Initialization Mode > Texture 프로퍼티에 할당된 머티리얼을 확인하여 수행할 수 있습니다.
커스텀 렌더 텍스처를 수동으로 업데이트하기 위해 특수한 커스텀 렌더 텍스처 셰이더를 작성할 수 있습니다.
커스텀 렌더 텍스처 셰이더를 작성하는 데 도움이 되도록 유틸리티 함수와 빌트인 도우미 변수가 포함된 두 가지 예시 프레임워크를 제공합니다.
다음 셰이더 예시는 컬러를 곱한 컬러로 텍스처를 채웁니다. 커스텀 렌더 텍스처용 셰이더를 작성할 때는 다음을 수행해야 합니다.
#include "UnityCustomRenderTexture.cginc"
.CustomRenderTextureVertexShader
사용v2f_customrendertexture
사용Shader "CustomRenderTexture/Simple"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_Tex("InputTex", 2D) = "white" {}
}
SubShader
{
Lighting Off
Blend One Zero
Pass
{
CGPROGRAM
#include "UnityCustomRenderTexture.cginc"
#pragma vertex CustomRenderTextureVertexShader
#pragma fragment frag
#pragma target 3.0
float4 _Color;
sampler2D _Tex;
float4 frag(v2f_customrendertexture IN) : COLOR
{
return _Color * tex2D(_Tex, IN.localTexcoord.xy);
}
ENDCG
}
}
}
다음 예시는 커스텀 렌더 텍스처를 초기화하는 데 사용할 수 있는 머티리얼의 셰이더입니다. 초기화 머티리얼용 셰이더를 작성할 때는 다음을 수행해야 합니다.
#include "UnityCustomRenderTexture.cginc"
CustomRenderTextureVertexShader
v2f_customrendertexture
사용Shader "CustomRenderTexture/CustomTextureInit"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_Tex("InputTex", 2D) = "white" {}
}
SubShader
{
Lighting Off
Blend One Zero
Pass
{
CGPROGRAM
#include "UnityCustomRenderTexture.cginc"
#pragma vertex InitCustomRenderTextureVertexShader
#pragma fragment frag
#pragma target 3.0
float4 _Color;
sampler2D _Tex;
float4 frag(v2f_init_customrendertexture IN) : COLOR
{
return _Color * tex2D(_Tex, IN.texcoord.xy);
}
ENDCG
}
}
}
#include "UnityCustomRenderTexture.cginc"
는 빌트인 값 세트에 대한 액세스를 제공합니다. 여기에는 전역 값, v2f_customrendertexture
구조의 값, v2f_init_customrendertexture
구조의 값이 포함됩니다.
v2f_customrendertexture
구조는 다음 입력을 허용합니다.
이름 | 타입 | 값 |
---|---|---|
localTexcoord |
float3 |
현재 처리 중인 업데이트 영역에 대한 상대적인 텍스처 좌표입니다. |
globalTexcoord |
float3 |
커스텀 렌더 텍스처 자체에 대한 상대적인 텍스처 좌표입니다. |
primitiveID |
uint |
현재 처리 중인 업데이트 영역의 인덱스입니다. |
direction |
float3 |
큐브 커스텀 렌더 텍스처의 경우, 큐브맵 내부의 현재 픽셀 방향입니다. |
v2f_init_customrendertexture
구조는 다음 입력을 허용합니다.
이름 | 타입 | 값 |
---|---|---|
texcoord |
float3 | 커스텀 렌더 텍스처 자체에 대한 상대적인 텍스처 좌표입니다. |
다음 구조는 전역 값입니다.
이름 | 타입 | 값 |
---|---|---|
_CustomRenderTextureWidth |
float |
커스텀 텍스처의 너비(단위: 픽셀) |
_CustomRenderTextureHeight |
float |
커스텀 텍스처의 높이(단위: 픽셀) |
_CustomRenderTextureDepth |
float |
커스텀 텍스처의 뎁스(단위: 픽셀)(3D 텍스처일 경우에만 해당하며 그 밖의 경우는 1과 동일함) |
_CustomRenderTextureCubeFace |
float |
Unity가 처리하는 현재 큐브맵 면의 인덱스입니다(-X, +X, -Y, +Y, -Z, +Z). 큐브맵에만 적용됩니다. |
_CustomRenderTexture3DSlice |
float |
처리 중인 현재 3D 슬라이스의 인덱스입니다. 3D 텍스처에만 적용됩니다. |
_SelfTexture2D |
Sampler2D |
이중 버퍼링된 텍스처인 경우: 마지막 스왑 이전의 마지막 업데이트 결과를 포함하는 텍스처 |
_SelfTextureCube |
SamplerCUBE |
이중 버퍼링된 텍스처인 경우: 마지막 스왑 이전의 마지막 업데이트 결과를 포함하는 텍스처 |
_SelfTexture3D |
Sampler3D |
이중 버퍼링된 텍스처인 경우: 마지막 스왑 이전의 마지막 업데이트 결과를 포함하는 텍스처 |