Version: 2020.2
렌더 텍스처
무비 텍스처

커스텀 렌더 텍스처

커스텀 렌더 텍스처는 셰이더로 텍스처를 업데이트할 수 있도록 해주는 특별한 타입의 텍스처이며, 렌더 텍스처의 확장입니다. 커스텀 렌더 텍스처를 사용하면 부식물 같은 복잡한 시뮬레이션, 비 효과를 위한 물결 시뮬레이션, 액체가 튀는 모습 등을 구현할 수 있습니다.

커스텀 렌더 텍스처는 다양한 업데이트 빈도, 부분 또는 멀티 패스 업데이트 등과 같은 복잡한 설정에 도움이 되는 스크립팅 및 셰이더 프레임워크를 제공합니다. 이 프레임워크를 사용하려면 커스텀 렌더 텍스처 에셋에 머티리얼을 할당해야 합니다.

  1. 새로운 커스텀 렌더 텍스처 에셋을 생성합니다.
  2. Material 프로퍼티의 인스펙터 창에서 머티리얼을 할당합니다.

이 머티리얼은 해당 파라미터에 따라 텍스처의 콘텐츠를 업데이트합니다. 다른 커스텀 렌더 텍스처에 할당된 머티리얼을 포함해서 모든 머티리얼을 커스텀 렌더 텍스처에 할당할 수 있습니다.

렌더 파이프라인 호환성

아래 표에는 커스텀 렌더 텍스처 기능과 각 렌더 파이프라인 간의 호환성이 설명되어 있습니다.

기능 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 스크립터블 렌더 파이프라인(SRP)
커스텀 렌더 텍스처 지원(1) 지원(1) 지원(1) 지원(1)

참고:

  1. 현재는 셰이더 그래프에서 커스텀 렌더 텍스처를 업데이트하고 초기화하는 머티리얼을 만들 수 없습니다. ShaderLab 코드를 작성하여 커스텀 렌더 텍스처에서 작동하는 Unity 셰이더만 만들 수 있습니다.

프로퍼티

커스텀 렌더 텍스처 인스펙터 창에는 렌더 텍스처 인스펙터와 동일한 프로퍼티가 다수 표시되며, 그중 일부 프로퍼티는 커스텀 렌더 텍스처 전용입니다.

렌더 텍스처(Render Texture):

프로퍼티: 기능:
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 텍스처의 에지를 늘립니다.
Filter Mode Unity가 3D 변환을 통해 스트레치된 텍스처를 필터링하는 방식을 정의합니다.
     Point 텍스처가 가까워지면 블럭 현상이 나타납니다.
     Bilinear 텍스처가 가까워지면 흐릿해집니다.
     Trilinear Bilinear와 유사하지만, 텍스처가 다른 밉 레벨 사이에서 흐릿해집니다.
Aniso Level 비스듬한 각도에서 텍스처를 볼 때 텍스처의 품질이 향상됩니다. 바닥이나 그라운드 텍스처에 적합합니다.

커스텀 텍스처(Custom Texture):

이러한 프로퍼티는 커스텀 렌더 텍스처에서만 제공됩니다. 커스텀 텍스처 파라미터는 다음의 세 가지 카테고리로 분류됩니다.

  • 머티리얼: 텍스처를 업데이트하는 데 어떤 셰이더가 사용되는지 정의합니다.

  • 초기화: 셰이더가 업데이트를 수행하기 전에 텍스처가 초기화되는 방식을 제어합니다.

  • 업데이트: 셰이더가 텍스처를 업데이트하는 방식을 제어합니다.

프로퍼티: 기능:
Material 커스텀 렌더 텍스처를 업데이트하는데 사용된 머티리얼
     Shader Pass 커스텀 렌더 텍스처를 업데이트하는데 사용된 셰이더 패스. 콤보 상자에는 머티리얼에서 사용할 수 있는 모든 패스가 표시됩니다.
Initialization Mode Unity가 텍스처를 초기화하는 속도입니다.
     OnLoad Unity가 생성 시 텍스처를 한번 초기화합니다.
     Realtime Unity가 프레임마다 텍스처를 초기화합니다.
     OnDemand Unity가 필요에 따라 스크립트에서 텍스처를 초기화합니다.
Source Unity 텍스처가 텍스처를 초기화하는 방식입니다.
     Texture and Color 컬러와 곱한 텍스처를 사용하여 텍스처를 초기화합니다.
         Initialization Color 커스텀 렌더 텍스처를 초기화하는 데 사용하는 컬러를 정의합니다. 초기화 텍스처도 제공하는 경우 컬러와 텍스처를 곱하여 커스텀 렌더 텍스처를 초기화합니다.
         Initialization Texture 커스텀 렌더 텍스처를 초기화하는 데 사용하는 텍스처를 정의합니다. 초기화 컬러도 제공하는 경우 컬러와 텍스처를 곱하여 커스텀 렌더 텍스처를 초기화합니다.
     Material 머티리얼을 사용하여 텍스처를 초기화합니다.
         Initialization Material 커스텀 렌더 텍스처를 초기화하는 데 사용하는 머티리얼을 정의합니다.
