유니티(Unity) 셰이더 Shaderlab 구문과 HLSL(High-Level Shading Language)
HLSL (High-Level Shading Language)
HLSL은 마이크로소프트가 개발한 고급 셰이더 언어로 주로 DirectX 기반의 그래픽 API에서 사용됩니다.
셰이더는 기본적으로 그래픽 파이프라인에서 버텍스(Vertex)와 픽셀(Pixel, Fragment) 단위로 데이터를 처리하여 화면에 그래픽을 출력하는 역할을 합니다. HLSL를 사용하여 조명, 그림자, 텍스처등 셰이더 내부의 실제 계산 로직을 작성합니다.
셰이더의 로직(수학, 조명 계산) , 낮은 수준에서 GPU에서 실행되는 코드, 그래픽 API 표준 언어
https://learn.microsoft.com/ko-kr/windows/win32/direct3dhlsl/dx-graphics-hlsl
HLSL 예시
float4 SimpleVertexShader(float4 vertexPosition : POSITION) : SV_POSITION {
return mul(UNITY_MATRIX_MVP, vertexPosition);
}
float4 SimpleFragmentShader(float4 position : SV_POSITION) : SV_Target {
return float4(1, 0, 0, 1);
}
ShaderLab
ShaderLab은 유니티에서 제공하는 셰이더 정의 언어로 HLSL 코드와 유니티의 렌더링 파이프라인을 연결해주는 역할을 합니다. 유니티의 셰이더 파일(.shader)은 ShaderLab 구조를 사용하며 HLSL 코드는 특정 영역(CGPROGRAM 블록)에 포함됩니다.
셰이더 파일 전체 구조를 정의, HLSL 코드를 감싸는 정의 언어, 유니티와 셰이더 연결 설정(속성, 렌더링).
https://docs.unity3d.com/kr/530/Manual/SL-Shader.html
고정 기능 파이프라인 (Fixed Function Pipeline)을 사용하는 ShaderLab 셰이더
HLSL 코드를 사용하지 않고 ShaderLab의 고정된 기능을 통해 셰이더의 동작을 정의합니다.
Shader "Simple colored lighting"
{
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
SubShader
{
Pass
{
Material
{
Diffuse [_Color]
}
Lighting On
}
}
}
프로그래머블 파이프라인(programmable pipeline)을 사용하는 ShaderLab 셰이더
유니티 ShaderLab 구조에서 유니티와 셰이더를 연결하는 속성들을 정의하고 CGPROGRAM 블록 내에 셰이더의 계산 로직을 구현하는 HLSL 코드(버텍스 및 픽셀 셰이더를 정의)를 작성합니다.
Shader "Custom/SimpleShader" {
Properties {
_Color ("Main Color", Color) = (1, 1, 1, 1) // 유니티 인스펙터에 표시될 속성
}
SubShader {
Pass {
CGPROGRAM // HLSL 코드를 시작
#pragma vertex SimpleVertexShader // 버텍스 셰이더 지정
#pragma fragment SimpleFragmentShader // 픽셀 셰이더 지정
float4 SimpleVertexShader(float4 vertex : POSITION) : SV_POSITION {
return mul(UNITY_MATRIX_MVP, vertex);
}
float4 SimpleFragmentShader(float4 position : SV_POSITION) : SV_Target {
return float4(1, 0, 0, 1);
}
ENDCG
}
}
}
'유니티게임개발 > 기초공부' 카테고리의 다른 글
유니티에서 애니메이션 이벤트 추가하기(animation event) (0) | 2021.02.20 |
---|---|
유니티 에셋스토어에서 구매한 에셋 불러오기 (0) | 2021.02.17 |
유니티에서 제공하는 VFX 이미지 시퀀스(VFX image sequences, flipbooks) (0) | 2021.01.31 |
유니티에서 오브젝트의 바운딩 박스 그리기(renderer.bounds) (0) | 2021.01.29 |
유니티에서 프리팹 및 씬 내보내기(export to package) (0) | 2021.01.29 |