'TA/Unity Shader 레퍼런스'에 해당되는 글 24건

  1. 2012.08.24 Custom Lighting models in Surface Shaders
  2. 2012.07.26 SurfaceShaderLighting
  3. 2012.07.26 SurfaceShaders
  4. 2012.07.20 한방에 모아보는 레퍼런스 1
  5. 2012.07.19 Pass
  6. 2012.07.18 Category
  7. 2012.07.18 SubShader Tags
  8. 2012.07.18 GrabPass
  9. 2012.07.18 UsePass
  10. 2012.07.18 BindChannels
  11. 2012.07.18 Name
  12. 2012.07.18 Fog
  13. 2012.07.18 AlphaTest
  14. 2012.07.18 CullAndDepth
  15. 2012.07.17 SetTexture 1
  16. 2012.07.17 Pass Tags
  17. 2012.07.12 Color, Material, Lighting (fixed funtion)
  18. 2012.07.12 Performance Tips when Writing Shaders
  19. 2012.07.12 Writing vertex and fragment shaders
  20. 2012.06.25 Blending
  21. 2012.05.21 Fallback
  22. 2012.05.17 RenderTech-VertexLit
  23. 2012.05.17 RenderTech-ForwardRendering
  24. 2012.05.17 RenderTech-DeferredLighting

Custom Lighting models in Surface Shaders

Surface Shaders를 쓸 때, 사용자는 표면(albedo color, normal, ...)의 속성을 설명하고 있고 조명 상호 작용이 조명 모델(Lighting Model).

내장된 조명 모델이 Lambert (diffuse 조명)이고 BlinnPhong (반사적인 조명) 입니다.

 

때때로 사용자는 사용자 정의 조명 모델을 사용하기를 원할지도 모르고 표면 쉐이더에서 저것을 하는 것이 가능합니다.

조명 모델이 어떤 규칙을 매치하는Cg/HLSL 함수 두 개보다 더 많지 않습니다. 내장된 LambertBlinnPhong 모델은 Unity 안의 Lighting.cginc 파일에서 정의됩니다(Windows에서 {unity install path}/Data/CGIncludes/Lighting.cginc, Mac에서 /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).

Lighting Model declaration

조명 모델은 Lighting으로 시작하는 이름을 가지는 일반 함수 2개 입니다. 그들은 사용자의 쉐이더 파일 또는included 파일 중 하나에서 어디서나 선언될 수 있습니다. 함수는 이것과 같습니다:

  1. half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);이것은 뷰 디렉션에 의존하지 않는 포워드 렌더링 경로에서 사용됩니다 (예. diffuse).
  2. half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);이것은 뷰 디렉션에 의존하는 조명 모델을 위한 포워드 렌더링 경로에서 사용됩니다.
  3. half4 LightingName_PrePass (SurfaceOutput s, half4 light);이것은 deferred 조명 경로에서 사용됩니다.

사용자가 모든 함수를 선언할 필요가 없다는 것을 참고하세요.

조명 모델은 뷰 디렉션을 사용하거나 또는 하지 않는다는 것입니다.

 

 

 

유사하게 조명 모델이 deferred 조명에서 작동하지 않는다면 사용자는 _PrePass 함수를 선언하지 않고 그것을 사용하는 모든 쉐이더가 포워드 렌더링만으로 컴파일할 것입니다.

 

 

 

 

디렉셔널 라이트맵 디코딩은 어떤 상황들에서는 조명이 포워드와 지연 조명에서처럼 비슷한 방식으로 사용자화(customizing) 될 필요가 있습니다.

 

당신의 라이트 모델이 보는 방향에 의존적인지 아닌지에 따라 아래의 함수 중 하나를 사용하세요.

두개의 함수 다 포워드라이팅과 지연라이팅 렌더링 경로를 자동으로 처리합니다.

  1. half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);이것은 보는 방향 의존적이지 않은 라이트 모델들에 사용됩니다 (e.g. diffuse).

이것은 종속 방향을 볼 수 없습니다 빛이 모델에 사용됩니다(e.g. diffuse).

  1. half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);이것은 보는 방향 의존적인 라이트 모델들에 사용됩니다.

 

 

 

 

 

 

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

SurfaceShaderLighting  (0) 2012.07.26
SurfaceShaders  (0) 2012.07.26
한방에 모아보는 레퍼런스  (1) 2012.07.20
Pass  (0) 2012.07.19
Category  (0) 2012.07.18
Posted by 프리랜서 디자이너

Custom Lighting models in Surface Shaders

Surface Shaders를 쓸 때, 사용자는 표면(albedo color, normal, ...)의 속성을 설명하고 있고 조명 상호 작용이 조명 모델(Lighting Model). 내장된 조명 모델이 Lambert (diffuse 조명)이고 BlinnPhong (반사적인 조명) 입니다.

때때로 사용자는 사용자 정의 조명 모델을 사용하기를 원할지도 모르고 표면 쉐이더에서 저것을 하는 것이 가능합니다. 조명 모델이 어떤 규칙을 매치하는Cg/HLSL 함수 두 개보다 더 많지 않습니다. 내장된 LambertBlinnPhong 모델은 Unity 안의 Lighting.cginc 파일에서 정의됩니다(Windows에서 {unity install path}/Data/CGIncludes/Lighting.cginc, Mac에서 /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).

Lighting Model declaration

조명 모델은 Lighting으로 시작하는 이름을 가지는 일반 함수 2개 입니다. 그들은 사용자의 쉐이더 파일 또는included 파일 중 하나에서 어디서나 선언될 수 있습니다. 함수는 이것과 같습니다:

  1. half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);이것은 뷰 디렉션에 의존하지 않는 포워드 렌더링 경로에서 사용됩니다 (예. diffuse).
  2. half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);이것은 뷰 디렉션에 의존하는 조명 모델을 위한 포워드 렌더링 경로에서 사용됩니다.
  3. half4 LightingName_PrePass (SurfaceOutput s, half4 light);이것은 deferred 조명 경로에서 사용됩니다.

사용자가 모든 함수를 선언할 필요가 없다는 것을 참고하세요. 조명 모델은 뷰 디렉션을 사용하거나 또는 하지 않는다는 것입니다. 유사하게 조명 모델이 deferred 조명에서 작동하지 않는다면 사용자는 _PrePass 함수를 선언하지 않고 그것을 사용하는 모든 쉐이더가 포워드 렌더링만으로 컴파일할 것입니다.

디렉셔널 라이트맵 디코딩은 어떤 상황들에서는 조명이 포워드와 지연 조명에서처럼 비슷한 방식으로 사용자화(customizing) 될 필요가 있습니다. 당신의 라이트 모델이 보는 방향에 의존적인지 아닌지에 따라 아래의 함수 중 하나를 사용하세요. 두개의 함수 다 포워드라이팅과 지연라이팅 렌더링 경로를 자동으로 처리합니다.

  1. half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);이것은 보는 방향 의존적이지 않은 라이트 모델들에 사용됩니다 (e.g. diffuse).

This is used for light models that are not view direction dependent (e.g. diffuse).

  1. half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);이것은 보는 방향 의존적인 라이트 모델들에 사용됩니다.

예제 Examples

Surface Shader Lighting Examples

 

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

Custom Lighting models in Surface Shaders  (0) 2012.08.24
SurfaceShaders  (0) 2012.07.26
한방에 모아보는 레퍼런스  (1) 2012.07.20
Pass  (0) 2012.07.19
Category  (0) 2012.07.18
Posted by 프리랜서 디자이너

Writing Surface Shaders

조명과 상호작용하는 쉐이더를 쓰는 것은 복잡합니다. 다른 조명 타입과 그림자 옵션, 렌더링 경로 (포워드 그리고 지연 렌더링)이 있고 쉐이더는 모든 복잡성을 다뤄야만 합니다.

Unity에서 Surface Shaders는 낮은 레벨의 vertex/pixel shader programs을 사용하는 것 보다 조명 쉐이더를 쓰는 것을 더욱 쉽게 만드는 코드 생성 방법입니다. 표면 쉐이더에 연관된 사용자 정의 언어, 마술 또는 닌자가 없다는 것을 참고하세요; 그것은 단지 손으로 쓰여져야하는 모든 반복적인 코드를 생성합니다. 사용자는 여전히Cg / HLSL로 쉐이더 코드를 씁니다.

예를 위해서 Surface Shader ExamplesSurface 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 ExamplesSurface Shader Custom Lighting Examples 페이지를 살펴보시기 바랍니다.

Surface Shader compile directives

표면 쉐이더는 다른 쉐이더들 처럼 CGPROGRAM..ENDCG 블록 사이에 놓여집니다. 차이는 이것입니다:

  • 그것은 SubShader 안이 아닌 Pass 블록안에 놓여져야만 합니다. 표면 쉐이더는 다수의 패스들로 스스로 컴파일 할 것입니다.

그것은 그것이 표면 쉐이더라는 것을 알리기 위해 #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 or exclude_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 with COLOR 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
Posted by 프리랜서 디자이너

한방에 모아보는 Unity Shader 레퍼런스

 

Properties

 

Properties {
    // properties for water shader
    _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
    _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
    _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
    _RefrColor ("Refraction color", Color)  = (.34, .85, .92, 1) // color
    _ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
    _RefractionTex ("Environment Refraction", 2D) = "" {}
    _Fresnel ("Fresnel (A) ", 2D) = "" {}
    _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

 

Syntax

Properties { Property [Property ...] }
속성 블록을 정의합니다. 중괄호안에 다수의 속성은 다음과 같이 정의됩니다.
name ("display name", Range (min, max)) = number
인스펙터에서 minmax 사이의 슬라이더로 나타나는 소수점 속성을 정의합니다.
name ("display name", Color) = (number,number,number,number)
색상 속성을 정의합니다.
name ("display name", 2D) = "name" { options }
2D 텍스쳐 속성을 정의합니다.
name ("display name", Rect) = "name" { options }
직사각형 (2의 지수가 아닌) 텍스쳐 속성을 정의합니다.
name ("display name", Cube) = "name" { options }
Cubemap 텍스쳐 속성을 정의합니다.
name ("display name", Float) = number
소수점 속성을 정의합니다.
name ("display name", Vector) = (number,number,number,number)
네 개의 컴포넌트 벡터 속성을 정의합니다.

 

 

 

Texture property options

텍스쳐 속성의 괄호안의 옵션은 선택적입니다. 가능한 옵션은 다음과 같습니다:

TexGen texgenmode
이 텍스쳐를 위한 자동적인 텍스쳐 좌표 생성 모드. ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal 중 하나일 수 있습니다; 이러한 것들은 직접적으로OpenGL texgen 모드와 관련됩니다. 사용자 정의 꼭지점 프로그램이 사용되면 TexGen이 무시되는 것을 참고하시기 바랍니다.
LightmapMode
주어지면 이 텍스쳐는 렌더러 당 lightmap 파라미터에 의해서 영향을 받을 것입니다. 즉 사용하는 텍스쳐는 재질안에 있을 수 없습니다. 그러나 그것은 렌더러의 세팅으로부터 취해질 수 있습니다. Renderer scripting documentation을 참고하시기 바랍니다.

Example

// EyeLinear texgen mode example
Shader "Texgen/Eye Linear" {
    Properties {
        _MainTex ("Base", 2D) = "white" { TexGen EyeLinear }
    }
    SubShader {
        Pass {
            SetTexture [_MainTex] { combine texture }
        }
    }
} 

----------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------

Render Setup

패스는 그래픽 하드웨어의 다양한 상태를 셋업합니다. 예를 들어 알파 블렌딩이 켜져야 하고 연기가 사용되야 하는 등등. 명령은 이것들과 같습니다:

Material { Material Block }
정점 조명 파이프라인에서 사용하는 재질을 정의합니다. 자세한 내용을 위해서 material page을 참고 합니다.
Lighting On | Off
정점 조명을 켜거나 끄는 것을 세팅합니다. 자세한 내용을 위해서 material page을 참고 합니다.
Cull Back | Front | Off
다각형 culling 모드를 세팅합니다.
ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
깊이 테스팅 모드를 세팅합니다.
ZWrite On | Off
깊이 쓰기 모드를 세팅합니다.
Fog { Fog Block }
연기 파라미터를 세팅합니다.
AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
알파 테스팅을 합니다.
Blend SourceBlendMode DestBlendMode
알파 블렌딩 모드를 세팅합니다.
Color Color value
정점 조명이 꺼지지 위해서 사용하는 색상을 세팅합니다.
ColorMask RGB | A | 0 | any combination of R, G, B, A
색상 쓰기 마스크를 세팅합니다. ColorMask 0 쓰는 것은 모든 색상 채널로 렌더링하는 것을 끕니다.
Offset OffsetFactor , OffsetUnits
깊이 오프셋을 세팅합니다.
SeparateSpecular On | Off
정점 조명을 위한 별개의 반사적인 색상을 크거나 끕니다. 자세한 내용을 위해서 material page 살펴봅니다.
ColorMaterial AmbientAndDiffuse | Emission
정점 조명을 계산할 때 꼭지점 당 색상을 사용합니다. 자세한 내용을 위해서 material page 살펴봅니다.

 

Texture Setup

SetTexture texture property { [Combine options] }

 

Per-pixel Lighting

픽셀당 조명 파이프라인이 다수의 패스에서 물체를 렌더링하는 것에 의해 작동합니다. Unity는 주변의 그리고 정점 조명을 얻기 위해 물체를 한 번 렌더합니다. 그 후에 그것은 별개의 첨가적인 패스에서 물체에 영향을 주는 각 픽셀 조명을 렌더합니다. 자세한 내용을 위해서는 Render Pipeline 살펴보시기 바랍니다.

Per-vertex Lighting

꼭지점 당 조명은 각 꼭지점을 위해 계산되는 기본적인 Direct3D/OpenGL 조명 모델입니다. 조명은 켜집니다. 조명은 Material block, ColorMaterial 그리고 SeparateSpecular 명령에 의해 영향을 받습니다. 자세한 내용을 위해서는 material page 살펴보시기 바랍니다.

 

----------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------

 

Lighting

Color Color
물체를 단색으로 세팅합니다. 색상은 괄호안의 RGBA 값이거나 또는 사각 괄호안에서 색상 속성 이름입니다.
Material { Material Block }
Material block은 물체의 재질적인 소성을 정의하기 위해서 사용됩니다.
Lighting On | Off
Material block에서 정의된 세팅이 어떠한 효과를 가지기 위해서 사용자는 Lighting On 명령을 가지고 조명을 활성화해야 합니다. 조명이 꺼지면 대신 색상이 Color 명령어로 부터 직접적으로 취해집니다.
SeparateSpecular On | Off
이 명령은 쉐이더의 패스의 끝에 추가될 반사적인 조명을 만들고 반사적인 조명은 텍스쳐링에 영향을 받지 않습니다. Lighting On이 사용될 때의 효과만을 가집니다.

:ColorMaterial AmbientAndDiffuse | 재질에서 세팅된 색상 대신에 사용되는 색상을 만듭니다. AmbientAndDiffuse는 재질의 Ambient와Diffuse값을 대체합니다; 발산은 재질의 발산 값을 대체합니다.

 

 

Material Block

이것은 재질이 조명에 어떻게 반응하는지에 대한 세팅을 포함합니다. 이러한 속성들 중 어떠한 것도 검정을 기본 세팅으로 하는 경우에 남겨지지 않을 수 있습니다 (즉. 효과가 없습니다).

Diffuse Color
확산 색상 컴포넌트. 이것은 물체의 기본 색상입니다.
Ambient Color
주명의 색상 컴포넌트. 이것은 class-RenderSettings에 세팅된 주변 조명 세팅에 의해 그것이 부딪힐 때 물체가 가지는 색상을 의미합니다..
Specular Color
물체의 반적인 하이라이트 색상.
Shininess Number
조명의 날카로움을 0과 1 사이 값으로 표현. 0에서 사용자는 퍼져있는 조명처럼 보이는 커다란 하이라이트를 얻을 것이고 0에서는 아주 작은 얇은 자국을 얻습니다.
Emission Color
어떠한 조명에서도 부딪히지 않을 때 물체의 색상.

Shader "VertexLit" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex] {
                Combine texture * primary DOUBLE, texture * primary
            }
        }
    }
}

 