Update Mode 셰이더가 커스텀 렌더 텍스처를 업데이트하는 속도입니다.
     OnLoad 셰이더가 생성 시 텍스처를 한 번 업데이트합니다.
     Realtime 셰이더가 프레임마다 텍스처를 업데이트합니다.
     OnDemand 셰이더가 필요에 따라 스크립트에서 텍스처를 업데이트합니다.
Period Unity가 실시간 텍스처를 업데이트하는 시간(초)입니다. 값을 0.0으로 설정하면 프레임마다 업데이트를 수행합니다. 이 프로퍼티는 실시간으로만 사용할 수 있습니다.
Double Buffered 텍스처를 이중 버퍼링합니다. 각 업데이트는 두 개의 버퍼를 스왑하여 사용자가 셰이더에서 이전 업데이트의 결과를 읽을 수 있도록 합니다.
Wrap Update Zones 부분 업데이트 영역이 텍스처 경계를 래핑하도록 활성화합니다.
Cubemap Faces (큐브맵 전용) 사용자가 각 큐브맵 면의 업데이트를 활성화/비활성화하도록 허용하는 일련의 토글입니다.
Update Zone Space 업데이트 영역이 정의된 좌표 시스템입니다.
     Normalized 모든 좌표와 크기는 0과 1사이에 존재하며 왼쪽 상단 코너는 (0, 0)에서 시작됩니다.
     Pixel 모든 좌표와 크기는 텍스처의 너비와 높이로 제한된 픽셀로 표현됩니다. 왼쪽 상단 코너는 (0, 0)에서 시작됩니다.
Update Zone List 텍스처의 업데이트 영역 리스트(자세한 내용은 아래 참조)

커스텀 렌더 텍스처를 파일로 익스포트:

“Export” 컨텍스트 메뉴를 사용해 커스텀 렌더 텍스처를 텍스처 포맷에 따라 PNG 또는 EXR 파일로 익스포트할 수 있습니다.

업데이트 영역:

기본적으로 Unity는 커스텀 렌더 텍스처를 업데이트할 때 머티리얼을 사용하여 전체 텍스처를 한 번에 업데이트합니다. 커스텀 텍스처를 사용하면 부분 업데이트 영역을 정의할 수 있습니다. 이렇게 하면 원하는 영역 개수와 영역의 처리 순서를 정의할 수 있습니다.

업데이트 영역은 다양한 목적으로 사용할 수 있습니다. 예를 들어, 텍스처 위에 물방울이 튀는 여러 개의 작은 영역을 가질 수 있고, 그런 다음 잔물결을 시뮬레이션하기 위해 풀 패스를 수행할 수 있습니다. 또한 전체 텍스처를 업데이트할 필요가 없다는 것을 인지하고 있는 경우 최적화로서 이 업데이트 영역을 사용할 수 있습니다.

업데이트 영역에는 고유의 프로퍼티 집합이 있으며, 업데이트 영역 공간 이 디스플레이에 표시됩니다. 좌표는 텍스처의 차원 에 따라 다릅니다(2D 및 큐브 텍스처의 경우에는 2D, 3D 텍스처의 경우에는 3D).

프로퍼티: 기능:
Center 업데이트 영역 센터의 좌표입니다.
Size 업데이트 영역의 크기입니다.
Rotation 각도로 표시되는 업데이트 영역의 방향입니다(3D 텍스처에는 사용 불가).
Shader Pass 이 업데이트 영역에 사용할 셰이더 패스를 정의합니다. 이 프로퍼티를 기본값으로 유지하면 이 업데이트 영역은 인스펙터의 주요 부분에서 정의된 셰이더 패스를 사용하고, 그렇지 않은 경우에는 제공된 셰이더 패스를 사용합니다.
Swap(Double Buffer) (이중 버퍼핑 텍스처 전용) Swap을 활성화하면 Unity는 이 업데이트 영역을 처리하기 전에 버퍼를 스왑합니다.

이중 버퍼링된 커스텀 텍스처(Double Buffered Custom Texture)

커스텀 렌더 텍스처를 이중 버퍼링할 수 있습니다. 이중 버퍼링은 하나의 커스텀 렌더 텍스처 안에 Unity가 각 업데이트 후 스왑할 수 있는 두 개의 텍스처가 있음을 의미합니다. 이를 통해 커스텀 렌더 텍스처에 새로운 결과를 작성하는 동안 마지막 업데이트의 결과를 읽을 수 있습니다. 이중 버퍼링은 셰이더가 Unity가 텍스처에 이미 작성한 콘텐츠를 사용해야 하지만 클래식 블렌드 모드로 값을 혼합할 수 없는 경우 특히 유용합니다. 또한 셰이더가 이전 결과와 다른 픽셀을 샘플링해야 하는 경우에도 필요합니다.

