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_의 알파 채널을 사용합니다. <file csharp>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 } } } } </file> ====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
            }
        }
    }
} 

역링크