본문 바로가기

카테고리 없음

Susbtance Painter에서 커스텀 셰이더 사용하기

에셋 출처 : Deviantart

개요

Non-PBR 프로젝트에서도 캐릭터와 배경 텍스처링 과정에서 Substance Painter를 사용해야 할 일이 있다.
이때 커스텀 제작된 GLSL 셰이더로 작업 환경을 셋팅하고, 만들어진 텍스처들을 각 프로젝트의 텍스처 규격에 맞게 내보낼 수 있다.
 

참고 GLSL 셰이더, 문서

C:\Program Files\Adobe\Adobe Substance 3D Painter\resources\starter_assets\shaders
위 경로에 가면 섭스턴스 페인터를 설치할 때 기본적으로 따라오는 기본 셰이더들이 있다.
이 셰이더들을 참고해서 셰이더가 어떻게 구성되는지 대략 파악할 수 있다.
 
C:\Program Files\Adobe\Adobe Substance 3D Painter\resources\shader-doc
여기에서는 셰이더를 짤 때 도움을 받을 수 있는 함수들이 문서화 되어 있다.
 
이 내용은 아래 링크에서도 확인할 수 있다.
https://substance3d.adobe.com/documentation/spdoc/libraries-shader-api-188976070.html
 

규약

//:로 시작하는 부분들이 섭스턴스 페인터와 셰이더를 연결해 주는 부분들이다.
텍스처 태그인 texture_normal 은 현재 베이크된 노멀 텍스처를 불러온다. 같은 방식으로 현재 프로젝트의 각 채널을 얻어오거나, Bake된 메시 맵을 가져올 수도 있다.
 
예를 들어, //: param auto channel_height 로는 현재 프로젝트의 height 채널을 얻어올 수 있다.
 
사용 가능한 택스처 태그 목록은 아래 문서에 정리되어 있다.
https://substance3d.adobe.com/documentation/spdoc/all-engine-params-shader-api-188976087.html

 
SparseTexture 는 현재 시점에서 보이는 텍스처의 일부만을 샘플링 하는 섭스턴스 페인터 내부의 텍스처 유형인 것 같다. 이에 대한 더 자세한 내용은 아래 링크에 있다.
https://substance3d.adobe.com/documentation/spdoc/sparse-virtual-textures-172823866.html
 
SparseTexture에서 텍셀을 얻어올 때는, 기존 glsl에서 사용하던 Texture 함수 대신 textureSparse를 사용한다. 이 함수는 lib-sparse.glsl 에 포함되어 있다.
 

https://substance3d.adobe.com/documentation/spdoc/lib-sparse-shader-api-188976082.html

엔진에서 제공하는 행렬들은 lib-vectors.glsl 에 정리되어 있다. 카메라 월드 위치나 mvp 행렬 등의 정보를 얻어올 수 있다.
이 lib에 정의된 bool is2DView를 사옹하면, 2d 뷰에서 페인팅할 때와 아닐 때 각각 셰이더 표시 결과를 다르게 줄 수 있다.
나의 경우 2d View 일 때는 Rim 효과를 제거하였다. (작업에 방해되기 때문)

이 외에도 Normal끼리 블렌딩하거나, Height 채널로부터 normal을 추출하는 함수 등 여러 유용한 함수들이 들어 있다.
 

GLSL 셰이더 기본 구조

1. import 문으로 필요한 라이브러리를 include 한다.
2. const 문으로 각 채널에 아무 값이 없을 경우에 기본값이 될 상수들을 미리 정의한다.
pbr에서 사용되는 채널들의 기본값은 lib-sampler.glsl에 정의되어 있다.

메탈릭 기본값은 0.0, 러프니스 기본값은 0.3, 베이스컬러 기본값은 0.5 회색

3. 위에서 본 //: 문으로 페인터에서 가져다 쓸 채널들을 변수로 가져오고, 파라미터 ui를 할당한다.
아래는 float 형태의 파라미터 할당 예시이다.

Smoothness 파라미터 UI

4. 픽셀셰이더 entry point로 픽셀 셰이더를 시작한다.

void shade(V2F inputs)
{

	float3 result;
    // ... 픽셀 셰이더에 필요한 계산을 한다.

	// V2F 구조체에서 메시 정보를 얻어올 수 있다.
    vec3 N = normalize(inputs.normal);
   
    // 메시 정보에는 UV 정보도 포함된다.
    vec2 UV = inputs.sparse_coord.tex_coord;
    
    // computeLocalFrame 함수로 해당 프레임의 메시 정보를 얻을수 있다.
    // LocalVectors 구조체의 노멀, 탄젠트, 바이탄젠트 모두 World Space 이다.
    LocalVectors vectors = computeLocalFrame(inputs);
   
	// 아래 Output 에 계산 결과를 넣어준다. alpha 결과값은 opacity 채널을 그대로 넣어주고, 
	// diffuse 결과값은 위에서 계산한 result 값을 넣어주었다.

	alphaOutput(getOpacity(opacity_tex, inputs.sparse_coord));
	diffuseShadingOutput(result);

}

 

Tone Mapping

Custom 한 톤 맵핑을 적용하고 싶다면, 섭스턴스 페인터에서 제공하는 톤 맵핑을 비활성화 해야 한다.
아래 버튼을 누르면 톤맵핑 되기 전의 렌더링 이미지를 얻을 수 있다.

 

템플릿

 
 

참고 문서

https://substance3d.adobe.com/documentation/spdoc/shader-api-89686018.html
Substance Painter 공식 Documentation
 
https://www.artstation.com/marketplace/p/er9WX/simple-toon-shader-for-substance-painter
작성 시작점으로 참고하기 좋은 툰 셰이더이다.
 
Substance Share 라는 에셋 공유 커뮤니티가 있었는데, 지금은 연결이 안되는 것 같다.