----------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------

 

Culling & Depth Testing

 

Cull Back | Front | Off
다각형의 어떤 면이 그려지지 않을 지를 조절합니다.
Back 뷰어로 부터 벗어나 있는 다각형은 그리지 않습니다 (기본 설정).
Front 뷰어를 향하는 다각형은 그리지 않습니다. 물체를 내부로 보낼 때 사용됩니다.
Off culling을 비활성화 – 모든 면을 그립니다. 특별한 효과를 위해서 사용됩니다.
ZWrite On | Off
이 물체로 부터 픽셀들이 깊이 버퍼로 쓰여지는지 여부를 결정 (기본값은On). 사용자가 고체의 물체를 그리고 있다면 이것을 on으로 합니다. 사용자가 반투명한 효과를 그리고 있다면 ZWrite Off 로 바꿉니다. 자세한 내용을 위해서는 아래의 내용을 읽어보시기 바랍니다.
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
깊이 테스팅이 어떻게 실행되는지를 나타냅니다. 기본값은 LEqual (기존 물체로서 거리에서 또는 그것으로 부터 물체를 그립니다; 그것들 뒤에서 물체를 숨깁니다).
Offset Factor , Units
사용자가 두 개의 파라미터로 깊이 오프셋을 정하는 것을 허락합니다. factorunitsFactor 는 최대의 Z 기울기를 다각형의 X 또는 Y에 따라 스케일 하고 units은 최소 깊이 버퍼 값을 스케일 합니다. 이것은 사용자가 다각형들이 같은 위치에 있음에도 불구하고 하나의 다각형이 다른 것 위에서 그려지도록 할 수 있습니다. 예를 들어 Offset 0, -1 은 다각형의 기울기를 무시하고 다각형을 카메라 가까이로 당깁니다. 반면 Offset -1, -1 은 방목 각도를 볼 때 심지어 더 가깝게 다각형을 끌어 당깁니다.

 

----------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------

 