성능 경고: 현재 이중 버퍼링은 스왑 빈도와 텍스처 해상도에 따라 성능 저하를 초래할 수 있는 각 스왑에서의 텍스처 복사를 수반합니다.

커스텀 렌더 텍스처(Custom Render Texture) 체이닝

Custom Render Textures require a Material to be updated. This Material can have textures as an input. This means that you can use a Custom Render Texture as an input to generate another one. This way, you can chain up several Custom Textures to generate a more complex multi-step simulation. The system will correctly handle all the dependencies so that the different updates happen in the right order.

커스텀 렌더 텍스처(Custom Render Texture)의 셰이더 작성

커스텀 텍스처를 업데이트하는 것은 렌더 텍스처에서 2D 포스트 프로세스를 수행하는 것과 같습니다. 사용자가 커스텀 텍스처 셰이더를 작성하도록 지원하기 위해, Unity는 유틸리티 함수와 빌트인 헬퍼 변수가 있는 작은 프레임워크를 제공합니다.

다음은 컬러를 곱한 컬러로 텍스처를 채우는 셰이더 예제입니다.

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”

  • 제공되는 버텍스 셰이더 InitCustomRenderTextureVertexShader 사용

  • 픽셀 셰이더에 대해 제공된 입력 구조 v2f_init_customrendertexture 사용

This example shader includes a set of built-in values. This includes Global values, values from the v2f_customrendertexture structure and values from the v2f_init_customrendertexture structure.

v2f_customrendertexture 구조의 입력 값은 다음과 같습니다.

이름 Type
localTexcoord float3 현재 처리 중인 업데이트 영역에 대한 상대적인 텍스처 좌표입니다.
globalTexcoord float3 커스텀 렌더 텍스처 자체에 대한 상대적인 텍스처 좌표입니다.
primitiveID uint 현재 처리 중인 업데이트 영역의 인덱스입니다.
direction float3 큐브 커스텀 렌더 텍스처의 경우, 큐브맵 내부의 현재 픽셀 방향입니다.

v2f_init_customrendertexture 구조의 입력 값은 다음과 같습니다.

이름 Type
texcoord float3 커스텀 렌더 텍스처 자체에 대한 상대적인 텍스처 좌표입니다.

전역 값:

이름 Type
_CustomRenderTextureWidth float 커스텀 텍스처의 너비(단위: 픽셀)
_CustomRenderTextureHeight float 커스텀 텍스처의 높이(단위: 픽셀)
_CustomRenderTextureDepth float 커스텀 텍스처의 뎁스(단위: 픽셀)(3D 텍스처일 경우에만 해당하며 그 밖의 경우는 1과 동일함)
_CustomRenderTextureCubeFace float 큐브맵인 경우에만: 처리 중인 현재 큐브맵 면의 인덱스(-X, +X, -Y, +Y, -Z, +Z)
_CustomRenderTexture3DSlice float 3D 텍스처인 경우만: 처리 중인 현재 3D 슬라이스의 인덱스
_SelfTexture2D Sampler2D 이중 버퍼링된 텍스처인 경우: 마지막 스왑 이전의 마지막 업데이트 결과를 포함하는 텍스처
_SelfTextureCube SamplerCUBE 이중 버퍼링된 텍스처인 경우: 마지막 스왑 이전의 마지막 업데이트 결과를 포함하는 텍스처
_SelfTexture3D Sampler3D 이중 버퍼링된 텍스처인 경우: 마지막 스왑 이전의 마지막 업데이트 결과를 포함하는 텍스처

스크립트에서 커스텀 렌더 텍스처(Custom Render Texture) 제어

여기에 설명된 대부분의 기능은 스크립팅 API를 통해 액세스할 수 있습니다. 머티리얼 파라미터, 업데이트 빈도, 업데이트 영역 변경 또는 업데이트 요청은 스크립트를 통해 수행할 수 있습니다.

Any update requested for the Custom Texture will happen at a very specific time at the beginning of the frame with the current state of the Custom Texture. This guarantees that any Material using this texture will have the up-to-date result.

이는 다음과 같은 타입의 패턴을 의미합니다.

customRenderTexture.updateZones = updateZones1;
customRenderTexture.Update();
customRenderTexture.updateZones = updateZones2;
customRenderTexture.Update();

업데이트 영역의 첫 번째 배열에 대한 첫 업데이트 수행 후 다른 배열에 대한 두 번째 업데이트를 수행하는 “예상된” 결과를 생성하지 않습니다. 이는 두 번째 배열에 대한 두 가지 업데이트를 수행합니다.

근본적으로, 변경된 프로퍼티만 다음 프레임에서 액티브됩니다.


  • 2017–05–18 페이지 게시됨

  • Unity 2017.1의 새로운 기능NewIn20171

렌더 텍스처
무비 텍스처
Copyright © 2020 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961