Quick Reference
- 기준은 Unity 6.5 (6000.5), Shader Graph 17.0.4입니다. Shader Graph는 URP 또는 HDRP를 설치하면 사용할 수 있습니다. Built-in Render Pipeline에서 같은 Graph와 Target 조합이 동작한다고 가정하지 말고, 먼저 프로젝트의 render pipeline asset을 확인합니다.
- Graph는 shader의 계산과 render state, Material은 그 Graph의 asset별 값,
MaterialPropertyBlock은 특정 Renderer 한 개의 일시적 override를 맡습니다. 프로젝트 전체 표현을 바꿀지, material variation을 만들지, 오브젝트 한 개만 바꿀지부터 구분합니다. - 첫 Graph는 target 하나, 필요한 property 몇 개, Opaque 또는 Transparent 중 하나로 시작합니다. transparency·alpha clip·keyword를 동시에 늘리면 원인 추적과 성능 검증이 어려워집니다.
text
URP Lit Graph
Target: Universal
Surface Type: Opaque
Blackboard: BaseColor, Smoothness
Material: Enemy.mat
Renderer 한 개 override: MaterialPropertyBlockGraph와 Blackboard 설정
- Active Targets는 Graph가 어느 render pipeline의 shader를 만들지 정합니다. URP에서는 Universal target, HDRP에서는 HD target을 고릅니다. target을 바꾸면 쓸 수 있는 block과 render state가 달라질 수 있으므로, material을 만든 뒤 파이프라인을 섞어 쓰지 않습니다. 분홍색(magenta) material은 먼저 render pipeline과 target 호환성을 확인합니다.
- Target의 Surface Type은
Opaque또는Transparent입니다. Opaque는 일반적인 불투명 mesh에 맞고, Transparent는 alpha blending이 필요한 particle·유리·fade에 씁니다. Transparent를 켜면 draw order와 depth write 문제로 겹친 물체가 이상하게 보일 수 있으므로, “alpha 값이 있다”는 이유만으로 고르지 않습니다. - Transparent target의 Blending Mode는
Alpha,Premultiply,Additive,Multiply처럼 합성 방식을 정합니다. 일반 UI/유리 fade는 Alpha, premultiplied texture는 Premultiply, 빛 효과는 Additive, 어두운 합성은 Multiply가 출발점입니다. 텍스처의 alpha 표현과 mode가 다르면 가장자리가 검거나 과하게 밝아집니다. - Alpha Clipping은 알파 threshold보다 낮은 pixel을 버리는 cutout입니다. 나뭇잎·철망처럼 경계가 딱 잘려야 할 때만 켭니다. fade 효과에 쓰면 부드러운 전환이 계단처럼 잘리고, shadow/깊이 결과도 달라집니다.
- Blackboard property의 Name은 Material Inspector에 보이는 이름, Reference는 Shader Graph와 C#이 쓰는 내부 이름입니다. Reference를 바꾸면 기존
Shader.PropertyToID("_Tint")와 Material 값 연결이 끊길 수 있습니다. 화면 이름을 고칠 때 Reference까지 바꿀 이유는 없습니다. - Default는 이 Graph를 쓰는 새 Material의 시작값입니다. 이미 저장된 Material 값이나 실행 중 override를 자동으로 되돌리지는 않습니다. Exposed는 기본값이 켜져 있으며 Material Inspector와 C# API에서 property를 조절할 수 있게 합니다. 끄면 custom value 대신 default로 돌아가므로, runtime에서 바꿔야 할 값은 끄지 않습니다.
- Precision은 property 계산의 정밀도 모드입니다. 모바일에서 범위가 충분한 색·보간 값을 낮은 정밀도로 검토할 수 있지만, 단순히 낮추는 것으로 성능을 확정하지 않습니다. 결과의 banding·깜빡임과 실제 target device의 GPU capture를 함께 봅니다.
Material과 스크립트 연결
csharp
using UnityEngine;
public sealed class DamageTint : MonoBehaviour
{
private static readonly int TintId = Shader.PropertyToID("_Tint");
[SerializeField] private Renderer targetRenderer;
private MaterialPropertyBlock properties;
private void Awake()
{
properties = new MaterialPropertyBlock();
}
public void SetDamageFlash(float amount)
{
targetRenderer.GetPropertyBlock(properties);
properties.SetColor(TintId, Color.Lerp(Color.white, Color.red, amount));
targetRenderer.SetPropertyBlock(properties);
}
}Shader.PropertyToID는 property Reference 문자열을 ID로 바꿉니다.SetColor,SetFloat,SetTexture,SetVector의 타입은 Blackboard property와 맞아야 합니다._Tint가 Exposed property가 아니거나 Reference가 다르면 설정이 보이지 않는 원인을 먼저 확인합니다.Material.SetFloat같은 API는 그 Material asset/instance를 쓰는 모든 Renderer에 영향을 줍니다.renderer.material은 필요에 따라 Renderer 전용 material instance를 만들 수 있으므로, 매 frame 호출하거나 공유 여부를 모르고 수정하면 memory와 variation이 늘어납니다.MaterialPropertyBlock은 shared Material을 복제하지 않고 Renderer 하나에 값을 덮어쓸 때 씁니다.GetPropertyBlock없이 새 block을 바로SetPropertyBlock하면 기존 override를 지울 수 있으므로, 같은 Renderer를 여러 시스템이 만지는 구조라면 override 소유자를 한 곳으로 모읍니다.- Graph property와 keyword는 같은 비용이 아닙니다. 일반 property는 material state 값이고, keyword는 shader variant 수를 늘릴 수 있습니다. variant·local/global keyword·stripping은 Shader Graph property와 keyword에서 따로 확인합니다.
자주 틀리는 부분
Graph를 만들었는데 Material Inspector에서 값을 못 바꾸면 property의 Exposed와 Reference를 먼저 보세요. Name만 맞아도 C# API 계약이 맞는 것은 아닙니다. Exposed를 끄면 custom 값은 default로 돌아갑니다.
Transparent로 바꾼 뒤 생긴 sorting 문제를 node 계산 문제로 오해하지 마세요. Surface Type, blend mode, depth, render queue가 먼저 바뀐 것입니다. Frame Debugger에서 실제 draw 순서와 pass를 확인한 뒤 Graph를 고치세요.
참고 링크
3 sources