Texture block combine command

 

  • Previous 는 이전 SetTexture의 결과입니다.
  • Primarylighting calculation 로부터의 색상이거나 또는 그것이 bound 되어지면 꼭지점 색상입니다.
  • Texture 는SetTexture에서 [TextureName] 에서 지정된 텍스쳐의 색상입니다 (위를 참고하세요).
  • ConstantConstantColor에서 지정된 색상입니다.
  • SetTexture [TexturePropertyName] { Texture Block }ne src1 * src2

    src1과src2를 함께 곱합니다. 결과는 입력값보다 더 어두울 것입니다.
    combine src1 + src2
    src1과src2를 함께 더합니다. 결과는 입력값보다 더 밝을 것입니다.
    combine src1 - src2
    src1에서 src2를 뺍니다.
    combine src1 +- src2
    src1과src2를 함께 더하고나서 0.5를 뺍니다 (부호가 적용되는 덧셈).
    combine src1 lerp (src2) src3
    src2의 알파를 사용해서 src3와src1 사이에서 보간합니다. 보간은 반대 방향임을 주의하시기 바랍니다: 알파가 1일 때src1가 사용되고 알파가 0일 때src3에서 사용됩니다.
    combine src1 * src2 + src3
    src1을src2의 알파 컴포넌트에 곱하고 나서 src3을 더합니다.
    combine src1 * src2 +- src3
    src1을src2의 알파 컴포넌트에 곱하고 나서src3과 함께 부호를 적용하는 덧셈을 합니다.
    combine src1 * src2 - src3
    src1을src2의 알파 컴포넌트에 곱하고 나서src3을 뺍니다.

    모든 src 속성들은 previous, constant, primary 또는 texture 중의 하나일 수 있습니다.

     

    Separate Alpha & Color blending

    기본적으로, 결합 공식은RGB와 색상settexture의 알파 컴포넌트 둘 다를 계산하기 위해서 사용됩니다. 선택적으로 사용자는 알파 계산을 위해서 별개의 공식을 지정할 수 있습니다. 이것은 다음과 같습니다:

    SetTexture [_MainTex] { combine previous * texture, previous + texture }

     

     

    Texture block constantColor command

    ConstantColor color
    결합된 명령에서 사용될 수 있는 상수 색을 정의합니다.

    Texture block matrix command

    matrix [MatrixPropertyName]
    주어진 매트릭스와 함께 이 명령에서 사용된 변형 텍스쳐 좌표.

    Shader "Examples/Self-Illumination 3" {
        Properties {
            _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
            _Color ("Main Color", Color) = (1,1,1,0)
            _SpecColor ("Spec Color", Color) = (1,1,1,1)
            _Emission ("Emmisive Color", Color) = (0,0,0,0)
            _Shininess ("Shininess", Range (0.01, 1)) = 0.7
            _MainTex ("Base (RGB)", 2D) = "white" {}
        }

        SubShader {
            Pass {
                // Set up basic vertex lighting
                Material {
                    Diffuse [_Color]
                    Ambient [_Color]
                    Shininess [_Shininess]
                    Specular [_SpecColor]
                    Emission [_Emission]
                }
                Lighting On

                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    constantColor [_IlluminCol]
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    }

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    Fog

    Fog { Fog Commands }
    괄호안의fog 명령어를 명세합니다.
    Mode Off | Global | Linear | Exp | Exp2
    Fog 모드를 정의합니다. 기본값은 글로벌입니다. 그것은 렌더링 세팅에서 fog가 켜졌는지 여부에 따라서 Off 또는 Exp2로 번역합니다.
    Color ColorValue
    Fog 색을 세팅합니다.
    Density FloatValue
    기하급수적인 fog를 위한 밀도를 세팅합니다.
    Range FloatValue , FloatValue
    선형 fog를 위해 근거리 그리고 원거리의 범위를 세팅합니다.

    Details

    기본적인 fog 세팅은 Render Settings에 기반합니다: fog 모델은 Exp2 또는 Off 입니다; 세팅으로부터 취해진 밀도 & 색.

    사용자가 fragment programs를 사용한다면 그 쉐이더의 Fog 세팅은 여전히 적용될 것입니다. 고정된 Fog 기능이 없는 플랫폼에서 Unity는 요청되는 Fog 모드를 지원하기 위해서 실시간으로 쉐이더를 패치할 것입니다.

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    Alpha testing

     

    AlphaTest Off
    모든 픽셀을 그립니다 (기본 세팅).
    AlphaTest comparison AlphaValue
    그것의 알파 값이 특정 범위안에 있는 픽셀들만 그리기 위한 알파 테스트를 세팅합니다.

    Comparison

    비교는 다음 단어들 중 하나입니다:

    Greater 그것의 알파가 AlphaValue보다 큰 픽셀들만 그립니다.
    GEqual 그것의 알파가’‘AlphaValue’’ 보다 크거나 같은 픽셀들만 그립니다.
    Less 그것의 알파값이’‘AlphaValue’’ 보다 적은 픽셀들만 그립니다.
    LEqual 그것의 알파값이’‘AlphaValue’’ 보다 적거나 같은 픽셀들만 그립니다.
    Equal 그것의 알파값이’‘AlphaValue’’ 과 같은 픽셀들만 그립니다.
    NotEqual 그것의 알파값이’‘AlphaValue’’ 과 다른 픽셀들만 그립니다.
    Always 모든 픽셀을 그립니다. 이것은 AlphaTest Off와 기능적으로 동일합니다.
    Never 어떠한 픽셀도 그리지 않습니다.

    AlphaValue

    0과 1사이의 소수점 숫자. 이것은 기본적인 사각형 타입의 괄호 포맷([변수 이름])을 사용해서 쓰여져야 하는 경우에 하나의 float 또는 범위 속성을 레퍼런스하는 변수를 위해 사용될 수 있습니다.

    Details

    알파 테스트는 투명한 부분들을 가지는 물체를 오목하게 표현할 때 중요합니다. 그래픽 카드는 스크린에 쓰여지는 모든 픽셀의 깊이의 레코드를 유지합니다. 하나의 새로운 픽셀이 이전에 그려진 픽셀보다 멀리 있다면 새로운 픽셀은 디스플레이에 쓰여지지 않습니다. 이것은 Blending과 함께 임에도 불구하고 물체가 들여다 보지 않을 것입니다.

    Shader "Vegetation" {
    Properties {
    _Color ("Main Color", Color) = (.5, .5, .5, .5)
    _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
    _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }
    SubShader {
    // Set up basic lighting
    Material {
    Diffuse [_Color]
    Ambient [_Color]
    }
    Lighting On

    // Render both front and back facing polygons.
    Cull Off

    // first pass:
    //   render any pixels that are more than [_Cutoff] opaque
    Pass {
    AlphaTest Greater [_Cutoff]
    SetTexture [_MainTex] {
    combine texture * primary, texture
    }
    }

    // Second pass:
    //   render in the semitransparent details.
    Pass {
    // Dont write to the depth buffer
    ZWrite off
    // Don't write pixels we have already written.
    ZTest Less
    // Only render pixels less or equal to the value
    AlphaTest LEqual [_Cutoff]

    // Set up alpha blending
    Blend SrcAlpha OneMinusSrcAlpha

    SetTexture [_MainTex] {
    combine texture * primary, texture
    }
    }
    }
    }

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    Blending

    Syntax

    Blend Off
    블렌딩 기능 취소
    Blend SrcFactor DstFactor
    블렌딩을 구성 & 활성화. 생성된 색상은 SrcFactor를 곱합니다. 스크린에 이미 있던 색상은 DstFactor 에 의해 곱해지고 두 개는 함께 더해집니다.

    Properties

    모든 다음의 속성들은SrcFactor와DstFactor 둘 다를 위해서 유효합니다. Source 는 계산되어지는 색상을 의미하고 Destination 는 이미 스크린에 있는 색상을 의미합니다.

    One 1의 값 – 소스 또는 데스티네이션 색상이 온전히 오게 합니다.
    Zero 0의 값 – 소스 또는데스티네이션 값을 삭제하게 합니다.
    SrcColor 이 스테이지의 값은 소스 색상 값에 의해 곱해집니다.
    SrcAlpha 이 스테이지의 값은 소스 알파 값에 의해 곱해집니다.
    DstColor 이 스테이지의 값은 프레임 버퍼 소스 색상 값에 의해 곱해집니다.
    DstAlpha 이 스테이지의 값은 프레임 버퍼 소스 알파 값에 의해 곱해집니다.
    OneMinusSrcColor 이 스테이지의 값은 (1 – 소스 색상)에 의해 곱해집니다.
    OneMinusSrcAlpha 이 스테이지의 값은 (1 – 소스 알파)에 의해 곱해집니다.
    OneMinusDstColor 이 스테이지의 값은 (1 – 데스티네이션 색상)에 의해 곱해집니다.
    OneMinusDstAlpha 이 스테이지의 값은 (1 – 데스티네이션 알파)에 의해 곱해집니다.

    Details

    아래는 가장 흔한 블렌드 타입입니다:

    Blend SrcAlpha OneMinusSrcAlpha     // Alpha blending
    Blend One One                       // Additive
    Blend One OneMinusDstColor          // Soft Additive
    Blend DstColor Zero                 // Multiplicative
    Blend DstColor SrcColor             // 2x Multiplicative
    

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

    LightMode tag

    LightMode 태그는 조명 파이프라인에서 패스의 역할을 정의합니다. 자세한 내용을 위해서 render pipeline를 참고하시기 바랍니다. 이러한 태그는 수동적으로 거의 사용되지 않습니다; 조명과 상호작용할 필요가 있는 쉐이더는Surface Shaders로서 쓰여지고 그 후에 모든 디테일들이 처리됩니다.

    LightMode 태그를 위한 가능한 값:

    • Always: 항상 렌더됩니다; 조명이 적용되지 않습니다.
    • ForwardBase: Forward rendering에서 사용됩니다, 주변의 주요한 방향성있는 조명과vertex/SH 조명이 적용됩니다.
    • ForwardAdd: Forward rendering에서 사용됩니다; 첨가되는 픽셀당 조명이 적용됩니다, 조명당 한 번의 패스.
    • PrepassBase: Deferred Lighting에서 사용됩니다, normals & specular 대표자를 렌더합니다.
    • PrepassFinal: Deferred Lighting에서 사용됩니다, 텍스쳐, 조명 그리고 방사를 결합해서 마지막 색상을 렌더합니다.
    • Vertex: 물체가 조명에 매핑되지 않을 때 Vertex Lit rendering에서 사용됩니다; 모든 정점 조명이 적용됩니다.
    • VertexLMRGBM: 물체가 조명에 매핑되지 않을 때 Vertex Lit rendering 에서 사용됩니다; lightmap이 RGBM으로 인코딩되는 플랫폼.
    • VertexLM: 물체가 조명에 매핑되지 않을 때 Vertex Lit rendering 에서 사용됩니다; lightmap이double-LDR으로 인코딩되는 플랫폼 (일반적으로 모바일 플랫폼 & 오래된 데스크탑 GPUs).
    • ShadowCaster: 그림자 캐스터로 물체를 렌더합니다.
    • ShadowCollector: Forward 렌더링 경로를 위해서 스크린 공간 버퍼로 물체의 그림자를 모읍니다.

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    Name
    Name "PassName"
    PassName 이름을 현재 패스에게 전달합니다.

    Details

    하나의 패스는 하나의 UsePass 명령이 그것을 레퍼런스할 수 있기 위해서 이름이 주어질 수 있습니다.

     

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    BindChannels

    BindChannels 명령은 사용자가 그래픽 하드웨어에 꼭지점 데이터를 어떻게 매핑할지를 정하는 것을 허락합니다.

    BindChannels은 바인딩이 정점 쉐이더 입력값에 따라 조절되는 경우로서 프로그래밍이 가능한 정점 쉐이더가 사용될 때 어떠한 영향도 미치지 않습니다.

    기본적으로 Unity는 사용자를 위한 바인딩을 찾아내나 어떠한 경우에는 사용자가 사용자가 정의한 것이 사용되어지기를 원하기도 합니다.

    예를 들어 사용자는 주요한 UV 세트를 첫 번째 텍스쳐 스테이지에서 사용되기 위해 매핑할 수 있고 부가적인 UV 세트를 두 번째 텍스쳐 스테이지에서 사용되도록 매핑할 수 있습니다. 또는 사용자는 정점 색상이 고려되어져야 하는 것을 하드웨어에 말할 수도 있습니다.

    Syntax

    BindChannels { Bind "source", target }
    정점 데이터 source를 하드웨어 target에 매핑하는 것을 지정합니다.

    Source 다음 중에 하나일 수 있습니다:

    • Vertex: 꼭지점 위치
    • Normal: 꼭지점 normal
    • Tangent: 꼭지점 탄젠트
    • Texcoord: 주요 UV 좌표
    • Texcoord1: 부가적인 UV 좌표
    • Color: 픽셀당 색상

    Target 다음 중에 하나일 수 있습니다:

    • Vertex: 꼭지점 위치
    • Normal: 꼭지점 normal
    • Tangent: 꼭지점 탄젠트
    • Texcoord0, Texcoord1, ...: 해당 텍스쳐 스테이지를 위한 텍스쳐 좌표
    • Texcoord: 모든 텍스쳐 스테이지들을 위한 텍스쳐 좌표들
    • Color: 꼭지점 색상

    Details

    Unity는 어떤 소스가 어떤 타겟에 매핑될 수 있는지에 대한 제한사항들을 가집니다. 소스와 타겟은Vertex, Normal,Tangent 그리고 Color를 위해서 반드시 매치되어야 합니다. 메쉬(TexcoordTexcoord1) 로 부터 텍스쳐 좌표는 텍스쳐 좌표 타겟으로 매핑될 수 있습니다(모든 텍스쳐 스테이지를 위해서는 Texcoord 그리고 특정한 스테이지를 위해서는 TexcoordN).

    BindChannels를 위한 두 가지의 일반적인 사용 케이스가 있습니다:

    • 꼭지점 색상을 고려하는 쉐이더.
    • 두 가지의 UV 세트를 사용하는 쉐이더.

    Examples

    // Maps the first UV set to the first texture stage
    // and the second UV set to the second texture stage
    BindChannels {
       Bind "Vertex", vertex
       Bind "texcoord", texcoord0
       Bind "texcoord1", texcoord1
    } 
    // Maps the first UV set to all texture stages
    // and uses vertex colors
    BindChannels {
       Bind "Vertex", vertex
       Bind "texcoord", texcoord
       Bind "Color", color
    } 

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    UsePass
    UsePass "Shader/Name"
    주어진 쉐이더로 부터 주어진 이름과 함께 모든 패스들을 넣으십시오. 쉐이더/이름은 슬래시 기호에 의해 쉐이더의 이름과 패스의 이름을 포함합니다. Shader/Name은 슬래시 기호에 의해 쉐이더의 이름과 패스의 이름을 포함합니다. .

    Details

    쉐이더 중 몇몇은 코드 중복을 감소하면서 다른 쉐이더로 부터 존재하는 패스들을 재사용할 수 있습니다. 예를 들어, 대부분의 픽셀 기반 조명 쉐이더에서 주위의 또는 정점 조명 패스는 상응하는 VertexLit 쉐이더에서 같습니다. UsePass 명령은 또다른 쉐이더로부터 주어진 패스를 포함합니다. 예로서 다음의 명령은 내장된 Specular쉐이더로부터 "BASE"라는 이름의 패스를 사용합니다:

        UsePass "Specular/BASE"
    

    UsePass가 작동하기 위해서는 하나의 이름이 사용자가 사용하기를 원하는 패스로 주어져야 합니다. 패스안에서 Name 명령은 그것에 이름을 줍니다 command inside the pass gives it a name:

        Name "MyPassName"
    

    내부적으로 모든 패스의 이름은 대분자이기 때문에 UsePass는 이름을 반드시 대분자로 참조해야 합니다.

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    GrabPass

    GrabPass은 특별한 패스 타입입니다 – 그것은 물체가 하나의 텍스쳐로 그려질 스크린의 내용물을 차지합니다. 이런 텍쳐는 좀 더 발전된 이미지 기반의 효과를 만들기 위해 일련의 하위 패스들에서 사용될 수 있습니다.

    Syntax

    GrabPass는 subshader안에 속합니다. 그것은 두 개의 형식을 취합니다:

    • GrabPass { } 는 텍스쳐로 현재의 스크린 내용을 보낼 것입니다. 텍스쳐는 _GrabTexture_에 의해 앞으로의 패스에서 접근될 수 있습니다. 주의: grab pass의 이 형식은 그것을 사용하는 각 물체를 위해 비용이 많이 드는 스크린 grabbing 오퍼레이션을 할 것입니다!
    • GrabPass { "TextureName" }은 텍스쳐로 스크린 내용을 보낼것이나 주어진 텍스쳐 이름을 사용하는 첫 번째 물체을 위해 프레임당 한 번만 작동할 것입니다. 텍스쳐는 주어진 텍스쳐 이름에 의해서 앞으로의 패스에서 접근될 수 있습니다. 이것은 사용자가 씬에서 grab pass를 사용하는 다수의 물체를 가질 때 더욱 성능이 좋습니다.

    게다가 GrabPass은 NameTags 명령을 사용할 수 있습니다.

    Example

    이것이 이전에 그려졌던 색상을 바꾸는 비용이 많이 드는 방법을 보여줍니다:

    Shader "GrabPassInvert" {
        SubShader {
            // Draw ourselves after all opaque geometry
            Tags { "Queue" = "Transparent" }
    
            // Grab the screen behind the object into _GrabTexture
            GrabPass { }
    
            // Render the object with the texture generated above, and invert it's colors
            Pass {
                SetTexture [_GrabTexture] { combine one-texture }
            }
        }
    } 

    이 쉐이더는 두 가지의 패스를 가집니다: 첫 번째 패스는 렌더링이 될 때 물체의 뒤에 무엇이 있던지 잡아내고 그 후에 두 번째 패스에서 그것을 적용합니다. 물론 지금은 같은 효과가 역blend mode을 사용해서 훨씬 저렴하게 얻어질 수 있습니다.

     

     

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    Fallback

    모든Subshaders후에 Fallback이 정의될 수 있습니다. 그것은 기본적으로 어떠한 서브 쉐이더를 하드웨어 위에서 실행될 수 없으면 또다른 쉐이더로부터의 그것들을 사용하는 것을 시도해보라고 말합니다.

    Syntax

    Fallback "name"
    주어진 이름으로 쉐이더에 대체.
    Fallback Off
    심지어 어떠한 서브 쉐이더가 하드웨어에서 실행될 수 없음에도 명확하게 어떠한 대체도 없고 어떠한 주의 메세지도 프린트되어 지지말아야 한다고 나타냅니다.

    Details

    대체를 나타내는 서술은 마치 그 다른 쉐이더로부터 모든 서브 쉐이더가 그것의 위치에 삽입되어지는 것처럼 같은 효과를 가집니다.

    Example

    Shader "example" {
        // properties and subshaders here...
        Fallback "otherexample"
    } 

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

    Category

    Category는 어떠한 명령어들의 논리적인 그룹입니다. 이것은 대체로 렌더링 상태를 "상속"하기 위해 사용됩니다. 예를 들어, 사용자의 쉐이더가 다수의 subshaders를 가지고 그들 각자가 fog를 없애야 하고 추가되는 형태의 blending세팅을 가질지도 모릅니다. 사용자는 그것을 위해서 Category를 사용할 수 있습니다.

    Shader "example" {
    Category {
        Fog { Mode Off }
        Blend One One
        SubShader {
            // ...
        }
        SubShader {
            // ...
        }
        // ...
    }
    }
    

    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------

     

     

     

     

     

     

     

     

     

     

     

     

     

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    SurfaceShaderLighting  (0) 2012.07.26
    SurfaceShaders  (0) 2012.07.26
    Pass  (0) 2012.07.19
    Category  (0) 2012.07.18
    SubShader Tags  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Pass

    Pass 블록은 한 번에 그려지는 물체의 기하학을 야기합니다.

    Syntax

    Pass { [Name and Tags] [RenderSetup] [TextureSetup] }
    기본 패스 명령은 사용하는 텍스쳐의 리스트에 의해 선택적으로 따르는 렌더 셋업 명령의 선택적인 리스트를 포함합니다.

    Name and tags

    패스는 그것의 NameTags의 임의적인 숫자를 정의합니다 – 렌더링 엔진에 패스의 의도를 전달하는 이름/값 스트링.

    Render Setup

    패스는 그래픽 하드웨어의 다양한 상태를 셋업합니다. 예를 들어 알파 블렌딩이 켜져야 하고 연기가 사용되야 하는 등등. 명령은 이것들과 같습니다:

    Material { Material Block }
    정점 조명 파이프라인에서 사용하는 재질을 정의합니다. 자세한 내용을 위해서 material page을 참고 합니다.
     
    Lighting On | Off
    정점 조명을 켜거나 끄는 것을 세팅합니다. 자세한 내용을 위해서 material page을 참고 합니다.
     
    Cull Back | Front | Off
    다각형 culling 모드를 세팅합니다.
     
    ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
    깊이 테스팅 모드를 세팅합니다.
     
    ZWrite On | Off
    깊이 쓰기 모드를 세팅합니다.
     
    Fog { Fog Block }
    연기 파라미터를 세팅합니다.
     
    AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
    알파 테스팅을 합니다.
     
    Blend SourceBlendMode DestBlendMode
    알파 블렌딩 모드를 세팅합니다.
     
    Color Color value
    정점 조명이 꺼지지 위해서 사용하는 색상을 세팅합니다.
     
    ColorMask RGB | A | 0 | any combination of R, G, B, A
    색상 쓰기 마스크를 세팅합니다. ColorMask 0 쓰는 것은 모든 색상 채널로 렌더링하는 것을 끕니다.
     
    Offset OffsetFactor , OffsetUnits
    깊이 오프셋을 세팅합니다.
     
    SeparateSpecular On | Off
    정점 조명을 위한 별개의 반사적인 색상을 크거나 끕니다. 자세한 내용을 위해서 material page 살펴봅니다.
     
    ColorMaterial AmbientAndDiffuse | Emission
    정점 조명을 계산할 때 꼭지점 당 색상을 사용합니다. 자세한 내용을 위해서 material page 살펴봅니다.

    Texture Setup

    렌더 상태를 셋업한 후에 사용자는 SetTexture 명령을 사용하는 것을 적용하기 위해서 많은 텍스쳐를 지정할 수 있고 그들의 결합 모드도 지정할 수 있습니다:

    SetTexture texture property { [Combine options] }

    텍스쳐 셋업은 고정 함수 멀티텍스쳐링 파이프라인을 구성하고 사용자 정의 fragment shaders 사용되면 무시됩니다.

    Details

    Per-pixel Lighting

    픽셀당 조명 파이프라인이 다수의 패스에서 물체를 렌더링하는 것에 의해 작동합니다. Unity는 주변의 그리고 정점 조명을 얻기 위해 물체를 한 번 렌더합니다. 그 후에 그것은 별개의 첨가적인 패스에서 물체에 영향을 주는 각 픽셀 조명을 렌더합니다. 자세한 내용을 위해서는 Render Pipeline 살펴보시기 바랍니다.

    Per-vertex Lighting

    꼭지점 당 조명은 각 꼭지점을 위해 계산되는 기본적인 Direct3D/OpenGL 조명 모델입니다. 조명은 켜집니다. 조명은 Material block, ColorMaterial 그리고 SeparateSpecular 명령에 의해 영향을 받습니다. 자세한 내용을 위해서는 material page 살펴보시기 바랍니다.

    See Also

    공통적인 기능 또는 다양항 고도의 효과를 구현하기 위한 몇 개의 특별한 패스가 가능합니다:

    • UsePass 또 다른 쉐이더로 부터 이름지어진 패스를 포함합니다.
    • GrabPass 다음의 패스에서의 사용을 위해서 텍스쳐로 스크린의 내용을 얻습니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    SurfaceShaders  (0) 2012.07.26
    한방에 모아보는 레퍼런스  (1) 2012.07.20
    Category  (0) 2012.07.18
    SubShader Tags  (0) 2012.07.18
    GrabPass  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: other commands

    Category

    Category는 어떠한 명령어들의 논리적인 그룹입니다. 이것은 대체로 렌더링 상태를 "상속"하기 위해 사용됩니다. 예를 들어, 사용자의 쉐이더가 다수의 subshaders를 가지고 그들 각자가 fog를 없애야 하고 추가되는 형태의 blending세팅을 가질지도 모릅니다. 사용자는 그것을 위해서 Category를 사용할 수 있습니다.

    Shader "example" {
    Category {
        Fog { Mode Off }
        Blend One One
        SubShader {
            // ...
        }
        SubShader {
            // ...
        }
        // ...
    }
    }
    

    Category 블럭은 쉐이더 구문 분석에만 오직 영향을 미치고 그것은 정확하게그 아래의 모든 불럭으로 Category 내부의 어떤 상태 세팅이던 “pasting”하는 것과 같습니다

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    한방에 모아보는 레퍼런스  (1) 2012.07.20
    Pass  (0) 2012.07.19
    SubShader Tags  (0) 2012.07.18
    GrabPass  (0) 2012.07.18
    UsePass  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: SubShader Tags

    서브 쉐이더는 그들이 렌더링 엔젠으로 렌더되어질 것이 어떻게 그리고 언제 기대될지를 말하는 태그를 사용합니다.

    Syntax

    Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
    Value1를 가지는 TagName1그리고Value2를 가지는 TagName2 를 지정합니다. 사용자는 사용자가 좋아하는 만큼 많은 태그를 가질 수 있습니다.

    Details

    태그는 기본적으로 키-값 쌍입니다. SubShader 안에서 태그는 렌더링 순서와 서브 쉐이더의 다른 파라미터를 결정하기 위해서 사용됩니다.

    Rendering Order - Queue tag

    사용자는 사용자의 물체가 Queue 태그를 사용해서 그려지는 순서를 결정할 수 있습니다. 쉐이더는 어떠한 투명한 쉐이더라도 그들이 모든 불투명한 물체들 이후에 그려지는 것을 확실시하는 방법으로 어떤 렌더 큐로 물체가 속하는지를 결정합니다.

    4개의 미리 정의된 렌더 큐가 있으나 미리 정의된 것들 사이에는 더 많은 큐가 있을 수 있습니다. 미리 정의된 큐는 다음과 같습니다:

    • Background - 이 렌더 큐는 다른 것들 전에 렌더됩니다. 스카이 박스와 비슷한 것들의 위해 사용됩니다.
    • Geometry (default) - 대부분의 물체를 위해서 사용됩니다. 불투명한 기하가 이 큐를 사용합니다.
    • Transparent - 이 렌더 큐는 기하 이후에 뒤에서 앞으로의 순서대로 그려집니다. 알파 블렌딩되는 어떠한 것(즉. 깊이 버퍼에 쓰여지지 않는 쉐이더)이라도 여기도 가야만 합니다 (유리, 입자 효과).
    • Overlay - 이 렌더 큐는 기하 이후에 뒤에서 앞으로의 순서대로 그려집니다. 알파 블렌딩되는 어떠한 것(즉. 깊이 버퍼에 쓰여지지 않는 쉐이더)이라도 여기도 가야만 합니다 (유리, 입자 효과).
    Shader "Transparent Queue Example" {
         SubShader {
            Tags {"Queue" = "Transparent" }
            Pass {
                // rest of the shader body...
            }
        }
    } 

    투명한 큐에서 렌더하는 법을 설명하는 예

    Geometry 렌더 큐는 최고의 성능을 위해서 물체의 그려지는 순서를 최적화 합니다. 모든 다른 렌더 큐는 물체를 거리에 따라 정렬합니다. 먼 것부터 시작해서 가까운 순으로 그려집니다.

    특별한 사용을 위해서 큐들 사이에서 사용될 수 있습니다. 내부적으로 각각의 큐는 정수 인덱스에 의해 표현됩니다; Background 은 1000, Geometry 는 2000, Transparent 도는 3000 그리고 오버레이는 4000. 쉐이더가 이것과 같은 큐를 사용한다면:

    Tags { "Queue" = "Geometry+1" }
    

    이것은 물체를 모든 불투명 물체 이후에 그러나 투명한 물체를 이전에 렌더 큐 인덱스가 2001일 것처럼 그려지도록 만들 것입니다. 이것은 사용자가 어떠한 물체들을 항상 물체들의 다른 세트들 사이에서 그려지도록 원하는 상황에 유용합니다. 예를 들어, 대부분의 경우에 투명한 물은 불투명한 물체 이후에 그러나 투명한 물체 이전에 그려져야 합니다.

    IgnoreProjector tag

    IgnoreProjector 태그가 주어지고 "True" 값을 가진다면 그 때 이런 쉐이더를 사용하는 물체는 Projectors에 의해 영향을 받지 않을 것입니다. Projectors가 그들에게 영향을 주는 좋은 방법이 없기 때문에 이것은 주로 반투명한 물체들 위에서 유용합니다.

    See Also

    패스에 태그 역시 주어질 수 있습니다. Pass Tags를 살펴보시기 바랍니다.

     

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Pass  (0) 2012.07.19
    Category  (0) 2012.07.18
    GrabPass  (0) 2012.07.18
    UsePass  (0) 2012.07.18
    BindChannels  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: GrabPass

    GrabPass은 특별한 패스 타입입니다 – 그것은 물체가 하나의 텍스쳐로 그려질 스크린의 내용물을 차지합니다. 이런 텍쳐는 좀 더 발전된 이미지 기반의 효과를 만들기 위해 일련의 하위 패스들에서 사용될 수 있습니다.

    Syntax

    GrabPass는 subshader안에 속합니다. 그것은 두 개의 형식을 취합니다:

    • GrabPass { } 는 텍스쳐로 현재의 스크린 내용을 보낼 것입니다. 텍스쳐는 _GrabTexture_에 의해 앞으로의 패스에서 접근될 수 있습니다. 주의: grab pass의 이 형식은 그것을 사용하는 각 물체를 위해 비용이 많이 드는 스크린 grabbing 오퍼레이션을 할 것입니다!
    • GrabPass { "TextureName" }은 텍스쳐로 스크린 내용을 보낼것이나 주어진 텍스쳐 이름을 사용하는 첫 번째 물체을 위해 프레임당 한 번만 작동할 것입니다. 텍스쳐는 주어진 텍스쳐 이름에 의해서 앞으로의 패스에서 접근될 수 있습니다. 이것은 사용자가 씬에서 grab pass를 사용하는 다수의 물체를 가질 때 더욱 성능이 좋습니다.

    게다가 GrabPass은 NameTags 명령을 사용할 수 있습니다.

    Example

    이것이 이전에 그려졌던 색상을 바꾸는 비용이 많이 드는 방법을 보여줍니다:

    Shader "GrabPassInvert" {
        SubShader {
            // Draw ourselves after all opaque geometry
            Tags { "Queue" = "Transparent" }
    
            // Grab the screen behind the object into _GrabTexture
            GrabPass { }
    
            // Render the object with the texture generated above, and invert it's colors
            Pass {
                SetTexture [_GrabTexture] { combine one-texture }
            }
        }
    } 

    이 쉐이더는 두 가지의 패스를 가집니다: 첫 번째 패스는 렌더링이 될 때 물체의 뒤에 무엇이 있던지 잡아내고 그 후에 두 번째 패스에서 그것을 적용합니다. 물론 지금은 같은 효과가 역blend mode을 사용해서 훨씬 저렴하게 얻어질 수 있습니다.

    See Also

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Category  (0) 2012.07.18
    SubShader Tags  (0) 2012.07.18
    UsePass  (0) 2012.07.18
    BindChannels  (0) 2012.07.18
    Name  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: UsePass

    UsePass 명령은 또다른 쉐이더로 부터의 이름 지어진 패스를 사용합니다.

    Syntax

    UsePass "Shader/Name"
    주어진 쉐이더로 부터 주어진 이름과 함께 모든 패스들을 넣으십시오. 쉐이더/이름은 슬래시 기호에 의해 쉐이더의 이름과 패스의 이름을 포함합니다. Shader/Name은 슬래시 기호에 의해 쉐이더의 이름과 패스의 이름을 포함합니다. .

    Details

    쉐이더 중 몇몇은 코드 중복을 감소하면서 다른 쉐이더로 부터 존재하는 패스들을 재사용할 수 있습니다. 예를 들어, 대부분의 픽셀 기반 조명 쉐이더에서 주위의 또는 정점 조명 패스는 상응하는 VertexLit 쉐이더에서 같습니다. UsePass 명령은 또다른 쉐이더로부터 주어진 패스를 포함합니다. 예로서 다음의 명령은 내장된 Specular쉐이더로부터 "BASE"라는 이름의 패스를 사용합니다:

        UsePass "Specular/BASE"
    

    UsePass가 작동하기 위해서는 하나의 이름이 사용자가 사용하기를 원하는 패스로 주어져야 합니다. 패스안에서 Name 명령은 그것에 이름을 줍니다 command inside the pass gives it a name:

        Name "MyPassName"
    

    내부적으로 모든 패스의 이름은 대분자이기 때문에 UsePass는 이름을 반드시 대분자로 참조해야 합니다.

     

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    SubShader Tags  (0) 2012.07.18
    GrabPass  (0) 2012.07.18
    BindChannels  (0) 2012.07.18
    Name  (0) 2012.07.18
    Fog  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: BindChannels

    BindChannels 명령은 사용자가 그래픽 하드웨어에 꼭지점 데이터를 어떻게 매핑할지를 정하는 것을 허락합니다.

    BindChannels은 바인딩이 정점 쉐이더 입력값에 따라 조절되는 경우로서 프로그래밍이 가능한 정점 쉐이더가 사용될 때 어떠한 영향도 미치지 않습니다.

    기본적으로 Unity는 사용자를 위한 바인딩을 찾아내나 어떠한 경우에는 사용자가 사용자가 정의한 것이 사용되어지기를 원하기도 합니다.

    예를 들어 사용자는 주요한 UV 세트를 첫 번째 텍스쳐 스테이지에서 사용되기 위해 매핑할 수 있고 부가적인 UV 세트를 두 번째 텍스쳐 스테이지에서 사용되도록 매핑할 수 있습니다. 또는 사용자는 정점 색상이 고려되어져야 하는 것을 하드웨어에 말할 수도 있습니다.

    Syntax

    BindChannels { Bind "source", target }
    정점 데이터 source를 하드웨어 target에 매핑하는 것을 지정합니다.

    Source 다음 중에 하나일 수 있습니다:

    • Vertex: 꼭지점 위치
    • Normal: 꼭지점 normal
    • Tangent: 꼭지점 탄젠트
    • Texcoord: 주요 UV 좌표
    • Texcoord1: 부가적인 UV 좌표
    • Color: 픽셀당 색상

    Target 다음 중에 하나일 수 있습니다:

    • Vertex: 꼭지점 위치
    • Normal: 꼭지점 normal
    • Tangent: 꼭지점 탄젠트
    • Texcoord0, Texcoord1, ...: 해당 텍스쳐 스테이지를 위한 텍스쳐 좌표
    • Texcoord: 모든 텍스쳐 스테이지들을 위한 텍스쳐 좌표들
    • Color: 꼭지점 색상

    Details

    Unity는 어떤 소스가 어떤 타겟에 매핑될 수 있는지에 대한 제한사항들을 가집니다. 소스와 타겟은Vertex, Normal,Tangent 그리고 Color를 위해서 반드시 매치되어야 합니다. 메쉬(TexcoordTexcoord1) 로 부터 텍스쳐 좌표는 텍스쳐 좌표 타겟으로 매핑될 수 있습니다(모든 텍스쳐 스테이지를 위해서는 Texcoord 그리고 특정한 스테이지를 위해서는 TexcoordN).

    BindChannels를 위한 두 가지의 일반적인 사용 케이스가 있습니다:

    • 꼭지점 색상을 고려하는 쉐이더.
    • 두 가지의 UV 세트를 사용하는 쉐이더.

    Examples

    // Maps the first UV set to the first texture stage
    // and the second UV set to the second texture stage
    BindChannels {
       Bind "Vertex", vertex
       Bind "texcoord", texcoord0
       Bind "texcoord1", texcoord1
    } 
    // Maps the first UV set to all texture stages
    // and uses vertex colors
    BindChannels {
       Bind "Vertex", vertex
       Bind "texcoord", texcoord
       Bind "Color", color
    } 

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    GrabPass  (0) 2012.07.18
    UsePass  (0) 2012.07.18
    Name  (0) 2012.07.18
    Fog  (0) 2012.07.18
    AlphaTest  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Name

    Syntax

    Name "PassName"
    PassName 이름을 현재 패스에게 전달합니다.

    Details

    하나의 패스는 하나의 UsePass 명령이 그것을 레퍼런스할 수 있기 위해서 이름이 주어질 수 있습니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    UsePass  (0) 2012.07.18
    BindChannels  (0) 2012.07.18
    Fog  (0) 2012.07.18
    AlphaTest  (0) 2012.07.18
    CullAndDepth  (0) 2012.07.18
    Posted by 프리랜서 디자이너

    Fog

    ShaderLab syntax: Fog

    안개 파라미터들은 Fog 명령어로 조절됩니다.

    Fogging은 생성된 픽셀의 색을 카메라로부터의 거리에 따른 일정한 색을 향해 혼합합니다. Fogging은 혼합된 픽셀의 알파 값을 바꾸지 않습니다. 오직 그것의 RGB 컴포넌트만을 바꿉니다.

    Syntax

    Fog { Fog Commands }
    괄호안의fog 명령어를 명세합니다.
    Mode Off | Global | Linear | Exp | Exp2
    Fog 모드를 정의합니다. 기본값은 글로벌입니다. 그것은 렌더링 세팅에서 fog가 켜졌는지 여부에 따라서 Off 또는 Exp2로 번역합니다.
    Color ColorValue
    Fog 색을 세팅합니다.
    Density FloatValue
    기하급수적인 fog를 위한 밀도를 세팅합니다.
    Range FloatValue , FloatValue
    선형 fog를 위해 근거리 그리고 원거리의 범위를 세팅합니다.

    Details

    기본적인 fog 세팅은 Render Settings에 기반합니다: fog 모델은 Exp2 또는 Off 입니다; 세팅으로부터 취해진 밀도 & 색.

    사용자가 fragment programs를 사용한다면 그 쉐이더의 Fog 세팅은 여전히 적용될 것입니다. 고정된 Fog 기능이 없는 플랫폼에서 Unity는 요청되는 Fog 모드를 지원하기 위해서 실시간으로 쉐이더를 패치할 것입니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    BindChannels  (0) 2012.07.18
    Name  (0) 2012.07.18
    AlphaTest  (0) 2012.07.18
    CullAndDepth  (0) 2012.07.18
    SetTexture  (1) 2012.07.17
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Alpha testing

    알파 테스트는 픽셀을 스크린에 쓰여지는 것으로부터 거절할 수 있는 마지막 기회입니다.

    마지막 결과 색상이 계산되어진 후에, 색은 고정 값에 비교되어진 그것의 알파 값을 선택적으로 가질 수 있습니다. 테스트가 실패하면 픽셀은 디스플레이에 쓰여지지 않습니다.

    Syntax

    AlphaTest Off
    모든 픽셀을 그립니다 (기본 세팅).
     
    AlphaTest comparison AlphaValue
    그것의 알파 값이 특정 범위안에 있는 픽셀들만 그리기 위한 알파 테스트를 세팅합니다.

    Comparison

    비교는 다음 단어들 중 하나입니다:

    Greater 그것의 알파가 AlphaValue보다 큰 픽셀들만 그립니다.
    GEqual 그것의 알파가’‘AlphaValue’’ 보다 크거나 같은 픽셀들만 그립니다.
    Less 그것의 알파값이’‘AlphaValue’’ 보다 적은 픽셀들만 그립니다.
    LEqual 그것의 알파값이’‘AlphaValue’’ 보다 적거나 같은 픽셀들만 그립니다.
    Equal 그것의 알파값이’‘AlphaValue’’ 과 같은 픽셀들만 그립니다.
    NotEqual 그것의 알파값이’‘AlphaValue’’ 과 다른 픽셀들만 그립니다.
    Always 모든 픽셀을 그립니다. 이것은 AlphaTest Off와 기능적으로 동일합니다.
    Never 어떠한 픽셀도 그리지 않습니다.

    AlphaValue

    0과 1사이의 소수점 숫자. 이것은 기본적인 사각형 타입의 괄호 포맷([변수 이름])을 사용해서 쓰여져야 하는 경우에 하나의 float 또는 범위 속성을 레퍼런스하는 변수를 위해 사용될 수 있습니다.

    Details

    알파 테스트는 투명한 부분들을 가지는 물체를 오목하게 표현할 때 중요합니다. 그래픽 카드는 스크린에 쓰여지는 모든 픽셀의 깊이의 레코드를 유지합니다. 하나의 새로운 픽셀이 이전에 그려진 픽셀보다 멀리 있다면 새로운 픽셀은 디스플레이에 쓰여지지 않습니다. 이것은 Blending과 함께 임에도 불구하고 물체가 들여다 보지 않을 것입니다.

    이 그림에서 왼쪽에 나무는 AlphaTest를 사용해서 그려집니다. 그것안에 픽셀들이 어떻게 완전히 투명하거나 불투명한지를 참고하시기 바랍니다. 가운데 나무는 오직 Alpha Blending 사용해서 그려집니다. 나뭇 가지 근처의 투명한 부분들이 깊이 버퍼 때문에 어떻게 멀리있는 나뭇잎들을 커버하는지를 참고하시기 바랍니다.

     

     오른쪽에 있는 나무는 마지막 쉐이더 예를 사용해서 그려집니다 – 그것은 어떠한 아티팩트라도 숨기기 위해서 블렌딩과 알파 테스팅이 결합된 것을 구현합니다.

    Examples

    가장 간단한 가능한 예는 알파 채널을 가지는 하나의 텍스쳐를 그것에 지정하는 것입니다. 물체는 알파가 0.5보다 큰 곳에서만 보여질 것입니다.

    Shader "Simple Alpha Test" {
    	Properties {
    		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    	}
    	SubShader {
    		Pass {
    			// Only render pixels with an alpha larger than 50%
    			AlphaTest Greater 0.5
    			SetTexture [_MainTex] { combine texture }
    		}
    	}
    }

    이것은 그것 스스로 훨씬 좋지 않습니다. 사용자가 조명을 추가하게 해주고 컷오프 값을 조정 가능하게 만들어 줍니다:

    Shader "Cutoff Alpha" {
    	Properties {
    		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    		_Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
    	}
    	SubShader {
    		Pass {
    			// Use the Cutoff parameter defined above to determine
    			// what to render.
    			AlphaTest Greater [_Cutoff]
    
    			Material {
    				Diffuse (1,1,1,1)
    				Ambient (1,1,1,1)
    			}
    			Lighting On
    			SetTexture [_MainTex] { combine texture * primary }
    		}
    	}
    } 

    식물과 나무를 그릴 때, 많은 게임들은 일반적인 알파 테스팅의 단단한 모서리를 가집니다. 그것에 대한 하나의 방법은 물체를 두 번 그리는 것입니다. 첫 번째 패스에서 사용자는 50% 보다 더욱 불투명한 픽셀만을 그리기 위해서 알파 테스팅을 사용합니다. 두 번째 패스에서 사용자는 픽셀의 깊이를 기록하는 것 없이 잘려진 부분들에 그래픽을 알파 블렌딩 합니다. 사용자는 멀리 있는 나뭇 가지가 가까이 있는 것을 덮어 씌움에 따라 약간의 혼돈을 가질지도 모릅니다. 그러나 실제로 나뭇잎이 그것들 안에 있는 많은 시각적인 디테일을 가지는 것을 보는 것은 어렵습니다.

    Shader "Vegetation" { Properties { _Color ("Main Color", Color) = (.5, .5, .5, .5) _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {} _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5 } SubShader { // Set up basic lighting Material { Diffuse [_Color] Ambient [_Color] } Lighting On // Render both front and back facing polygons. Cull Off // first pass: // render any pixels that are more than [_Cutoff] opaque Pass { AlphaTest Greater [_Cutoff] SetTexture [_MainTex] { combine texture * primary, texture } }              // Second pass: // render in the semitransparent details. Pass { // Dont write to the depth buffer ZWrite off // Don't write pixels we have already written. ZTest Less // Only render pixels less or equal to the value AlphaTest LEqual [_Cutoff] // Set up alpha blending Blend SrcAlpha OneMinusSrcAlpha SetTexture [_MainTex] { combine texture * primary, texture } } } }

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Name  (0) 2012.07.18
    Fog  (0) 2012.07.18
    CullAndDepth  (0) 2012.07.18
    SetTexture  (1) 2012.07.17
    Pass Tags  (0) 2012.07.17
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Culling & Depth Testing

    Culling은 뷰어로부터 방향이 빛나간 다각형들을 그리지 않는 최적화 방법입니다. 모든 다각형은 앞과 뒤쪽 사이드를 가집니다. Culling은 대부분의 물체가 닫혀 있다는 사실을 사용합니다; 사용자가 하나의 정육면체를 가진다면 사용자는 사용자로부터 방향이 빛나가 있는 면은 절대 보지 못할 것입니다 (그것의 앞에 항상 사용자를 마주보는 면이 있습니다). 그래서 사용자는 빛나가 있는 면들은 그릴 필요가 없습니다. 그러므로 그 용어를 사용합니다: Backface culling.

    렌더링을 올바르게 보이게하는 다른 특성은 깊이 테스팅 입니다. 깊이 테스팅은 오직 닫혀진 표면 물체들만이 씬에서 그려지는 것을 확실하게 합니다.

    Syntax

    Cull Back | Front | Off
    다각형의 어떤 면이 그려지지 않을 지를 조절합니다.
    Back 뷰어로 부터 벗어나 있는 다각형은 그리지 않습니다 (기본 설정).
    Front 뷰어를 향하는 다각형은 그리지 않습니다. 물체를 내부로 보낼 때 사용됩니다.
    Off culling을 비활성화 – 모든 면을 그립니다. 특별한 효과를 위해서 사용됩니다.

     

     

    ZWrite On | Off
    이 물체로 부터 픽셀들이 깊이 버퍼로 쓰여지는지 여부를 결정 (기본값은On). 사용자가 고체의 물체를 그리고 있다면 이것을 on으로 합니다. 사용자가 반투명한 효과를 그리고 있다면 ZWrite Off 로 바꿉니다. 자세한 내용을 위해서는 아래의 내용을 읽어보시기 바랍니다.

     

    ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
    깊이 테스팅이 어떻게 실행되는지를 나타냅니다. 기본값은 LEqual (기존 물체로서 거리에서 또는 그것으로 부터 물체를 그립니다; 그것들 뒤에서 물체를 숨깁니다).

     

    Offset Factor , Units
    사용자가 두 개의 파라미터로 깊이 오프셋을 정하는 것을 허락합니다. factorunitsFactor 는 최대의 Z 기울기를 다각형의 X 또는 Y에 따라 스케일 하고 units은 최소 깊이 버퍼 값을 스케일 합니다. 이것은 사용자가 다각형들이 같은 위치에 있음에도 불구하고 하나의 다각형이 다른 것 위에서 그려지도록 할 수 있습니다. 예를 들어 Offset 0, -1 은 다각형의 기울기를 무시하고 다각형을 카메라 가까이로 당깁니다. 반면 Offset -1, -1 은 방목 각도를 볼 때 심지어 더 가깝게 다각형을 끌어 당깁니다.

    Examples

    This object will render only the backfaces of an object:

    Shader "Show Insides" {
        SubShader {
            Pass {
                Material {
                    Diffuse (1,1,1,1)
                }
                Lighting On
                Cull Front
            }
        }
    } 

    그것을 하나의 정육면체에 적용하도록 하고 사용자가 그것 주위에서 선회할 때 기하학적으로 어떻게 잘못되는지 느끼는 것을 주의하시기 바랍니다. 이것은 사용자가 정육면체 내부의 부분만을 오직 보고 있기 때문입니다.

    Debugging Normals

    다음의 것은 더욱 흥미롭습니다; 첫째로 사용자는 보통의 정점 조명을 가지고 물체를 표현하고 나서 밝은 핑크색으로 뒤쪽 면들을 표현합니다. 이것은 사용자의 normals이 뒤집혀질 필요가 있는 어떤 곳에서는 하이라이팅 효과를 가집니다. 사용자가 어떠한 메쉬에 의해 물려있는 물리적으로 통제되는 물체를 본다면 이 쉐이더를 그들에게 지정하시기 바랍니다. 어떤 핑크색 부분이라도 보이다면 이러한 부분들은 그것을 터치하기에 충분히 불행한 어떠한 곳에서 당겨질 것입니다.

    Here we go:

    Shader "Reveal Backfaces" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" { }
        }
        SubShader {
            // Render the front-facing parts of the object.
            // We use a simple white material, and apply the main texture.
            Pass {
                Material {
                    Diffuse (1,1,1,1)
                }
                Lighting On
                SetTexture [_MainTex] {
                    Combine Primary * Texture
                }
            }
    
            // Now we render the back-facing triangles in the most
            // irritating color in the world: BRIGHT PINK!
            Pass {
                Color (1,0,1,1)
                Cull Front
            }
        }
    } 

    Glass Culling

    Culling을 통제하는 것은 배면을 디버깅하는 것보다 더욱 유용합니다. 사용자가 투명한 물체를 가진다면 사용자는 꽤 자주 물체의 배면을 보여주기는 원합니다. 사용자가 어떠한 culling (Cull Off) 없이 그린다면 사용자가 앞쪽의 면의 어떤 부분에 겹쳐지는 뒤쪽의 면들을 가질 것입니다.

    볼록한 물체(구, 정육면체, 자동차 앞유리)를 위해 작동할 간단한 쉐이더 입니다.

    Shader "Simple Glass" {
        Properties {
            _Color ("Main Color", Color) = (1,1,1,0)
            _SpecColor ("Spec Color", Color) = (1,1,1,1)
            _Emission ("Emmisive Color", Color) = (0,0,0,0)
            _Shininess ("Shininess", Range (0.01, 1)) = 0.7
            _MainTex ("Base (RGB)", 2D) = "white" { }
        }
    
        SubShader {
            // We use the material in many passes by defining them in the subshader.
            // Anything defined here becomes default values for all contained passes.
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
    
            // Set up alpha blending
            Blend SrcAlpha OneMinusSrcAlpha
    
            // Render the back facing parts of the object.
            // If the object is convex, these will always be further away
            // than the front-faces.
            Pass {
                Cull Front
                SetTexture [_MainTex] {
                    Combine Primary * Texture
                }
            }
            // Render the parts of the object facing us.
            // If the object is convex, these will be closer than the
            // back-faces.
            Pass {
                Cull Back
                SetTexture [_MainTex] {
                    Combine Primary * Texture
                }
            }
        }
    } 

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Fog  (0) 2012.07.18
    AlphaTest  (0) 2012.07.18
    SetTexture  (1) 2012.07.17
    Pass Tags  (0) 2012.07.17
    Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Texturing

    기본 꼭지점 조명이 계산되어진 후에 텍스쳐가 적용됩니다. ShaderLab에서 이것은 SetTexture 명령을 사용해서 행해집니다.

    fragment programs이 사용될 때 SetTexture 명령은 어떠한 효과도 가지지 않습니다; 이 경우에서 처럼 픽셀 오퍼레이션은 쉐이더에서 완전히 설명됩니다.

    텍스쳐링은 오래된 스타일 결합 효과를 하는 곳입니다. 사용자는 패스안에서 다수의SetTexture 명령을 가질 수 있습니다 - 페인팅 프로그램의 레이어처럼 모든 텍스쳐가 차례로 적용됩니다. SetTexture 명령은 Pass 끝에 놓여져야만 합니다.

    Syntax

    SetTexture [TexturePropertyName] { Texture Block }
    텍스쳐를 지정합니다. TextureName 은 텍스쳐 속성으로서 정의되어야 합니다. 텍스쳐를 적용하는 방법은 TextureBlock안에서 정의됩니다.

    텍스쳐 블록은 텍스쳐가 어떻게 적용되는지를 조절합니다. 텍스쳐 블록 안에는 세 개의 명령이 있을 수 있습니다: combine, matrix 그리고 constantColor.

    Texture block combine command

    combine src1 * src2
    src1과src2를 함께 곱합니다. 결과는 입력값보다 더 어두울 것입니다.
    combine src1 + src2
    src1과src2를 함께 더합니다. 결과는 입력값보다 더 밝을 것입니다.
    combine src1 - src2
    src1에서 src2를 뺍니다.
    combine src1 +- src2
    src1과src2를 함께 더하고나서 0.5를 뺍니다 (부호가 적용되는 덧셈).
    combine src1 lerp (src2) src3
    src2의 알파를 사용해서 src3와src1 사이에서 보간합니다. 보간은 반대 방향임을 주의하시기 바랍니다: 알파가 1일 때src1가 사용되고 알파가 0일 때src3에서 사용됩니다.
    combine src1 * src2 + src3
    src1을src2의 알파 컴포넌트에 곱하고 나서 src3을 더합니다.
    combine src1 * src2 +- src3
    src1을src2의 알파 컴포넌트에 곱하고 나서src3과 함께 부호를 적용하는 덧셈을 합니다.
    combine src1 * src2 - src3
    src1을src2의 알파 컴포넌트에 곱하고 나서src3을 뺍니다.

    모든 src 속성들은 previous, constant, primary 또는 texture 중의 하나일 수 있습니다.

    • Previous이전 SetTexture의 결과입니다.
    • Primary lighting calculation 로부터의 색상이거나 또는 그것이 bound 되어지면 꼭지점 색상입니다.
    • Texture 는SetTexture에서 [TextureName] 에서 지정된 텍스쳐의 색상입니다 (위를 참고하세요).
    • Constant ConstantColor에서 지정된 색상입니다.

    Modifiers:

    • 위에서 지정된 공식은 색상을 2배 또는 4배 더 밝게 만들기 위해서 Double또는 Quad 키워드에 의해 선택적으로 따라질 수 있습니다.
    • lerp 아규먼트를 제외하고 모든 src속성들은 선택적으로 one - 에 의해서 선택적으로 진행될 수 있습니다 – 결과 색상을 차감되게 하기 위해서.
    • 모든 src 속성들은 오직 알파 채널을 취하기 위해서 alpha 에 의해서 달라질 수 있습니다.

    Texture block constantColor command

    ConstantColor color
    결합된 명령에서 사용될 수 있는 상수 색을 정의합니다.

    Texture block matrix command

    matrix [MatrixPropertyName]
    주어진 매트릭스와 함께 이 명령에서 사용된 변형 텍스쳐 좌표.

    Details

    오래된 그래픽 카드는 텍스쳐에 층을 이루는 방법을 사용합니다. 텍스쳐는 스크린으로 쓰여질 색상을 바꾸면서 각각 이후에 적용된 것입니다. 각 텍스쳐를 위해서 텍스쳐는 일반적으로 이전 오퍼레이션의 결과와 함께 결합됩니다.

     

     

    Separate Alpha & Color blending

    기본적으로, 결합 공식은RGB와 색상settexture의 알파 컴포넌트 둘 다를 계산하기 위해서 사용됩니다.

    선택적으로 사용자는 알파 계산을 위해서 별개의 공식을 지정할 수 있습니다. 이것은 다음과 같습니다:

     

    SetTexture [_MainTex] { combine previous * texture, previous + texture }

     

    여기서 우리는RGB 색을 곱하고 알파를 더합니다.

     

     

     

     

    Specular highlights

    기본적으로 primary색은 확산, 주변의 그리고 반사적인 색상의 합입니다 (Lighting calculation 에서 정의된 것처럼). 사용자가 패스 옵션에서 SeparateSpecular On 을 지정한다면 반사적인 색상은 이전 보다는 결합 계산 후에 반사적인 색상이 더해질 것입니다. 이것은 내장된 정점 조명 쉐이더의 기본적인 기능입니다.

     

     

     

     

    Graphics hardware support

    오래된 그래픽 카드는 텍스쳐 결합 모드를 지원하지 않을지도 모르고 다른 카드는 가능한SetTexture 스테이지의 다른 숫자를 가집니다. 쉐이더 작가는 그 또는 그녀가 지원하고 싶은 카드를 위해서 별개의 SubShaders를 써야 합니다.

    픽셀 쉐이더1.1을 가지는 그래픽 카드는(NVIDIA GeForce 3 and up, ATI Radeon 8500 and up, Intel 9xx) 모든 결합 모드를 지원하고 적어도 4개의 가능한 스테이지를 가집니다. 다음의 테이블은 하드웨어 지원을 요약하고 있습니다:

    Card Stage count Combiner modes not supported
    NVIDIA GeForce 3/4Ti and up 4 Windows 위의 OpenGL에서 src1*src2-src3가 지원되지 않습니다
    NVIDIA TNT2, GeForce 256, GeForce 2, GeForce 4MX 2 Windows 위의 OpenGL에서 src1*src2-src3가 지원되지 않습니다
    ATI Radeon 9500 and up 4-8 OpenGL에서 8, D3D9에서 4
    ATI Radeon 8500-9250 4-6 OpenGL에서 6, D3D9에서 4
    ATI Radeon 7500 3
    ATI Rage 2 src1*src2+src3
    src1*src2+-src3
    src1*src2-src3

    Examples

    Alpha Blending Two Textures

    이 작은 예들은 두 개의 텍스쳐를 취합니다. 첫째로 그것은 _MainTex를 위하기 위해서 첫 번째 결합을 세팅하고 나서 _BlendTex의RGB 색상에서 바래지게 하기 위한 _BlendTex의 알파 채널을 사용합니다.

    Shader "Examples/2 Alpha Blended Textures" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
        }
        SubShader {
            Pass {
                // Apply base texture
                SetTexture [_MainTex] {
                    combine texture
                }
                // Blend in the alpha texture using the lerp operator
                SetTexture [_BlendTex] {
                    combine texture lerp (texture) previous
                }
            }
        }
    } 

    Alpha Controlled Self-illumination

    이 쉐이더는 조명이 어디에 적용되는지를 결정하기 위해서 _MainTex의 알파 컴포넌트를 사용합니다. 그것은 두 개의 스테이지들로 텍스쳐를 적용하는 것에 의해 이것을 합니다; 첫 번째 스테이지에서 텍스쳐의 알파 값은 꼭지점 색상과 온전한 하얀색 사이에서 혼합하기 위해서 사용됩니다. 두 번째 스테이지에서 텍스쳐의RGB 값은 곱해집니다.

    Shader "Examples/Self-Illumination" {
        Properties {
            _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
        }
        SubShader {
            Pass {
                // Set up basic white vertex lighting
                Material {
                    Diffuse (1,1,1,1)
                    Ambient (1,1,1,1)
                }
                Lighting On
    
                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    constantColor (1,1,1,1)
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    } 

    우리는 여기서 무료로 어떤 것들을 할 수 있브니다, 그러나 온전하 하얀색과 혼합하는 대신에 우리는 자가 조명 색상을 더하고 그것에 혼합합니다. 속성으로부터 텍스쳐 블렌딩으로 SolidColor을 얻기 위한 ConstantColor의 사용을 참고하시기 바랍니다.

    Shader "Examples/Self-Illumination 2" {
        Properties {
            _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
            _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
        }
        SubShader {
            Pass {
                // Set up basic white vertex lighting
                Material {
                    Diffuse (1,1,1,1)
                    Ambient (1,1,1,1)
                }
                Lighting On
    
                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    // Pull the color property into this blender
                    constantColor [_IlluminCol]
                    // And use the texture's alpha to blend between it and
                    // vertex color
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    } 

    그리고 마지막으로 우리는 정점 조명의 모든 정점 조명의 속성을 취하고 그것들을 줄입니다:

    Shader "Examples/Self-Illumination 3" {
        Properties {
            _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
            _Color ("Main Color", Color) = (1,1,1,0)
            _SpecColor ("Spec Color", Color) = (1,1,1,1)
            _Emission ("Emmisive Color", Color) = (0,0,0,0)
            _Shininess ("Shininess", Range (0.01, 1)) = 0.7
            _MainTex ("Base (RGB)", 2D) = "white" {}
        }
    
        SubShader {
            Pass {
                // Set up basic vertex lighting
                Material {
                    Diffuse [_Color]
                    Ambient [_Color]
                    Shininess [_Shininess]
                    Specular [_SpecColor]
                    Emission [_Emission]
                }
                Lighting On
    
                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    constantColor [_IlluminCol]
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    } 

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    AlphaTest  (0) 2012.07.18
    CullAndDepth  (0) 2012.07.18
    Pass Tags  (0) 2012.07.17
    Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
    Performance Tips when Writing Shaders  (0) 2012.07.12
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Pass Tags

    패스는 그들이 렌더링 엔진에 렌더되기를 기대할 때와 어떻게 되는지를 말해주기 위해 태그를 사용합니다.

    Syntax

    :Value1을 가지는 TagName1를 지정하고 Value2를 가지는TagName2를 지정합니다. 사용자는 사용자가 좋아하는 것만큼 많은 태그를 가질 수 있습니다.

    Details

    태그는 기본적으로 키값 쌍들입니다. Pass 내부에서 태그는 이 패스가 조명 파이프라인(주변색, 정점 조명, 픽셀 조명 등.)에서 가지는 역할들과 다른 선택사항들을 조절하기 위해 사용됩니다.

    LightMode tag

    LightMode 태그는 조명 파이프라인에서 패스의 역할을 정의합니다. 자세한 내용을 위해서 render pipeline를 참고하시기 바랍니다. 이러한 태그는 수동적으로 거의 사용되지 않습니다; 조명과 상호작용할 필요가 있는 쉐이더는Surface Shaders로서 쓰여지고 그 후에 모든 디테일들이 처리됩니다.

    LightMode 태그를 위한 가능한 값:

    • Always: 항상 렌더됩니다; 조명이 적용되지 않습니다.
    • ForwardBase: Forward rendering에서 사용됩니다, 주변의 주요한 방향성있는 조명과vertex/SH 조명이 적용됩니다.
    • ForwardAdd: Forward rendering에서 사용됩니다; 첨가되는 픽셀당 조명이 적용됩니다, 조명당 한 번의 패스.
    • PrepassBase: Deferred Lighting에서 사용됩니다, normals & specular 대표자를 렌더합니다.
    • PrepassFinal: Deferred Lighting에서 사용됩니다, 텍스쳐, 조명 그리고 방사를 결합해서 마지막 색상을 렌더합니다.
    • Vertex: 물체가 조명에 매핑되지 않을 때 Vertex Lit rendering에서 사용됩니다; 모든 정점 조명이 적용됩니다.
    • VertexLMRGBM: 물체가 조명에 매핑되지 않을 때 Vertex Lit rendering 에서 사용됩니다; lightmap이 RGBM으로 인코딩되는 플랫폼.
    • VertexLM: 물체가 조명에 매핑되지 않을 때 Vertex Lit rendering 에서 사용됩니다; lightmap이double-LDR으로 인코딩되는 플랫폼 (일반적으로 모바일 플랫폼 & 오래된 데스크탑 GPUs).
    • ShadowCaster: 그림자 캐스터로 물체를 렌더합니다.
    • ShadowCollector: Forward 렌더링 경로를 위해서 스크린 공간 버퍼로 물체의 그림자를 모읍니다.

    RequireOptions tag

    패스는 그것이 외부 상태를 충족할 때만 그려져야 한다는 것을 나타낼 수 있습니다. 이것은 RequireOptions을 사용해서 행해지고 그것의 값은 공간으로 분리된 선택사항의 스트링입니다. 현재적으로 Unity에서 지원되는 선택사항은 다음과 같습니다.

    • SoftVegetation: Soft Vegetation 이 Quality Settings에 오직 있다면 이 패스를 렌더합니다.

    See Also

    SubShaders는 주어진 태그가 주어질 수 있습니다, SubShader Tags를 살펴보시기 바랍니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    CullAndDepth  (0) 2012.07.18
    SetTexture  (1) 2012.07.17
    Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
    Performance Tips when Writing Shaders  (0) 2012.07.12
    Writing vertex and fragment shaders  (0) 2012.07.12
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Color, Material, Lighting

    재질과 조명 파라미터는 내장된 정점 조명을 조절하기 위해 사용됩니다. 정점 조명은 각 꼭지점을 위해서 계산되는 기본적인Direct3D/OpenGL 조명 모델입니다. 조명은 켜집니다. 조명은 Material, ColorMaterial 그리고 SeparateSpecular들에 의해 영향을 받습니다.

    픽셀당 조명은 보통 사용자 정의 vertex/fragment 프로그램과 함께 구현됩니다. 이것들을 위해서 사용자는 여기에 설명된 어떠한 명령도 사용하지 않고 대신 사용자가 모든 조명, 텍스쳐 그리고 다른 것들을 스스로 하는 곳에서 사용자의 자신만의 vertex and fragment programs를 정의합니다.

    꼭지점 컬러링 & 조명은 어떠한 렌더된 기하학을 위해 계산되어진 첫 번째 효과입니다. 그것은 꼭지점 레벨에서 작동하고 텍스쳐가 적용되기 전에 사용된 기본 색상을 계산합니다.

    Syntax

    최고 레벨 명령은 고정 함수 조명을 사용할지 여부 또는 구성 선택 사항들을 조절합니다. 주요 셋업은Material Block 안에 있고 제사한 내용은 아래와 같습니다.

    Color Color
    물체를 단색으로 세팅합니다. 색상은 괄호안의 RGBA 값이거나 또는 사각 괄호안에서 색상 속성 이름입니다.
    Material { Material Block }
    Material block은 물체의 재질적인 소성을 정의하기 위해서 사용됩니다.
    Lighting On | Off
    Material block에서 정의된 세팅이 어떠한 효과를 가지기 위해서 사용자는 Lighting On 명령을 가지고 조명을 활성화해야 합니다. 조명이 꺼지면 대신 색상이 Color 명령어로 부터 직접적으로 취해집니다.
    SeparateSpecular On | Off
    이 명령은 쉐이더의 패스의 끝에 추가될 반사적인 조명을 만들고 반사적인 조명은 텍스쳐링에 영향을 받지 않습니다. Lighting On이 사용될 때의 효과만을 가집니다.

    :ColorMaterial AmbientAndDiffuse | 재질에서 세팅된 색상 대신에 사용되는 색상을 만듭니다. AmbientAndDiffuse는 재질의 Ambient와Diffuse값을 대체합니다; 발산은 재질의 발산 값을 대체합니다.

    Material Block

    이것은 재질이 조명에 어떻게 반응하는지에 대한 세팅을 포함합니다. 이러한 속성들 중 어떠한 것도 검정을 기본 세팅으로 하는 경우에 남겨지지 않을 수 있습니다 (즉. 효과가 없습니다).

    Diffuse Color
    확산 색상 컴포넌트. 이것은 물체의 기본 색상입니다.
    Ambient Color
    주명의 색상 컴포넌트. 이것은 class-RenderSettings에 세팅된 주변 조명 세팅에 의해 그것이 부딪힐 때 물체가 가지는 색상을 의미합니다..
    Specular Color
    물체의 반적인 하이라이트 색상.
    Shininess Number
    조명의 날카로움을 0과 1 사이 값으로 표현. 0에서 사용자는 퍼져있는 조명처럼 보이는 커다란 하이라이트를 얻을 것이고 0에서는 아주 작은 얇은 자국을 얻습니다.
    Emission Color
    어떠한 조명에서도 부딪히지 않을 때 물체의 색상.

    조명에 부딪히는 물체의 전체 새상은 다음과 같습니다:

    Ambient * RenderSettings ambient setting + (Light Color * Diffuse + Light Color * Specular) + Emission

    방정식의 조명 부분은 (괄호 안에) 물체에 부딪히는 모든 조명에 대해서 반복됩니다.

    일반적으로 사용자는Diffuse와Ambient의 색상을 같도록 유지하기를 원합니다 (모든 내장 Unity 쉐이더들도 이것을 합니다).

    Examples

    항상 물체를 순수 빨강색으로 헨더합니다:

    Shader "Solid Red" {
        SubShader {
            Pass { Color (1,0,0,0) }
        }
    } 

    물체를 하얀색으로 칠하는 그리고 정점 조명을 적용하는 기본 쉐이더:

    Shader "VertexLit White" {
        SubShader {
            Pass {
                Material {
                    Diffuse (1,1,1,1)
                    Ambient (1,1,1,1)
                }
                Lighting On
            }
        }
    } 

    Material Inspector에서 visible 속성으로 재질의 색상을 추가하는 확장된 버전입니다:

    Shader "VertexLit Simple" {
        Properties {
            _Color ("Main Color", COLOR) = (1,1,1,1)
        }
        SubShader {
            Pass {
                Material {
                    Diffuse [_Color]
                    Ambient [_Color]
                }
                Lighting On
            }
        }
    } 

    마지막으로 완전히 깃털이 난 정점 조명 쉐이더 (SetTexture 레퍼런스 페이지를 참고해 주세요):

    Shader "VertexLit" {
        Properties {
            _Color ("Main Color", Color) = (1,1,1,0)
            _SpecColor ("Spec Color", Color) = (1,1,1,1)
            _Emission ("Emmisive Color", Color) = (0,0,0,0)
            _Shininess ("Shininess", Range (0.01, 1)) = 0.7
            _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader {
            Pass {
                Material {
                    Diffuse [_Color]
                    Ambient [_Color]
                    Shininess [_Shininess]
                    Specular [_SpecColor]
                    Emission [_Emission]
                }
                Lighting On
                SeparateSpecular On
                SetTexture [_MainTex] {
                    Combine texture * primary DOUBLE, texture * primary
                }
            }
        }
    } 

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    SetTexture  (1) 2012.07.17
    Pass Tags  (0) 2012.07.17
    Performance Tips when Writing Shaders  (0) 2012.07.12
    Writing vertex and fragment shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    Posted by 프리랜서 디자이너

    Performance Tips when Writing Shaders

    Use Common sense ;)

    사용자가 필요한 것들만 계산합니다; 실제로 필요하지 않은 것들은 제거될 수 있습니다. 예를 들어 재질당 색상을 지원하는 것은 쉐이더를 좀 더 융통성있게 만들기에 좋으나 만약 사용자가 항상 그 색을 흰 색으로 세팅한다면 그것은 스크린에 그려지는 꼭지점 또는 픽셀을 위해서 수행되어지는 쓸모없는 계산이 됩니다.

    또 다른 기억해야하는 한 가지는 계산의 빈도수 입니다. 보통 꼭지점들이 있는 것(정점 쉐이더 실행)보다 더 많은 픽셀이 그려집니다 (그러므로 그들의 픽셀 쉐이더가 실행됩니다); 그리고 그려지는 물체보다 더 많은 꼭지점들이. 그래서 일반적으로 사용자가 할 수 있다면 픽셀 쉐이더를 정점 쉐이더로 계산을 움직이고 또는 쉐이더들로 완전히 움직이고 스크립트로부터 값을 한 번에 세팅합니다.

    Less Generic Surface Shaders

    Surface Shaders는 조명과 상호작용하는 쉐이더를 쓰기 위해 훌륭합니다. 그러나 그들의 기본적인 옵션은 일반적인 케이스를 위한 것입니다. 많은 경우에 사용자는 쉐이더들을 더욱 빠르게 또는 적어도 더 적게 실행하기 위해서 그들을 조절할 수 있습니다:

    • 뷰 디렉션을 사용하는 쉐이더를 위한 approxview 디렉티브는 뷰 디렉션을 픽셀당 하는 것 대신에 일반화된 정점당 하는 것으로 만들 것입니다. 이것은 대략적이나 자주 충분히 좋습니다.
    • Specular 쉐이더 타입을 위한 halfasview은 훨씬 빠릅니다. Half-vector(조명 방향과 뷰 벡터 사이의 중간)는 정점당 계산될 것이고 일반화될 것입니다. 그리고lighting function은 뷰 벡터 대신에 하나의 파라미터로서half-vector를 이미 받을 것입니다.
    • noforwardadd은 Forward 렌더링에서 하나의 쉐이더를 오직 하나의 방향성 있는 조명만을 지원하도록 만들 것입니다. 나머지 조명은 여전히 정점당 조명 또는 주변의 하모니로서 영향을 가질 수 있습니다. 이것은 심지어 다수의 조명이 있음에도 쉐이더를 더 적게 만들고 그것인 항상 한 번의 패스에서 렌더된다는 것을 확인하기에 좋습니다.
    • noambient은 주변의 조명과 쉐이더 위의 조화를 이루는 조명을 비활성화 할 것입니다. 이것은 약간 더 빠를 수 있습니다.

    Precision of computations

    Cg/HLSL에서 쉐이더를 쓸 때, 3 가지의 기본 숫자 타입이 있습니다: float, half 그리고 fixed (vector & 그들의 matrix 변형 뿐만 아니라, 예. half3와float4x4):

    • float: 고도로 정밀한 부동 소수점. 일반적으로32 비트, 보통의 프로그래밍 언어에서 float 타입처럼.
    • half: 중간 정도로 정밀한 부동 소수점. 일반적으로16 비트, -60000 과 +60000 사이이고 3.3 정확도의 자릿수.
    • fixed: 낮은 정도로 정밀한 부동 소수점. 일반적으로11 비트, -2.0과 +2.0사이이고1/256정확도.

    가능한 가장 낮은 정확도를 사용하세요; 이것은iOS 그리고Android같은 모바일 플랫폼에서는 특별히 중요합니다. 중요한 규칙입니다:

    • 색상과 유닛 벡터를 위해서 fixed를 사용하세요
    • 다른 것들을 위해서 만약 범위와 정확도가 좋다면 half를 사용하시고 그렇지 않다면 float를 사용하세요.

    모바일 플랫폼에서 키는 프래그먼트 쉐이더에서 낮은 정확도에서 가능한한 오래 머무르도록 확실시 하는 것입니다. 대부분의GPUs에서 스위즐을 낮은 정확도(fixed/lowp)타입으로 적용하는 것은 비용이 듭니다; fixed/lowp와 더 높은 정확도 타입으로 바꾸는 것도 역시 꽤 비용이 많이 듭니다.

    Alpha Testing

    고정된 함수 AlphaTest 또는 프로그래밍 할 수 있는 동일한clip()은 다른 플랫폼에서 다른 성능적인 특징들을 가집니다:

    • 일반적으로 그것을 대부분의 플랫폼에서 완전히 투명한 픽셀을 잘라내기 위해서 사용하는 것은 작은 장점입니다.
    • 그러나iOS 에서 발견된 PowerVR GPUs와 다른 Android 디바이스들에서 알파 테스팅은 비용이 많이 듭니다. 그것을 성능 최적화로서 사용하지 마시기 바랍니다. 그것은 더욱 느리게 할 것입니다.

    Color Mask

    플랫폼들에서 (주로iOS와Android 디바이스에서 발견되는 모바일GPUs) 어떤 채널(e.g. ColorMask RGB)들을 남겨두기 위해 ColorMask를 사용하는 것은 비용이 많이 들 수 있으므로 오직 그것을 정말로 필요할 때만 사용하시기 바랍니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Pass Tags  (0) 2012.07.17
    Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
    Writing vertex and fragment shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    Fallback  (0) 2012.05.21
    Posted by 프리랜서 디자이너

    Writing vertex and fragment shaders

    ShaderLab 쉐이더는 단순히 "hardware shaders"보다 더 많이 둘러싸고 있습니다. 그들은 많은 것들을 합니다. 그들은 제재 인스펙터에서 보여지는 속성들을 설명하고 다른 그래픽 하드웨어를 위해 다수의 쉐이더 구현을 포함합니다. 그리고 정해진 함수 하드웨어 상태를 구성합니다. 꼭지점 그리고 프래그먼트 프로그램처럼 실제 프로그램이 가능한 쉐이더는 전체ShaderLab의 쉐이더 컨셉의 단지 한 부분일 뿐입니다. 기본적인 지시사항을 위해서 shader tutorial를 살펴보시기 바랍니다. 우리는 낮은 레벨의 하드웨어 shader programs를 부를 것입니다.

    사용자가 조명과 상호작용하는 쉐이더를 쓰기를 원한다면 Surface Shaders 서류를 살펴보시기 바랍니다. 이 페이지의 나머지 부분은Unity조명과 상호작용하지 않는 쉐이더를 가정할 것입니다 (예. 특수 효과, Image Effects 등.)

    쉐이더 프로그램은 쉐이더 텍스트에 미리보기를 끼워넣음으로서 Pass 명령안에 어딘가에 Cg / HLSL 언어로 쓰여집니다. 그들은 이것처럼 보입니다:

      Pass {
          // ... the usual pass state setup ...
    
          CGPROGRAM
          // compilation directives for this snippet, e.g.:
          #pragma vertex vert
          #pragma fragment frag
    
          // the Cg code itself
    
          ENDCG
          // ... the rest of pass setup ...
      }
    

    Cg snippets

    Cg 프로그램 미리보기는 CGPROGRAMENDCG사이에서 쓰여집니다.

    미리보기의 시작에서 컴파일 지시어는 #pragma 문장으로 주어질 수 있습니다. Unity에 의해 인식되어지는 지시어는 다음과 같습니다:

    • #pragma vertex name - 함수 name가 꼭지점 프로그램임을 나타냅니다.
    • #pragma fragment name - 함수 name가 프래그멘트 프로그램임을 나타냅니다.
    • #pragma fragmentoption option - 컴파일된OpenGL 프래그먼트 프로그램에 option을 추가합니다. 사용가능한 옵션의 리스트를 위해서 ARB fragment program 상세 내용을 살펴보시기 바랍니다. 이 지시어는 꼭지점 프로그램이나OpenGL이 아닌 타겟으로 컴파일된 프로그램에서는 영향을 가지지 않습니다.
    • #pragma target name - 어떤 쉐이더 타겟이 컴파일이 될지를 나타냅니다. 자세한 내용을 위해서 shader targets를 살펴보시기 바랍니다.
    • #pragma only_renderers space separated names - 주어진 렌더러만을 위한 쉐이더를 컴파일합니다. 기본적으로 쉐이더는 모든 렌더러를 위해서 컴파일 됩니다. 자세한 내용을 위해서 renderers를 살펴보시기 바랍니다.
    • #pragma exclude_renderers space separated names - 주어진 렌더러들을 위해서 쉐이더를 컴파일하지 않습니다. 기본적으로 쉐이더는 모든 렌더러를 위해서 컴파일 됩니다. 자세한 내용을 위해서 renderers를 살펴보시기 바랍니다.

    각각 미리보기는 꼭지점 프로그램이나 프래그먼트 프로그램 또는 둘 다를 포함해야만 합니다. 그러므로 #pragma vertex 또는 #pragma fragment 지시어가 또는 둘 다 필요되어 집니다.

    Shader targets

    기본적으로 Unity는 동등한 쉐이더 모델 1.1로 꼭지점 프로그램을 컴파일하고 쉐이더 모델 2.0으로 프래그먼트 프로그램을 컴파일 합니다. #pragma target을 사용하는 것은 쉐이더가 다른 레벨로 컴파일 되는 것을 허락합니다. 현재 이러한 타겟들이 지원됩니다:

    • #pragma target default - 기본 타겟으로 컴파일:
      • Direct3D 9에서 Vertex shader 1.1 그리고 pixel shader 2.0.
      • 128 인스트럭션 제한을 가진 ARB_vertex_program 그리고 96 인스트럭션 제한을 가진 ARB_fragment_program (32 텍스쳐+ 64 산수), 16 일시적인 레지스터와 4 텍스쳐 우회.
    • #pragma target 3.0 - 쉐이더 모델 3.0으로 컴파일:
      • Direct3D 9에서 Vertex shader 3.0 그리고 pixel shader 3.0.
      • 인스트럭션 제한을 가지지 않는 ARB_vertex_program 그리고1024인스트럭션 제한을 가진ARB_fragment_program (512텍스쳐+ 512산수), 32일시적인 레지스터와4 텍스쳐 우회. #pragma profileoption directive 지시어를 사용해서 이러한 제한을 덮어쓰는 것은 가능합니다. 예 #pragma profileoption MaxTexIndirections=256은 텍스쳐 우회 제한을 256으로 올립니다. derivative 지시사항과 같은 몇몇 셰이더 모델 3.0 기능들은 ARB_vertex_program/ARB_fragment_program 에 의해 지원되지 않습니다. 당신은 제한이 덜한 GLSL로 대신 번역하기 위해 #pragma glsl를 사용할 수 있습니다. 3.0 타겟으로 컴파일 할 때 꼭지점과 프래그먼트 프로그램 둘 모두 존재해야 합니다.

    Renderers

    Unity는 몇몇의 렌더링APIs를 지원하고 (예. Direct3D 9 와 OpenGL), 기본적으로 모든 쉐이더 프로그램은 지원되는 렌더러를 위해서 컴파일 되어 집니다. 사용자는 어떤 렌더러가 컴파일되는지 #pragma only_renderers 또는 #pragma exclude_renderers 을 사용해서 지정할 수 있습니다. 이것은 사용자가 오직Mac OS X(Direct3D은 없습니다)만을 타겟으로 할 것이라는 것을 안다면 또는 오직Windows만을(Unity가 D3D을 기본적으로 정하는 곳에서) 또는 어떤 특별한 쉐이더만이 오직 가능하다면 매우 유용합니다. 현재 지원되는 렌더러의 이름은 다음과 같습니다:

    • d3d9 - Direct3D 9.
    • opengl - OpenGL.
    • gles - OpenGL ES 2.0.
    • xbox360 - Xbox 360.
    • ps3 - PlayStation 3.
    • flash - Flash.

    예를 들어 이 라인은 쉐이더를D3D9 모드로 오직 컴파일 할 것입니다:

      #pragma only_renderers d3d9
    

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
    Performance Tips when Writing Shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    Fallback  (0) 2012.05.21
    RenderTech-VertexLit  (0) 2012.05.17
    Posted by 프리랜서 디자이너

    ShaderLab syntax: Blending

    Blending은 투명한 물체를 만들기 위해 사용됩니다.

    그래픽들이 표현될 때 모든 쉐이더가 실행되고 모든 텍스쳐가 적용되어진 후에 픽셀은 스크린에 쓰여집니다. 그들이 이미 있는 것과 어떻게 결합되는지는Blend 명령에 의해 조절됩니다.

    Syntax

    Blend Off
    블렌딩 기능 취소
    Blend SrcFactor DstFactor
    블렌딩을 구성 & 활성화. 생성된 색상은 SrcFactor를 곱합니다. 스크린에 이미 있던 색상은 DstFactor 에 의해 곱해지고 두 개는 함께 더해집니다.

    Properties

    모든 다음의 속성들은SrcFactor와DstFactor 둘 다를 위해서 유효합니다. Source 는 계산되어지는 색상을 의미하고 Destination 는 이미 스크린에 있는 색상을 의미합니다.

    One

    1의 값 – 소스 또는 데스티네이션 색상이 온전히 오게 합니다.

     

    Zero

    0의 값 – 소스 또는데스티네이션 값을 삭제하게 합니다.

     

    SrcColor

    이 스테이지의 값은 소스 색상 값에 의해 곱해집니다.

     

    SrcAlpha

    이 스테이지의 값은 소스 알파 값에 의해 곱해집니다.

     

    DstColor

    이 스테이지의 값은 프레임 버퍼 소스 색상 값에 의해 곱해집니다.

     

    DstAlpha

    이 스테이지의 값은 프레임 버퍼 소스 알파 값에 의해 곱해집니다.

     

    OneMinusSrcColor

    이 스테이지의 값은 (1 – 소스 색상)에 의해 곱해집니다.

     

    OneMinusSrcAlpha

    이 스테이지의 값은 (1 – 소스 알파)에 의해 곱해집니다.

     

    OneMinusDstColor

    이 스테이지의 값은 (1 – 데스티네이션 색상)에 의해 곱해집니다.

     

    OneMinusDstAlpha

    이 스테이지의 값은 (1 – 데스티네이션 알파)에 의해 곱해집니다.

     

    Details

    아래는 가장 흔한 블렌드 타입입니다:

    Blend SrcAlpha OneMinusSrcAlpha     // Alpha blending
    Blend One One                       // Additive
    Blend One OneMinusDstColor          // Soft Additive
    Blend DstColor Zero                 // Multiplicative
    Blend DstColor SrcColor             // 2x Multiplicative
    

    Example

    이것은 스크린에 이미 무엇이 있던 하나의 텍스쳐를 추가하는 쉐이더의 작은 예입니다:

    Shader "Simple Additive" {
        Properties {
            _MainTex ("Texture to blend", 2D) = "black" {}
        }
        SubShader {
            Tags { "Queue" = "Transparent" }
            Pass {
                Blend One One
                SetTexture [_MainTex] { combine texture }
            }
        }
    }

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Performance Tips when Writing Shaders  (0) 2012.07.12
    Writing vertex and fragment shaders  (0) 2012.07.12
    Fallback  (0) 2012.05.21
    RenderTech-VertexLit  (0) 2012.05.17
    RenderTech-ForwardRendering  (0) 2012.05.17
    Posted by 프리랜서 디자이너

    http://www.unitykoreawiki.com/index.php?n=KrMain.SL-Fallback


    ShaderLab syntax: Fallback

    모든Subshaders후에 Fallback이 정의될 수 있습니다. 그것은 기본적으로 어떠한 서브 쉐이더를 하드웨어 위에서 실행될 수 없으면 또다른 쉐이더로부터의 그것들을 사용하는 것을 시도해보라고 말합니다.

    Syntax

    Fallback "name"
    주어진 이름으로 쉐이더에 대체.
    Fallback Off
    심지어 어떠한 서브 쉐이더가 하드웨어에서 실행될 수 없음에도 명확하게 어떠한 대체도 없고 어떠한 주의 메세지도 프린트되어 지지말아야 한다고 나타냅니다.

    Details

    대체를 나타내는 서술은 마치 그 다른 쉐이더로부터 모든 서브 쉐이더가 그것의 위치에 삽입되어지는 것처럼 같은 효과를 가집니다.

    Example

    Shader "example" {
        // properties and subshaders here...
        Fallback "otherexample"
    } 

    결론은 하드웨어 문제로 작성된 셰이더를 돌릴수 없을때 이것을 사용하라~~ 이런것이군먼

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Writing vertex and fragment shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    RenderTech-VertexLit  (0) 2012.05.17
    RenderTech-ForwardRendering  (0) 2012.05.17
    RenderTech-DeferredLighting  (0) 2012.05.17
    Posted by 프리랜서 디자이너

    http://unitykoreawiki.com/index.php?n=KrMain.RenderTech-VertexLit

     

     

    Vertex Lit Rendering Path Details

    이 페이지는 Vertex Lit rendering path의 자세한 내용을 다룹니다.

    Vertex Lit 경로는 일반적으로 오브젝트 꼭지점에서 계산된 모든 빛으로부터의 조명과 함께 하나의 패스에서 각각의 오브젝트들을 그립니다.

    패스를 그리는 가장 빠른 방법이며 가장 폭넓은 하드웨어 지원을 가집니다 (그러나 그것은 콘솔에서 작동하지 않음을 명심하십시오).

    모든 조명이 꼭지점 레벨에서 계산되기 때문에 이 렌더링 경로는 픽셀당 효과의 대부분을 지원하지 않습니다: 그림자, 일반 매핑, light cookies, 고도로 구체화된 반사 하이라트는 지원되지 않습니다.

     

     

    여기서 일반 맵핑은 노멀맵을 말하는거임 ㅡㅡ;;

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Writing vertex and fragment shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    Fallback  (0) 2012.05.21
    RenderTech-ForwardRendering  (0) 2012.05.17
    RenderTech-DeferredLighting  (0) 2012.05.17
    Posted by 프리랜서 디자이너

    http://unitykoreawiki.com/index.php?n=KrMain.RenderTech-ForwardRendering

     

    포워드 렌더링 패스 상세사항

    이 페이지는 Forward rendering path에 대한 자세한 서술합니다.

    하나 혹은 여러 개의 패스의 각 포워드 렌더링 패스는 오브젝트에 영향을 주는 라이트에 달려 있습니다. 라이트들은 또한 포워드 렌더링에 의해 그들의 설정과 강도에 따라 다르게 다루어지고, 좌우되지요.

    구현 상세사항

    포워드 렌더링에서, 각 오브젝트에 적용되는 가장 밝은 라이트들은 퍼 픽셀 라이트 모드로 온전하게 렌더링 됩니다. 그리고, 4개까지의 라이트들은 버텍스 당 라이트로 계산됩니다. 다른 라이트들은 Spherical Harmonics (SH) 로 계산됩니다. 이것은 많이 빠르지만 근사값에 불과합니다. 라이트가 픽셀당 라이트인지 아닌지는 다음 사항들에 의합니다:

    • Render Mode가 Not Important로 설정된 라이트는 항상 버텍스당(per-vertex)이거나 SH 입니다.
    • 가장 밝은 방향성 라이트는 언제나 픽셀 당 라이트 입니다.
    • Render Mode가 Important로 설정된 라이트는 언제나 픽셀 당 (per-pixel) 입니다.
    • 만일 위 결과가 현재 Pixel Light Count Quality Setting보다 덜한 라이트라면, 밝기를 감소하기 위해서 더 많은 라이트가 픽셀 당으로 랜더링 됩니다.

    각 오브젝트의 랜더링은 다음과 같이 발생합니다:

    • 기본패스는 한 개의 픽셀 당 방향성 라이트와 모든 버텍스당/SH 라이트에 적용합니다.
    • 다른 픽셀 당 라이트는 추가적인 패스에, 각 라이트 당 한 패스로 랜더링 됩니다.

    예를 들어, 만약 어떤 오브젝트가 여러 개의 라이트에 영향을 받는다면 (아래 그림의 공이 A에서 H 까지의 라이트 영향을 받으면):

    A 부터 H 까지의 각 라이트는 같은 색과 강도를 가지고 있다고 합시다. 이들 모두는 자동 렌더링 모드라고 한다면, 그래서 이들은 이 오브젝트를 위해 정확하게 이 순서로 정렬 될 것입니다. 가장 밝은 라이트들은 픽셀당 라이트 모드로 렌더링 됩니다. (A에서 D) 그리고 최대 4개까지 버텍스당 라이트 모드로 (D에서 G) , 그리고 최종적으로 나머지 라이트는 SH가 됩니다. (G에서 H 까지):

    라이트 그룹은 겹쳐집니다; 예를 들어 마지막 픽셀 당 라이트는 버텍스 당 라이트 모드와 섞이고 그래서 오브젝트와 라이트가 움직임에 따라 더 적은 "light popping"이 생깁니다.

    기본 패스

    기본 패스는 하나의 픽셀 당 방향성 라이트와 모든 SH 라이트와 함께 오브젝트를 랜더링 합니다. 이 패스는 또한 쉐이더에서 모든 라이트 맵, 은은하고 방사적 라이팅을 추가합니다. 이 패스에서 랜더링 된 방향성 라이팅은 Shadows을 가질 수 있습니다.

    추가 패스들

    추가 패스들은 해당 오브젝트에 추가되는 각 픽셀당 라이트를 위해 랜더링 됩니다. 이러한 패스들의 라이트들은 쉐도우를 가질 수 없습니다 (그래서 결과적으로, Forward Rendering은 쉐도우를 가진 하나의 방향성 라이트를 지원합니다).

    성능 고려사항

    SH (Spherical Harmonics, 구면 조화 함수)라이트는 매우 빨리 랜더링 될 수 있습니다. 그들은 CPU에 아주 작은 비용만 부과하며 GPU에 적용은 actually free입니다(그것은, 기본 패스는 항상 SH 라이팅을 연산합니다; 그러나 SH 라이트는 작동하는 방식 때문에 그 비용은 얼마나 많은 SH 라이트가 있느냐에 상관없이 항성 정확하게 동일합니다).

    SH 라이트의 단점은:

    • 그들이 오브젝트의 픽셀이 아닌 버텍스에서 연산됩니다. 그것은 라이트 쿠키나 노멀 맵을 지원하지 않는 다는 것을 의미합니다.
    • SH라이팅은 매우 낮은 주파수를 가지고 있습니다. SH 라이트를 가지고는 선명한 라이트 전환을 할 수 없습니다. 그들은 또한 분산 라이팅 (반사성 하이라이트에는 너무 낮은 주파수)에만 영향을 미칩니다.
    • SH 라이팅은 지역적이지 않습니다; 점이건 집중조명이건 일부 표면에 근접한 SH 라이트는 "look wrong" 것 입니다.

    요약하면, SH 라이팅은 대부분 작은 동적 오브젝트에 사용하기에 충분합니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Writing vertex and fragment shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    Fallback  (0) 2012.05.21
    RenderTech-VertexLit  (0) 2012.05.17
    RenderTech-DeferredLighting  (0) 2012.05.17
    Posted by 프리랜서 디자이너

    http://unitykoreawiki.com/index.php?n=KrMain.RenderTech-DeferredLighting

    지연된(Deferred) 라이트 랜더링 경로의 상세사항

    이 페이지는 Deferred Lighting rendering path의 상세사항을 설명합니다. 지연된 라이팅(Deferred Lighting)에 대한 기술 적인 개요는 Deferred Lighting Approaches article을 참조하십시오.

    Deferred Lighting은 대부분의 라이팅과 쉐이드 충실도의 랜더링 경로입니다:

    • 얼마나 많은 라이트가 오브젝트에 영향을 끼칠 수 있는지에 대한 제한은 없습니다.
    • 모든 라이트는 픽셀 당 평가됩니다. 이것은 그것이 노멀 맵과 어떻게 적절하게 상호작용 할 수 할 수 있는지 등을 의미합니다.
    • 모든 라이트는 쿠키를 가질 수 있습니다.
    • 모든 라이트는 쉐도우를 가질 수 있습니다.

    지연된 라이팅의 이점은:

    • 라이팅 비용은 스크린 상의 라이트 크기에 비례합니다. 이 라이트가 몇 개의 오브젝트 위에서 빛나는 지는 중요하지 않습니다. 작은 라이트 = 저렴 입니다!

    일관성. 모든 라이트를 위한 라이팅은 픽셀 당 계산됩니다; 커다란 triangles을 분해하는 라이팅 연산은 없습니다.

    단점들:

    • 엘리어싱 제거 기능 없음.
    • 지연된 라이팅은 반 투명 오브젝트는 처리할 수 없습니다. 이들은 Forward Rendering을 사용하여 랜더링 됩니다.
    • 제한 된 라이팅 모델 지원 (Blinn-Phong). 모든 라이팅은 같은 방식으로 연산 됩니다; 다른 오브젝트라도 아주 상이한 라이팅 모델은 가질 수 없습니다.
    • "receive shadows" 플래그를 지원하지 않고 라이트 Culling Masks에 대한 제한적인 지원 제공.

    지연된 라이팅의 요구사항

    • Unity Pro가 필수.
    • Shader Model 3.0 혹은 더 최신 그래픽 카드, Depth 랜더러 텍스처와 양면 스텐실 버퍼 지원. 2004년 이후에 만든 대부분의 그래픽 카드는 이 기능을 지원함: GeForce FX 그리고 더 최신, Radeon X1300 그리고 그 이후, Intel 965 / GMA X3100 그리고 그 이후.
    • 현재 모바일 플랫폼 상에서는 동작하지 않습니다.

    성능 고려사항

    지연된 라이팅에서 실제 라이트의 비용은 해당 라이트가 빛을 내는 픽셀 수에 비례합니다; 그러나 장면의 복잡도와는 관련이 없습니다. 그러므로 작은 점이나 집중 조명은 랜더링 비용이 저렴합니다. 점이나 집중 조명은 전적으로 혹은 부분적으로 GPU에서 오브젝트가 픽셀을 건너뛰는 장면에 의해 가려지므로 더 저렴합니다.

    물론 쉐이드가 있는 라이트는 없는 것보다 값비쌉니다. 지연된 라이팅에서 그림자를 던지는 주체는 각각의 그림자를 드리우는 라이트를 위한 한번 혹은 그 이상 랜더링을 할 필요가 있습니다. 그리고 쉐도우가 적용되는 그 라이팅 쉐이더는 쉐도우가 없는 것보다 더 값비쌉니다.

    구현 시 상세사항

    지연된 라이팅이 사용될 때, 유니티의 랜더링 과정은 다음과 같이 진행됩니다:

    1. 기본 패스: 오브젝트가 랜더링 되며 depth, normals, and specular power을 가진 스크린-공간 버퍼를 만들어냅니다.
    2. 라이팅 패스: 라이팅이 이전 버퍼로부터 연산됩니다. 라이팅은 다른 스크린 공간 버퍼로 연산됩니다.
    3. 최종 패스: 오브젝트가 다시 랜더링 됩니다. 연산된 라이팅을 가지고 와서 색상 텍스처와 합치고 ambient/emissive 라이팅을 추가 합니다.

    지연된 라이팅을 처리 할 수 없는 쉐이더를 가진 오브젝트들은 이 과정을 마치고 RenderTech-ForwardRendering 경로를 사용하여 랜더링 됩니다.

    기본 패스(Base Pass)

    기본 패스는 각 오브젝트를 한번 랜더링 합니다. 뷰 공간의 노멀과 반사 파워(specular power)는 하나의 ARGB32 Render Texture으로 랜더링 됩니다 (RGB 채널에서 노멀로, A에서 반사 파워로). 만일 플랫폼과 하드웨어가 Z 버퍼를 텍스처로 읽는 것을 지원한다면, 그러면 Depth는 명시적으로 랜더링 되지 않습니다. 만일 Z 버퍼가 텍스처로 접근할 수 없다면, 그 depth는 추가적인 랜더링 패스에서 shader replacement을 사용하여 랜더링 됩니다.

    기본 패스의 결과는 노멀과 반사파워를 가진 장면 콘텐츠와 랜더러 텍스처로 채워진 Z 버퍼입니다.

    라이팅 패스

    라이팅 패스는 depth, normal 그리고 반사파워를 기반으로 라이팅을 연산합니다. 라이팅은 스크린 공간에서 연산되므로, 장면의 복잡도와는 관련이 없습니다. 라이팅 버퍼는 하나의 ARGB32 랜더러 텍스처로 RGB 채널에 분산 라이팅이, A 채널에 흑백 반사 라이팅이 있습니다. 라이팅 값은 대수 인코딩을 사용하여 ARGB32 텍스처에서 일반적으로 가능한 범위보다 더 확장된 동적 범위를 제공하기 위하여 암호화됩니다.

    라이팅 모델은 Blinn-Phong에 고정됩니다.

    카메라의 근접 평면을 지나지 않는 점과 집중 조명은 장면(scene)에 대한 Z buffer test 가 허용된 상태로 3D 형태로 랜더링 됩니다. 이것은 부분적으로 혹은 전적으로 가려진 점이나 집중조명을 랜더링 하기 아주 저렴하게 만들어 줍니다. 근접 평면을 가로지르는 방향성 라이트(Directional lights)와 점/집중조명(Point/Spot lights)은 풀 스크린 쿼즈로써 랜더링 됩니다.

    만일 라이트의 그림자가 허용되면, 그 들 역시 이 패스에서 랜더링 되고 적용됩니다. 쉐도우는 "free"가 아님을 주의하십시오; 그림자 던지기(shadow casters)도 랜더링이 되어야 하고 좀더 복잡한 라이트 쉐이더가 적용되어야 합니다.

    최종 패스

    최종 패스는 최종 랜더링 이미지를 생산합니다. 여기서 모든 오브젝트는 다시 랜더링 됩니다; 쉐이더는 라이팅을 가져오고, 텍스처와 합하여 방사적인 라이팅을 추가합니다.

    라이트맵은 역시 최종 패스에 적용됩니다. 카메라 가까이, 현실세계 라이팅이 사용되고 오직 bake 된 간접 라이팅만 추가 됩니다. 이것은 화면 겹치기(crossfades)로 완전히 bake 된 라이팅으로 카메라에서 멀어집니다.

    'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

    Writing vertex and fragment shaders  (0) 2012.07.12
    Blending  (0) 2012.06.25
    Fallback  (0) 2012.05.21
    RenderTech-VertexLit  (0) 2012.05.17
    RenderTech-ForwardRendering  (0) 2012.05.17
    Posted by 프리랜서 디자이너