Writing Surface Shaders
조명과 상호작용하는 쉐이더를 쓰는 것은 복잡합니다. 다른 조명 타입과 그림자 옵션, 렌더링 경로 (포워드 그리고 지연 렌더링)이 있고 쉐이더는 모든 복잡성을 다뤄야만 합니다.
Unity에서 Surface Shaders는 낮은 레벨의 vertex/pixel shader programs을 사용하는 것 보다 조명 쉐이더를 쓰는 것을 더욱 쉽게 만드는 코드 생성 방법입니다. 표면 쉐이더에 연관된 사용자 정의 언어, 마술 또는 닌자가 없다는 것을 참고하세요; 그것은 단지 손으로 쓰여져야하는 모든 반복적인 코드를 생성합니다. 사용자는 여전히Cg / HLSL로 쉐이더 코드를 씁니다.
예를 위해서 Surface Shader Examples와 Surface Shader Custom Lighting Examples를 살펴보시기 바랍니다.
How it works
사용자는 사용자가 입력값으로 필요로 하는 어떠한UVs 또는 데이터를 취하는 "surface function"을 정의하고 결과 구조 SurfaceOutput
를 채웁니다. SurfaceOutput은 기본적으로 표면의 속성을 설명합니다 (그것은albedo 색상, normal, 발산, 반사 등). 사용자는Cg / HLSL로 이 코드를 씁니다.
표면 쉐이더 컴파일러는 그 때 어떤 입력값이 필요되어 지는지, 무슨 결과가 채워지는 지 등을 알아내고 포워드 그리고 지연 렌더링을 처리하기 위해 패스들을 렌더링할 뿐만 아니라 실제 vertex&pixel shaders를 생성합니다.
표면 쉐이더의 기본적인 결과 구조는 이것입니다:
struct SurfaceOutput {
half3 Albedo;
half3 Normal;
half3 Emission;
half Specular;
half Gloss;
half Alpha;
};
Samples
Surface Shader Examples와 Surface Shader Custom Lighting Examples 페이지를 살펴보시기 바랍니다.
Surface Shader compile directives
표면 쉐이더는 다른 쉐이더들 처럼 CGPROGRAM..ENDCG
블록 사이에 놓여집니다. 차이는 이것입니다:
그것은 그것이 표면 쉐이더라는 것을 알리기 위해 #pragma surface
지시어를 사용합니다:
#pragma surface surfaceFunction lightModel [optionalparams]
Required parameters:
- surfaceFunction - 어떤Cg 함수가 표면 쉐이더 코드를 가지는지 입니다. 함수는
void surf (Input IN, inout SurfaceOutput o)
의 형태를 가져야 합니다. 거기서 입력값은 사용자가 정의한 구조입니다. 입력값은 어떠한 텍스쳐 좌표라도 포함해야 하고 표면 함수에 의해 필요되는 여분의 자동 변수들도 포함해야 합니다 - lightModel - 사용하는 조명 모델. 내장된 것들은
Lambert
(diffuse) 와BlinnPhong
(specular) 입니다. 사용자 자신의 것을 쓰는 방법을 위해서는 Custom Lighting Models 페이지를 참고하시기 바랍니다.
Optional parameters:
alpha
- 알파 블렌딩 모드. 반투명 쉐이더를 위해서 이것을 사용합니다.alphatest:VariableName
- 알파 테스팅 모드. 투명하고 컷아웃 쉐이더를 위해서 이것을 사용합니다. 컷오프 값은VariableName과 함께 소수점 변수안에 있습니다.vertex:VertexFunction
- 사용자 정의 꼭지점 변형 함수. 예를 위해서Tree Bark를 살펴보세요.exclude_path:prepass
orexclude_path:forward
- 주어진 렌더링 경로를 위해서 패스를 생성하지 마십시오.dualforward
- dual lightmaps 렌더링 경로에서 [[RenderTech-ForwardRendering | forward을 사용합니다.fullforwardshadows
- Forward 렌더링 경로에서 모든 그림자 타입을 지원합니다.decal:add
- 첨가하는 데칼 쉐이더 (예. terrain AddPass).decal:blend
- 반투명 데칼 쉐이더softvegetation
- 오직Soft Vegetation이 활성화될 때 표면 쉐이더가 그려지도록 만듭니다.noambient
- 주변의 조명이나 또는 주변의 고조파 조명도 적용하지 않습니다.novertexlights
- 포워드 렌더링에서 주변의 고조파 조명이나 또는 정점 조명도 적용하지 않습니다.nolightmap
- Lightmap 이 쉐이더에서 지원을 비활성화 합니다 (쉐이더를 더 작게 만듭니다).*noforwardadd
- Forward 렌더링 첨가적인 패스를 비활성화 합니다. 이것은 vertex/SH당 계산되는 모든 다른 조명과 함께 쉐이더가 하나의 완전한 방향성있는 조명을 지원하도록 만듭니다. 쉐이도를 역시 더 작게 만듭니다.approxview
- 그것을 필요로하는 쉐이더를 위해서 픽셀당 대신에 정점당 일반화된 뷰 디렉션을 계산합니다. 이것은 더 빠르나 뷰 디렉션은 카메라가 표면에 가까울 때 완전히 옳은 것은 아닙니다.halfasview
- 뷰 디렉션 대신에 조명 함수로 절반 방향 벡터를 패스합니다. 절반 방향은 정점당 계산될 것이고 일반화될 것입니다. 이것은 더 빠르나 완전히 옳지는 않습니다.
또한 사용자는CGPROGRAM 블록 안에서 #pragma debug
를 쓸 수 있고 그 후에 표면 컴파일러는 생성된 코드의 많은 코멘트들을 나눌 것입니다. 사용자는 쉐이더 인스펙터에서Open Compiled Shader을 사용하는 것을 볼 수 있습니다.
Surface Shader input structure
입력 구조 Input
은 일반적으로 쉐이더에 의해 필요되어지는 어떠한 텍스쳐 좌표라도 가집니다. 텍스쳐 좌표는 텍스쳐 이름 다음에 "uv
"라고 이름지어져야만 합니다.
입력 구조에 끼워 넣을 수 있는 추가적인 값들:
float3 viewDir
- 뷰 디렉션을 포함할 것이고Parallax 효과를 위해서는rim 조명등이 포함될 것입니다.float4
withCOLOR
semantic - 보간되는 정점당 색상을 포함할 것입니다.float4 screenPos
- w 반사 효과를 위해서 스크린 공간 위치를 포함할 것입니다. 예를 들어Dark Unity에서 WetStreet 쉐이더에 의해 사용됩니다.float3 worldPos
- 세계 공간 위치를 포함할 것입니다.float3 worldRefl
- 표면 쉐이더가o.Normal로 쓰여지지 않는다면 세계 반사 벡터를 포함할 것입니다. 예를 들어Reflect-Diffuse를 살펴보시기 바랍니다.float3 worldNormal
- 표면 쉐이더가o.Normal로 쓰여지지 않는다면 세계 normal 벡터를 포함할 것입니다.float3 worldRefl; INTERNAL_DATA
- 표면 쉐이더가o.Normal로 쓰여진다면 세계 반사 벡터를 포함할 것입니다. 픽셀당 normal map에 기반한 반사 벡터를 얻기 위해서WorldReflectionVector (IN, o.Normal)
을 사용하시기 바랍니다. 예를 위해서Reflect-Bumped를 참고하시기 바랍니다.float3 worldNormal; INTERNAL_DATA
- 표면 쉐이더가o.Normal로 쓰여진다면 세계 normal 벡터를 포함할 것입니다. 픽셀당 normal map에 기반한 반사 벡터를 얻기 위해서WorldNormalVector (IN, o.Normal)
을 사용하시기 바랍니다(IN, o.Normal)..
Further Documentation
'TA > Unity Shader 레퍼런스' 카테고리의 다른 글
Custom Lighting models in Surface Shaders (0) | 2012.08.24 |
---|---|
SurfaceShaderLighting (0) | 2012.07.26 |
한방에 모아보는 레퍼런스 (1) | 2012.07.20 |
Pass (0) | 2012.07.19 |
Category (0) | 2012.07.18 |