블렌딩은 투명 오브젝트를 만드는 데 사용됩니다.
그래픽스를 렌더링할 때는 모든 셰이더가 실행되고, 모든 텍스처가 적용된 후 픽셀이 화면에 작성됩니다. 이런 픽셀이 기존 픽셀에 결합되는 방법은 Blend 커맨드로 제어합니다.
Blend Off
: 블렌딩을 끕니다(기본값).
Blend SrcFactor DstFactor
: 블렌딩을 설정하고 활성화합니다. 생성된 컬러는 SrcFactor로 곱합니다. 화면의 기존 컬러를 DstFactor로 곱한 후 둘을 더합니다.
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
: 위와 동일하지만 알파 채널 블렌딩에 다른 팩터를 사용합니다.
BlendOp BlendOp
: 블렌드된 컬러를 모두 더하지 않고 컬러에 대해 다른 연산을 대신 수행합니다.
BlendOp OpColor, OpAlpha
: 위와 동일하지만 컬러(RGB) 및 알파(A)채널에 다른 블렌드 연산을 사용합니다.
또한, upper-rendertarget 블렌딩 모드도 설정할 수 있습니다.
다중 렌더링 타겟(MRT) 렌더링을 사용하는 경우 위의 일반 구문은
모든 렌더링 타겟에 대해 동일한 블렌딩 모드를 설정합니다. 다음 구문은 개별 렌더링 타겟에 대해 각기 다른 블렌딩 모드를 설정할 수 있습니다. 구문에서 N
은 렌더링 타겟 인덱스(0–7)입니다. 이 기능은 대부분의 최신 API/GPU(DX11/12, GLCore, Metal, PS4)에서 작동합니다.
Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha
AlphaToMask On
: 알파 투 커버리지를 켭니다. MSAA를 사용하는 경우 알파 투 커버리지는 멀티샘플 커버리지 마스크를 픽셀 셰이더 결과 알파 값과 비례하여 수정합니다. 일반적으로 일반 알파 테스트보다 덜 앨리어싱된 아웃라인에 사용되고 초목 및 기타 알파 테스트된 셰이더에 유용합니다.
다음 블렌드(Blend) 연산을 사용할 수 있습니다.
Add | 소스와 대상을 더합니다. |
Sub | 소스에서 대상을 뺍니다. |
RevSub | 대상에서 소스를 뺍니다. |
Min | 소스와 대상 중 더 작은 것을 사용합니다. |
Max | 소스와 대상 중 더 큰 것을 사용합니다. |
LogicalClear | 논리 연산: Clear (0) DX11.1에만 해당 |
LogicalSet | 논리 연산: Set (1) DX11.1에만 해당 |
LogicalCopy | 논리 연산: Copy (s) DX11.1에만 해당 |
LogicalCopyInverted | 논리 연산: Copy inverted (!s) DX11.1에만 해당 |
LogicalNoop | 논리 연산: Noop (d) DX11.1에만 해당 |
LogicalInvert | 논리 연산: Invert (!d) DX11.1에만 해당 |
LogicalAnd | 논리 연산: And (s & d) DX11.1에만 해당 |
LogicalNand | 논리 연산: Nand !(s & d) DX11.1에만 해당 |
LogicalOr | Logical operation: Or (s | d) DX11.1 only. |
LogicalNor | Logical operation: Nor !(s | d) DX11.1 only. |
LogicalXor | 논리 연산: Xor (s ^ d) DX11.1에만 해당 |
LogicalEquiv | 논리 연산: Equivalence !(s ^ d) DX11.1에만 해당 |
LogicalAndReverse | 논리 연산: Reverse And (s & !d) DX11.1에만 해당 |
LogicalAndInverted | 논리 연산: Inverted And (!s & d) DX11.1에만 해당 |
LogicalOrReverse | Logical operation: Reverse Or (s | !d) DX11.1 only. |
LogicalOrInverted | Logical operation: Inverted Or (!s | d) DX11.1 only. |
다음 프로퍼티는 모두 Blend 커맨드에서 SrcFactor와 DstFactor에 대해 유효합니다. Source는 계산된 컬러를 말하고 Destination은 이미 화면에 표시된 컬러입니다. 블렌드 인자는 BlendOp에서 논리 연산을 사용하는 경우 무시됩니다.
One | 1값입니다. 소스 또는 대상 컬러가 완전히 표시되도록 하려면 이 값을 사용합니다. |
Zero | 0값입니다. 소스 또는 대상 값을 제거하려면 이 값을 사용합니다. |
SrcColor | 스테이지 값을 소스 컬러 값으로 곱합니다. |
SrcAlpha | 스테이지 값을 소스 알파 값으로 곱합니다. |
DstColor | 스테이지 값을 프레임 버퍼 소스 컬러 값으로 곱합니다. |
DstAlpha | 스테이지 값을 프레임 버퍼 소스 알파 값으로 곱합니다. |
OneMinusSrcColor | 스테이지 값을 (1 - 소스 컬러)로 곱합니다. |
OneMinusSrcAlpha | 스테이지 값을 (1 - 소스 알파)로 곱합니다. |
OneMinusDstColor | 스테이지 값을 (1 - 대상 컬러)로 곱합니다. |
OneMinusDstAlpha | 스테이지 값을 (1 - 대상 알파)로 곱합니다. |
다음은 가장 일반적인 블렌드 타입입니다.
Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency
Blend One OneMinusSrcAlpha // Premultiplied transparency
Blend One One // Additive
Blend OneMinusDstColor One // Soft Additive
Blend DstColor Zero // Multiplicative
Blend DstColor SrcColor // 2x Multiplicative
투명도가 텍스처의 알파 채널에 따라 정의되는 완전히 불투명하거나 완전히 투명한 오브젝트(예: 나뭇잎, 잔디, 체인 펜스 등)를 그리는 데는 일반적으로 다음과 같은 몇 가지 방법이 사용됩니다.
종종 오브젝트가 “반투명”으로 간주되어야 하므로 일부 렌더링 기능을 사용할 수 없습니다(예: 디퍼드 셰이딩, 섀도우를 리시브할 수 없음). 오목하거나 오버랩된 알파 블렌드된 오브젝트에도 종종 드로우 순서 문제가 있습니다.
알파 블렌드 셰이더는 종종 투명 렌더 대기열도 설정하고 뎁스 쓰기를 끕니다. 따라서 셰이더 코드는 다음과 같습니다.
// inside SubShader
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
// inside Pass
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
픽셀 셰이더에서 clip()
HLSL 명령을 사용하여 픽셀을 “폐기”하거나 픽셀이 조건에 기반하지 않도록 할 수 있습니다. 따라서 오브젝트가 계속 완전히 불투명하고 오브젝트에 드로우 순서 문제가 없다고 간주할 수 있습니다. 하지만 모든 픽셀이 완전히 불투명하거나 투명하므로 앨리어싱(“들쑥날쑥한 선”)이 발생합니다.
알파 테스트를 거친 셰이더는 종종 컷아웃 렌더 대기열도 설정하므로 셰이더 코드는 다음과 같습니다.
// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// inside CGPROGRAM in the fragment Shader:
clip(textureColor.a - alphaCutoffValue);
멀티샘플 안티앨리어싱(MSAA, QualitySettings 참조)을 사용하는 경우 알파 투 커버리지 GPU 기능을 사용해 알파 테스트 접근방식을 개선할 수 있습니다. 그러면 사용되는 MSAA 레벨에 따라 에지 형상이 개선됩니다.
이 기능은 대부분 불투명하거나 투명한 텍스처와 매우 얇은 “부분 투명” 영역(풀, 나뭇잎 등)에 가장 효과적입니다.
종종 알파 투 커버리지 셰이더는 컷아웃 렌더 대기열도 설정합니다. 따라서 셰이더 코드는 다음과 같습니다.
// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// inside Pass
AlphaToMask On
다음은 이미 화면에 있는 것에 텍스처를 추가하는 작은 셰이더 예제입니다.
Shader "Simple Additive" {
Properties {
_MainTex ("Texture to blend", 2D) = "black" {}
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Blend One One
SetTexture [_MainTex] { combine texture }
}
}
}
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.