Version: 2018.2
ShaderLab: 레거시 조명
ShaderLab: 레거시 알파 테스트

ShaderLab: 레거시 텍스처 컴바이너

버텍스 조명이 연산된 후 텍스처가 적용됩니다. ShaderLab에서 SetTexture 커맨드를 사용하여 실행됩니다.

참고: 프래그먼트 프로그램이 사용될 때에는 픽셀 연산이 셰이더에 완전히 기술되기 때문에 SetTexture 커맨드 효과가 발생하지 않습니다. 최근에는 SetTexture 커맨드 대신 프로그래밍 가능한 셰이더를 사용하는 것을 권장합니다.

고정 함수 텍스처링은 레거시 컴바이너(combiner) 효과를 실행하기 위한 곳입니다. 패스 하나에 여러 SetTexture 커맨드를 보유할 수 있습니다. 모든 텍스처는 페인팅 프로그램에서 레이어와 같이 순차적으로 적용됩니다. SetTexture 커맨드는 패스 끝에 위치해야 합니다.

구문

SetTexture [TextureName] {Texture Block}

텍스처를 할당합니다. TextureName 은 텍스처 프로퍼티로 정의해야 합니다. 텍스처를 적용하는 방법은 TextureBlock 에 정의됩니다.

텍스처 블록은 텍스트를 적용할 방법을 제어합니다. 텍스처 블록 내에 combineconstantColor 두 커맨드까지 가능합니다.

텍스처 블록 combine 커맨드

combine src1 \* src2: src1과 src2를 곱합니다. 결과는 각 입력값보다 어둡습니다.

combine src1 + src2: src1과 src2를 더합니다. 결과는 각 입력값보다 밝습니다.

combine src1 - src2: src1에서 src2를 뺍니다.

combine src1 lerp (src2) src3: src2의 알파를 사용하여 src1과 src3 사이에 인터폴레이트합니다. 보간은 반대 방향입니다. src1은 알파가 1일 때 사용되며 src3은 알파가 0일 때 사용합니다.

combine src1 \* src2 + src3: src1을 src2의 알파 컴포넌트와 곱하고 src3을 더합니다.

모든 src 프로퍼티는 previous, constant, primary, texture 중 하나일 수 있습니다.

  • Previous는 이전 SetTexture의 결과입니다.
  • Primary바운드인 경우 조명 연산에서 컬러 또는 버텍스 컬러입니다.
  • Texture는 SetTexture에 TextureName 으로 지정된 텍스처 컬러입니다. 위를 참조하십시오.
  • ConstantConstantColor에 지정된 컬러입니다.

모디파이어:

  • 결과 컬러를 2배 또는 4배 더 밝게 만들기 위해 Double 또는 Quad 키워드를 위에 지정된 공식 뒤에 첨부할 수 있습니다.
  • lerp 인자를 제외한 모든 src 프로퍼티는 결과 컬러를 무효로 하기 위해 one -을 선택적으로 앞에 둘 수 있습니다.
  • 모든 src 프로퍼티는 알파 채널만을 취하기 위해 alpha를 뒤에 첨부할 수 있습니다.

텍스처 블록 constantColor 커맨드

ConstantColor 컬러: combine 커맨드에 사용될 수 있는 상수 컬러를 정의합니다.

Unity 5.0에서 제거된 기능

Unity 5.0 버전 이전에서는 텍스처 블록 내에 matrix 커맨드로 텍스처 좌표 트랜스폼을 지원했습니다. 지금 이 기능이 필요한 경우 대신 프로그래밍 가능한 셰이더로 셰이더 재작성을 고려하고 버텍스 셰이더에서 UV 변환을 실행해야 합니다.

이와 유사하게 Unity 5.0은 부호 있는 덧셈 (a+-b), 곱셈 부호 있는 덧셈 (a*b+-c), 곱셈 뺄셈 (a*b-c) 및 내적 (dot3, dot3rgba) 텍스처 결합 모드를 제거했습니다. 필요한 경우 픽셀 셰이더에서 계산해야 합니다.

세부 정보

프래그먼트 프로그램이 존재하기 전에 구형 그래픽 카드는 텍스처에 레이어된 접근을 사용했습니다. 텍스처는 스크린에 작성된 컬러를 수정하여 하나씩 적용됩니다. 각 텍스처에 대해 텍스처는 보통 이전 연산 결과와 결합됩니다. 최근에는 실제 프래그먼트 프로그램 사용을 권장합니다.

각 텍스처 스테이지는 플랫폼에 따라 01 범위에 고정되어 있을 수도 있고 아닐 수도 있습니다. 1.0 이상의 값을 생산할 수 있는 SetTexture 스테이지에 영향을 줄 수 있습니다.

개별 알파 및 컬러 연산

컴바이너 공식은 디폴트로 컬러의 RGB 및 알파 컴포넌트 연산에 사용됩니다. 선택적으로 알파 연산에 특정 공식을 지정할 수 있으며, 예제는 다음과 같습니다.

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

여기에서는 RGB 컬러를 곱하고 알파를 더합니다.

스페큘러 하이라이트

primary 컬러는 디폴트로(조명 연산에서 정의된 것처럼) 디퓨즈, 앰비언트, 스페큘러 컬러의 합입니다. 패스 옵션에서 SeparateSpecular On을 지정하면 스페큘러 컬러는 컴바이너 연산 전보다는 이후에 추가됩니다. 내장된 버텍스 릿 셰이더의 기본 동작입니다.

그래픽스 하드웨어 지원

프래그먼트 셰이더 지원(데스크톱은 “셰이더 모델 2.0”, 모바일은 OpenGL ES 2.0)을 포함한 최신 그래픽 카드는 모든 SetTexture 모드와 최소 4개의 텍스처 스테이지를 지원하며, 대부분 8개를 지원합니다. 정말 오래된 하드웨어를 실행하는 경우(2003년 이전 제작된 PC 또는 iPhone3GS 이전 모바일), 두 개의 텍스처 스테이지를 보유할 수 있습니다. 셰이더 작성자는 지원하려는 카드를 위한 별도의 SubShaders를 작성해야 합니다.

예제

텍스처 2개 알파 블렌딩

이 짧은 예제는 텍스처 2개를 취합니다. 우선 \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
            }
        }
    }
}

알파 제어된 자체 조명

셰이더는 조명 적용 위치를 결정하기 위해 \_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
            }
        }
    }
}
ShaderLab: 레거시 조명
ShaderLab: 레거시 알파 테스트