유니티(Unity) 셰이더 Shaderlab 구문과 HLSL(High-Level Shading Language)

반응형

유니티(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
        }
    }
}

반응형

댓글

Designed by JB FACTORY