Version: Unity 6.0 (6000.0)
언어 : 한국어
ShaderLab: 레거시 알파 테스트
ShaderLab: 레거시 버텍스 데이터 채널 매핑

ShaderLab: 레거시 텍스처 조합

참고: 이 페이지의__ ShaderLab__셰이더 오브젝트의 구조를 정의하기 위한 Unity 언어입니다. 자세한 정보
See in Glossary
기능은 레거시이며 이전 버전과의 호환성을 위해서만 문서화되었습니다. 셰이더 소스 파일에 HLSL 코드가 포함된 경우 Unity는 이러한 커맨드를 완전히 무시합니다. 셰이더 소스 파일에 HLSL 코드가 포함되어 있지 않으면 Unity는 임포트 시 이러한 커맨드를 일반 셰이더 프로그램에 컴파일합니다.

렌더 파이프라인 호환성

기능 이름 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 SRP
레거시 텍스처 조합 지원 지원 안 함 지원 안 함 지원 안 함

개요

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

고정 함수 텍스처링으로 예전 스타일의 결합 효과를 구현할 수 있습니다. 하나의 패스 내에 여러 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의 알파를 사용하여 src3과 src1 간에 보간합니다. 보간은 반대 방향임에 유의하십시오. src1은 알파가 1일 때 사용되고 src3은 알파가 0일 때 사용됩니다.

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

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

  • Previous는 이전 SetTexture의 결과입니다.
  • Primarybound인 경우 이는 조명 연산의 컬러 또는 버텍스 컬러입니다.
  • Texture는 SetTexture에 _TextureName_으로 지정된 텍스처 컬러입니다(위 내용 참조).
  • ConstantConstantColor에 지정된 컬러입니다.

모디파이어:

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

텍스처 블록 constantColor 커맨드

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

Unity 5.0에서 제거된 기능

Unity 5.0 이전 버전에서는 텍스처 블록 내에서 matrix 커맨드를 사용하여 텍스처 좌표를 변환할 수 있었습니다. 지금 이 기능이 필요하다면 셰이더를 프로그래밍 가능한 셰이더로 다시 작성하고 버텍스 셰이더에서 UV 변환을 수행하는 것이 좋습니다.

마찬가지로 5.0부터는 부호 있는 덧셈(a+-b), 부호 있는 곱셈 후 덧셈(a*b+-c), 곱셈 후 뺄셈(a*b-c) 및 내적(dot3, dot3rgba) 텍스처 결합 모드가 제거되었습니다. 이 연산들이 필요한 경우 대신 픽셀 셰이더에서 계산을 수행하십시오.

세부 정보

프래그먼트 프로그램이 존재하기 전, 구형 그래픽 카드는 레이어 방식으로 텍스처를 처리했습니다. 이 방식에서는 텍스처가 하나씩 차례로 적용되면서 화면에 쓰여질 컬러를 수정합니다. 이때 각 텍스처는 일반적으로 이전 작업의 결과와 결합됩니다. 현재는 프래그먼트 프로그램을 사용하는 것이 좋습니다.

각 텍스처 단계는 플랫폼에 따라 0–1 범위로 고정되거나 고정되지 않을 수 있습니다. 이는 1.0보다 큰 값을 생성할 수 있는 SetTexture 단계에 영향을 줄 수 있습니다.

개별 알파 및 컬러 연산

컬러의 RGB 및 알파 컴포넌트를 모두 계산하는 데는 기본적으로 컴바이너 수식이 사용됩니다. 필요에 따라 알파 계산을 위해 별도의 수식을 지정할 수 있습니다. 이는 다음과 같습니다.

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

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

스페큘러 하이라이트

기본적으로 기본 컬러는 조명 계산에 정의된 것처럼 디퓨즈, 앰비언트, 스페큘러 컬러의 합입니다. 패스 옵션에서 SeparateSpecular On을 지정하면 스페큘러 컬러는 컴파이너 계산 이전이 아니라 _이후_에 추가됩니다. 이는 빌트인 버텍스 릿 셰이더의 기본 동작입니다.

그래픽스 하드웨어 지원

프래그먼트 셰이더를 지원하는 최신 그래픽 카드(데스크톱의 “셰이더 모델 2.0”)는 모든 SetTexture 모드와 최소 4개의 텍스처 단계를 지원합니다(상당수는 8개를 지원). 매우 오래된 하드웨어(PC의 경우 2003년 이전, 모바일의 경우 iPhone3GS 이전)를 사용한다면 텍스처 단계는 최소 2개에 불과할 수 있습니다. 셰이더 작성자는 지원하려는 카드에 대해 별도의 서브셰이더를 작성해야 합니다.

예제

텍스처 2개 알파 블렌딩

아래의 간단한 예시는 두 가지 텍스처를 사용합니다. 우선 MainTex를 취하는 첫 번째 컴바이너를 설정한 뒤 BlendTex의 알파 채널을 사용하여 _BlendTex의 RGB 컬러를 페이드인합니다.

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
            }
        }
    }
}

여기에서 재량을 발휘하여 순백색을 블렌딩하는 대신 자체 조명 컬러를 추가하여 블렌드할 수 있습니다. ConstantColor를 사용하여 _SolidColor를 프로퍼티에서 텍스처 블렌딩으로 가져온다는 점에 주목하세요.

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: 레거시 버텍스 데이터 채널 매핑