맞춤 머티리얼 참조

장면 양식은 기본 머티리얼 정의(.sfm)를 제공하여 개발자가 멋진 결과를 쉽게 얻을 수 있도록 합니다. 애셋 스타일을 세부적으로 맞춤설정하려는 개발자는 애셋 정의에서 source 속성을 지정하여 자체 머티리얼 정의(*.mat 파일)를 만들고 애셋에 적용할 수 있습니다.

핵심 개념

머티리얼
머티리얼은 표면의 시각적 모양을 정의합니다. 노출 영역을 완전히 설명하고 렌더링하기 위해 머티리얼은 다음 정보를 제공합니다.
  • 머티리얼 모델
  • 사용 제어 가능한 이름이 지정된 매개변수 세트
  • 래스터 상태 (블렌딩 모드, 후면 컬링 등)
  • 버텍스 셰이더 코드
  • 프래그먼트 셰이더 코드
머티리얼 모델
음영 모델 또는 조명 모델이라고도 하는 머티리얼 모델은 표면의 고유 속성을 정의합니다. 이러한 속성은 조명이 계산되는 방식, 즉 표면의 모양에 직접적인 영향을 줍니다.
머티리얼 정의
자료에 필요한 모든 정보를 설명하는 텍스트 파일입니다. 이 페이지에서는 (*.mat) 머티리얼 정의 파일의 구조와 형식을 설명합니다.

머티리얼 정의

머티리얼 정의는 머티리얼에 필요한 모든 정보를 설명하는 텍스트 파일입니다.

  • 이름
  • 사용자 매개변수
  • 머티리얼 모델
  • 필수 속성
  • 보간기 (변수)
  • 래스터 상태 (블렌딩 모드 등)
  • 셰이더 코드 (프래그먼트 셰이더, 선택적으로 버텍스 셰이더)

형식

머티리얼 정의 형식은 JSONish라고 하는 JSON을 기반으로 하는 느슨한 형식입니다. 최상위 수준에서 머티리얼 정의는 JSON 객체 표기법을 사용하는 3가지 블록으로 구성됩니다.

material {
    // material properties
}

vertex {
    // vertex shader, optional
}

fragment {
    // fragment shader
}

실행 가능한 최소 머티리얼 정의에는 material 블록과 fragment 블록이 포함되어야 합니다. vertex 블록은 선택사항입니다.

JSON과의 차이점

JSON에서 객체는 키-값 페어링으로 구성됩니다. JSON 쌍의 구문은 다음과 같습니다.

"key" : value

여기서 값은 문자열, 숫자, 객체, 배열, 리터럴 (true, false, null)일 수 있습니다. 이 구문은 머티리얼 정의에서 완벽하게 유효하지만, 문자열 앞뒤에 따옴표가 없는 변형도 허용됩니다.

key : value

문자열에 공백이 있으면 따옴표는 필수 상태로 유지됩니다.

vertexfragment 블록에는 이스케이프되지 않은 따옴표로 묶이지 않은 GLSL 코드가 포함됩니다. 이는 JSON에서는 유효하지 않습니다.

한 줄 C++ 스타일 주석은 허용됩니다.

쌍의 키는 대소문자를 구분합니다.

쌍의 값은 대소문자를 구분하지 않습니다.

다음 코드 목록은 유효한 머티리얼 정의의 예를 보여줍니다. 이 정의에서는 조명 머티리얼 모델을 사용하고, 기본 불투명 블렌딩 모드를 사용하며, 렌더링된 메시에 UV 좌표 집합을 표시해야 하고 사용자 매개변수 3개를 정의합니다. 이 문서의 다음 섹션에서는 materialfragment 블록을 자세히 설명합니다.

material {
    name : "Textured material",
    parameters : [
        {
           type : sampler2d,
           name : texture
        },
        {
           type : float,
           name : metallic
        },
        {
            type : float,
            name : roughness
        }
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
    blending : opaque
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_texture, getUV0());
        material.metallic = materialParams.metallic;
        material.roughness = materialParams.roughness;
    }
}

머티리얼 블록

머티리얼 블록은 셰이더가 아닌 모든 데이터를 설명하는 속성 쌍 목록이 포함된 필수 블록입니다.

name

유형
string
모든 문자열입니다. 이름에 공백이 있으면 큰따옴표가 필요합니다.
설명
머티리얼의 이름을 설정합니다. 이 이름은 디버깅을 위해 런타임에 유지됩니다.
material {
    name : stone
}

material {
    name : "Wet pavement"
}

shadingModel

유형
string
lit, cloth, unlit 중 하나 기본값은 lit입니다.
설명
머티리얼 모델 섹션에 설명된 대로 머티리얼 모델을 선택합니다.
material {
    shadingModel : unlit
}

매개변수

유형
매개변수 객체의 배열

각 항목은 속성이 nametype이고 두 가지 모두 string 유형의 객체입니다. 이름은 유효한 GLSL 식별자여야 합니다. 유형은 아래 표에 설명된 유형 중 하나여야 합니다.

유형 설명
bool 단일 부울
부울2 불리언 2개의 벡터
부울3 불리언 3개의 벡터
부울4 불리언 4개로 구성된 벡터
float 단일 부동 소수점 수
부동 소수점 수 2개의 부동 소수점 벡터
부동 소수점3 3개의 부동 소수점 수 벡터
부동 소수점 수 4개의 부동 소수점 벡터
int 단일 정수
정수 2 2개의 정수로 구성된 벡터
Int3 3개의 정수로 구성된 벡터
Int4 4개의 정수로 구성된 벡터
샘플러2D 2D 텍스처
samplerExternal 외부 텍스처 자세한 내용은 ExternalTexturesetExternalTexture()를 참고하세요.
샘플러

샘플러 유형은 format(기본값: float) 및 precision(기본값: default)을 지정할 수도 있습니다. 형식은 int, float 중 하나일 수 있습니다. 정밀도는 default(플랫폼의 최적 정밀도, 일반적으로 데스크톱의 high, 모바일의 medium), low, medium, high 중 하나일 수 있습니다.

설명

머티리얼에 필요한 매개변수를 나열합니다. 이러한 매개변수는 Sceneform의 Material API를 사용하여 런타임에 설정할 수 있습니다. 셰이더에서 매개변수에 액세스하는 방법은 매개변수 유형에 따라 다릅니다.

  • 샘플러 유형: materialParams_ 접두사가 붙은 매개변수 이름을 사용합니다. 예: materialParams_myTexture
  • 기타 유형: 매개변수 이름을 materialParams이라는 구조 필드로 사용합니다. 예: materialParams.myColor
material {
    parameters : [
        {
           type : float4,
           name : albedo
        },
        {
           type      : sampler2d,
           format    : float,
           precision : high,
           name      : roughness
        },
        {
            type : float2,
            name : metallicReflectance
        }
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = materialParams.albedo;
        material.roughness = texture(materialParams_roughness, getUV0());
        material.metallic = materialParams.metallicReflectance.x;
        material.reflectance = materialParams.metallicReflectance.y;
    }
}

필수

유형
string의 배열
각 항목은 uv0, uv1, color, tangents 중 하나여야 합니다.
설명
자료에 필요한 꼭짓점 속성을 나열합니다. position 속성은 자동으로 포함되며 지정하지 않아도 됩니다. unlit이 아닌 음영 모델을 선택할 때는 tangents 속성이 자동으로 필요합니다. 셰이더에서 이러한 속성에 액세스하는 방법에 관한 자세한 내용은 이 문서의 셰이더 섹션을 참고하세요.
material {
    parameters : [
        {
           type : sampler2d,
           name : texture
        },
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_texture, getUV0());
    }
}

variables

유형
string의 배열
최대 4개의 문자열이고 각 문자열은 유효한 GLSL 식별자여야 합니다.
설명
머티리얼 버텍스 셰이더에서 출력되는 맞춤 보간 유형 (또는 변수)을 정의합니다. 배열의 각 항목은 보간기의 이름을 정의합니다. 프래그먼트 셰이더의 전체 이름은 variable_ 프리픽스가 있는 보간기의 이름입니다. 예를 들어 eyeDirection라는 변수를 선언하면 variable_eyeDirection를 사용하여 프래그먼트 셰이더에서 이러한 변수에 액세스할 수 있습니다. 버텍스 셰이더에서 보간기 이름은 단순히 MaterialVertexInputs 구조의 멤버입니다(이 예에서는 material.eyeDirection). 각 보간기는 셰이더에서 float4(vec4) 유형입니다.
material {
    name : Skybox,
    parameters : [
        {
           type : sampler2d,
           name : skybox
        }
    ],
    variables : [
         eyeDirection
    ],
    vertexDomain : device,
    depthWrite : false,
    shadingModel : unlit
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        float theta = acos(variable_eyeDirection.y);
        float phi = atan(variable_eyeDirection.z / variable_eyeDirection.x) +
            (variable_eyeDirection.x > 0.0 ? 0.0 : PI);
        material.baseColor = texture(materialParams_skybox,
            vec2((phi + PI / 2.0) / (2.0 * PI), theta / PI));
    }
}

vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        float3 p = getPosition().xyz;
        float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
        material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
    }
}

혼합

유형
string
opaque, transparent, fade, add, masked 중 하나입니다. 기본값은 opaque입니다.
설명

렌더링된 객체가 렌더 대상의 콘텐츠와 혼합되는 방식을 정의합니다. 가능한 블렌딩 모드는 다음과 같습니다.

  • 불투명: 블렌딩이 사용 중지되었으므로 머티리얼 출력의 알파 채널이 무시됩니다.
  • 투명함: 혼합이 사용 설정되었습니다. 머티리얼의 출력은 Porter-Duff의 소스 오버 규칙을 사용하여 렌더링 타겟과 알파 합성됩니다. 이 블렌딩 모드는 사전 곱하기 알파를 가정합니다.
  • 페이드 아웃: transparent 역할을 하며 반사광에 투명도도 적용됩니다. transparent 모드에서 머티리얼의 알파 값은 디퓨즈 조명에만 적용됩니다. 이 블렌딩 모드는 조명 객체를 페이드 인하고 페이드 아웃하는 데 유용합니다.
  • 추가: 혼합이 사용 설정되었습니다. 머티리얼의 출력은 렌더 대상의 콘텐츠에 추가됩니다.
  • 마스크: 혼합이 사용 중지되었습니다. 이 블렌딩 모드는 알파 마스킹을 사용 설정합니다. 머티리얼 출력의 알파 채널은 프래그먼트 삭제 여부를 정의합니다. 자세한 내용은 maskThreshold 섹션을 참조하세요.
material {
    blending : transparent
}

버텍스도메인

유형
string
object, world, view, device 중 하나입니다. 기본값은 object입니다.
설명

렌더링된 메시의 도메인 (또는 좌표 공간)을 정의합니다. 도메인은 꼭짓점 셰이더에서 꼭짓점이 변환되는 방식에 영향을 줍니다. 가능한 도메인은 다음과 같습니다.

  • 객체: 꼭짓점은 객체 (또는 모델) 좌표 공간에 정의됩니다. 렌더링된 객체의 변환 매트릭스를 사용하여 꼭짓점이 변환됩니다.
  • 세계: 꼭짓점은 세계 좌표 공간에 정의됩니다. 렌더링된 객체의 변환을 사용하여 꼭짓점이 변환되지 않습니다.
  • : 꼭짓점이 뷰 (또는 눈 또는 카메라) 좌표 공간에 정의됩니다. 렌더링된 객체의 변환을 사용하여 꼭짓점이 변환되지 않습니다.
  • 기기: 버텍스가 정규화된 기기 (또는 클립) 좌표 공간에 정의됩니다. 렌더링된 객체의 변환을 사용하여 꼭짓점이 변환되지 않습니다.
material {
    vertexDomain : device
}

보간 유형

유형
string
모든 smooth, flat. 기본값은 smooth입니다.
설명
정점 간에 보간 유형 (또는 변수)이 보간되는 방식을 정의합니다. 이 속성을 smooth로 설정하면 각 보간기에 올바른 시점의 보간이 실행됩니다. flat로 설정하면 보간이 수행되지 않으며 주어진 삼각형 내의 모든 프래그먼트가 동일하게 음영 처리됩니다.
material {
    interpolation : flat
}

추려내기

유형
string
none, front, back, frontAndBack 중 하나입니다. 기본값은 back입니다.
설명
결합해야 하는 삼각형(없음, 전면 삼각형, 후면 삼각형 등)을 정의합니다.
material {
    culling : none
}

컬러 쓰기

유형
boolean
true 또는 false. 기본값은 true입니다.
설명
색상 버퍼에 쓰기를 사용 설정 또는 사용 중지합니다.
material {
    colorWrite : false
}

깊이 쓰기

유형
boolean
true 또는 false. 기본값은 true입니다.
설명
심층 버퍼에 대한 쓰기를 사용 설정 또는 중지합니다.
material {
    depthWrite : false
}

깊이 추려내기

유형
boolean
true 또는 false. 기본값은 true입니다.
설명
심도 테스트를 사용 설정 또는 사용 중지합니다. 깊이 테스트가 사용 중지되면 이 머티리얼로 렌더링된 객체가 항상 다른 불투명 객체 위에 표시됩니다.
material {
    depthCulling : false
}

양면

유형
boolean
true 또는 false. 기본값은 false입니다.
설명
양면 렌더링을 사용 설정 또는 사용 중지합니다. true로 설정하면 cullingnone로 자동 설정됩니다. 삼각형이 뒤를 향하면 삼각형의 법선은 자동으로 뒤집어 전면을 만듭니다.
material {
    doubleSided : true
}

투명도

유형
string
default, twoPassesOneSide 또는 twoPassesTwoSides 중 하나 기본값은 default입니다.
설명
투명한 객체가 렌더링되는 방식을 제어합니다. blending 모드가 opaque가 아닌 경우에만 유효합니다. 이러한 메서드 중 어떠한 메서드도 오목한 도형을 정확하게 렌더링할 수는 없지만, 실제로는 충분히 좋은 경우가 많습니다.

가능한 세 가지 투명성 모드는 다음과 같습니다.

  • default: 투명 객체가 정상적으로 렌더링되어 culling 모드 등을 준수합니다.

  • twoPassesOneSide: 투명한 객체가 먼저 깊이 버퍼에서 렌더링된 후 색상 모드를 통해 다시 렌더링되어 cullling 모드를 따릅니다. 이렇게 하면 아래와 같이 투명한 객체의 절반만 효과적으로 렌더링됩니다.

  • twoPassesTwoSides: 투명 객체가 색상 버퍼에서 두 번 렌더링됩니다. 먼저 후면을 사용한 후 앞면을 사용하여 렌더링됩니다. 이 모드를 사용하면 아래와 같이 두 얼굴 집합을 렌더링하고 정렬 문제를 줄이거나 없앨 수 있습니다. twoPassesTwoSidesdoubleSided와 결합하여 효과를 개선할 수 있습니다.

material {
    transparency : twoPassesOneSide
}

마스크 기준

유형
number
0.0에서 1.0 사이의 값입니다. 기본값은 0.4입니다.
설명
blending 모드가 masked으로 설정된 경우 프래그먼트를 삭제하지 않아야 하는 최소 알파 값을 설정합니다. 블렌딩 모드가 masked가 아니면 이 값은 무시됩니다. 이 값은 알파 마스킹된 객체의 모양을 제어하는 데 사용할 수 있습니다.
material {
    blending : masked,
    maskThreshold : 0.5
}

그림자 배율

유형
boolean
true 또는 false. 기본값은 false입니다.
설명
unlit 음영 모델에서만 사용할 수 있습니다. 이 속성을 사용 설정하면 머티리얼에서 계산된 최종 색상에 섀도잉 계수 (또는 가시성)를 곱합니다. 이를 통해 투명한 그림자 수신 객체 (예: AR에 보이지 않는 지면)를 만들 수 있습니다.
material {
    name : "Invisible shadow plane",
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        // baseColor defines the color and opacity of the final shadow
        material.baseColor = vec4(0.0, 0.0, 0.0, 0.7);
    }
}

변형 필터

유형
string의 배열
각 항목은 dynamicLighting, directionalLighting, shadowReceiver 또는 skinning 중 하나여야 합니다.
설명
애플리케이션이 필요하지 않도록 보장할 셰이더 변형 목록을 지정하는 데 사용됩니다. 이러한 셰이더 변형은 코드 생성 단계에서 건너뛰므로 머티리얼의 전체 크기가 줄어듭니다. 일부 대안은 자동으로 필터링될 수 있습니다. 예를 들어 unlit 머티리얼을 컴파일할 때 모든 조명 관련 변형(directionalLighting 등)이 필터링됩니다. 변형 필터를 주의해서 사용하세요. 런타임에 필요한 변형을 필터링하면 비정상 종료가 발생할 수 있습니다.

변형 설명: - 장면에 방향 광원이 있을 때 사용되는 directionalLighting - 장면에 비방향 빛 (점, 스팟 등)이 있을 때 사용되는 dynamicLighting - 객체가 그림자를 받을 수 있는 경우 shadowReceiver - GPU 스킨을 사용하여 객체에 애니메이션을 적용할 때 사용

material {
    name : "Invisible shadow plane",
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent,
    variantFilter : [ skinning ]
}

버텍스 블록

버텍스 블록은 선택사항이며 머티리얼의 버텍스 음영 단계를 제어하는 데 사용할 수 있습니다. 버텍스 블록은 유효한 ESSL 3.0 코드 (OpenGL ES 3.0에서 지원되는 GLSL 버전)를 포함해야 합니다. 버텍스 블록 내에 여러 함수를 자유롭게 만들 수 있지만 materialVertex 함수는 반드시 선언해야 합니다.

vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        // vertex shading code
    }
}

이 함수는 음영 시스템에 의해 런타임에 자동으로 호출되며, MaterialVertexInputs 구조를 사용하여 머티리얼 속성을 읽고 수정할 수 있는 기능을 제공합니다. 이 구조의 전체 정의는 머티리얼 꼭짓점 입력 섹션에서 확인할 수 있습니다.

이 구조를 사용하여 맞춤 변수/보간을 계산하거나 속성 값을 수정할 수 있습니다. 예를 들어 다음 버텍스 블록은 시간 경과에 따라 버텍스의 색상과 UV 좌표를 모두 수정합니다.

material {
    requires : [uv0, color]
}
vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        material.color *= sin(getTime());
        material.uv0 *= sin(frameUniforms.time);
    }
}

MaterialVertexInputs 구조 외에도 버텍스 셰이딩 코드는 셰이더 공개 API 섹션에 나열된 모든 공개 API를 사용할 수 있습니다.

머티리얼 꼭짓점 입력

struct MaterialVertexInputs {
    float4 color;         // if the color attribute is required
    float2 uv0;           // if the uv0 attribute is required
    float2 uv1;           // if the uv1 attribute is required
    float3 worldNormal;   // only if the shading model is not unlit
    float4 worldPosition; // always available
    // variable* names are replaced with actual names
    float4 variable0;     // if 1 or more variables is defined
    float4 variable1;     // if 2 or more variables is defined
    float4 variable2;     // if 3 or more variables is defined
    float4 variable3;     // if 4 or more variables is defined
};

프래그먼트 블록

프래그먼트 블록은 머티리얼의 프래그먼트 셰이딩 단계를 제어하는 데 사용해야 합니다. 프래그먼트 블록은 유효한 ESSL 3.0 코드 (OpenGL ES 3.0에서 지원되는 GLSL 버전)를 포함해야 합니다. 버텍스 블록 내에 여러 함수를 자유롭게 만들 수 있지만 material 함수는 반드시 선언해야 합니다.

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        // fragment shading code
    }
}

이 함수는 음영 시스템에 의해 런타임에 자동으로 호출되며, MaterialInputs 구조를 사용하여 머티리얼 속성을 읽고 수정할 수 있는 기능을 제공합니다. 구조의 전체 정의는 머티리얼 프래그먼트 입력 섹션에서 확인할 수 있습니다. 구조의 다양한 멤버에 대한 전체 정의는 이 문서의 머티리얼 모델 섹션에서 확인할 수 있습니다.

material() 함수의 목표는 선택한 셰이딩 모델과 관련된 머티리얼 속성을 계산하는 것입니다. 예를 들어 다음은 표준 조명 음영 모델을 사용하여 광택된 빨간색 금속을 만드는 프래그먼트 블록입니다.

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
        material.metallic = 1.0;
        material.roughness = 0.0;
    }
}

prepareMaterial 함수

material() 함수를 종료하기 전에 prepareMaterial(material)호출해야 합니다. 이 prepareMaterial 함수는 머티리얼 모델의 내부 상태를 설정합니다. 프래그먼트 API 섹션에 설명된 일부 API(예: shading_normal)는 prepareMaterial()를 호출한 에만 액세스할 수 있습니다.

머티리얼 프래그먼트 입력 섹션에 설명된 대로 normal 속성은 prepareMaterial()를 호출하기 전에 수정할 때만 효과가 있다는 점에 유의해야 합니다. 다음은 normal 속성을 올바르게 수정하여 범프 매핑이 있는 빨간색 글래스 플라스틱을 구현하는 프래그먼트 셰이더의 예입니다.

fragment {
    void material(inout MaterialInputs material) {
        // fetch the normal in tangent space
        vec3 normal = texture(materialParams_normalMap, getUV0()).xyz;
        material.normal = normal * 2.0 - 1.0;

        // prepare the material
        prepareMaterial(material);

        // from now on, shading_normal, etc. can be accessed
        material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
        material.metallic = 0.0;
        material.roughness = 1.0;
    }
}

머티리얼 프래그먼트 입력

struct MaterialInputs {
    float4 baseColor;           // default: float4(1.0)
    float4 emissive;            // default: float4(0.0)

    // no other field is available with the unlit shading model
    float  roughness;           // default: 1.0
    float  metallic;            // default: 0.0, not available with cloth
    float  reflectance;         // default: 0.5, not available with cloth
    float  ambientOcclusion;    // default: 0.0

    // not available when the shading model is cloth
    float  clearCoat;           // default: 1.0
    float  clearCoatRoughness;  // default: 0.0
    float3 clearCoatNormal;     // default: float3(0.0, 0.0, 1.0)
    float  anisotropy;          // default: 0.0
    float3 anisotropyDirection; // default: float3(1.0, 0.0, 0.0)


    // only available when the shading model is cloth
    float3 sheenColor;         // default: sqrt(baseColor)
    float3 subsurfaceColor;    // default: float3(0.0)

    // not available when the shading model is unlit
    // must be set before calling prepareMaterial()
    float3 normal;             // default: float3(0.0, 0.0, 1.0)
}

셰이더 공개 API

유형

GLSL 유형은 직접 사용할 수 있지만 (vec4 또는 mat4) 다음 유형 별칭을 사용하는 것이 좋습니다.

이름 GLSL 유형 설명
부울2 BVEC2 불리언 2개의 벡터
부울3 BVEC3 불리언 3개로 구성된 벡터
부울4 BVEC4 불리언 4개로 구성된 벡터
정수2 IVEC2 2개의 정수로 구성된 벡터
3 IVEC3 3개의 정수로 구성된 벡터
정수4 IVEC4 4개의 정수로 구성된 벡터
uint2 Uvec2 부호 없는 정수 2개로 구성된 벡터
uint3 Uvec3 부호 없는 정수 3개의 벡터
uint4 Uvec4 부호 없는 정수 4개로 구성된 벡터
부동 소수점 수2 부동 소수점 수 2개의 부동 소수점 벡터
부동 소수점 수 부동 소수점3 3개의 부동 소수점 벡터
부동 소수점 수 부동 소수점 수 4개의 부동 소수점 벡터
부동 소수점 수4x4 매트4 4x4 부동 행렬
부동 소수점 수3x3 매트3 3x3 부동 행렬

수학

이름 유형 설명
PI float \(\pi\)를 나타내는 상수
HALF_PI float \(\frac{\pi}{2}\)를 나타내는 상수
saturate(float x) float 지정된 값을 0.0에서 1.0 사이로 클램프합니다.
pow5(float x) float 컴퓨팅 \(x^5\)
sq(부동 소수점 수 x) float 컴퓨팅 \(x^2\)
max3(float3 v) float 지정된 float3의 최댓값을 반환합니다.
mulMat4x4Float3(float4x4m, float3 v) 부동 소수점 수 반환 \(m * v\)
mulMat3x3Float3(float4x4m, float3 v) 부동 소수점 수 반환 \(m * v\)

행렬

이름 유형 설명
getViewFromWorldMatrix()를 참조하세요. 부동 소수점 수 4x4 월드 공간에서 뷰/아이 공간으로 이동하는 행렬
getWorldFromViewMatrix()를 참조하세요. 부동 소수점 수 4x4 뷰/눈 공간에서 월드 공간으로 변환하는 행렬
getClipFromViewMatrix() 부동 소수점 수 4x4 뷰/눈 공간에서 클립 (NDC) 공간으로 변환하는 매트릭스
getViewFromClipMatrix()를 참조하세요. 부동 소수점 수 4x4 클립(NDC) 공간에서 보기/눈 공간으로 변환하는 매트릭스
getClipFromWorldMatrix() 부동 소수점 수 4x4 월드에서 클립 (NDC) 공간으로 변환하는 매트릭스

프레임 상수

이름 유형 설명
getResolution()에 포함됩니다. 부동 소수점 수 뷰의 해상도(픽셀): width, height, 1 / width, 1 / height
getWorldCameraPosition() 부동 소수점3 실제 공간의 카메라/눈 위치
getTime() float 시청 양식 엔진이 초기화된 후 경과된 시간(초)입니다. 정밀도 손실을 피하기 위해 정기적으로 재설정될 수 있습니다.
getExposure() float 카메라의 광도 노출
getEV100() float 카메라의 ISO 100 노출 값

Vertex만

다음 API는 버텍스 블록에서만 사용할 수 있습니다.

이름 유형 설명
getPosition() 부동 소수점 수 머티리얼에 의해 정의된 도메인의 버텍스 위치 (기본값: 객체/모델 공간)
getWorldFromModelMatrix()를 참조하세요. 부동 소수점 수 4x4 모델 (객체) 공간에서 월드 공간으로 변환하는 행렬
getWorldFromModelNormalMatrix()를 참조하세요. 부동 소수점 3x3 모델 (객체) 공간에서 월드 공간으로 노멀을 변환하는 행렬

프래그먼트만

다음 API는 프래그먼트 블록에서만 사용할 수 있습니다.

이름 유형 설명
getWorldTangentFrame() 부동 소수점 3x3 각 월드에 있는 꼭짓점의 tangent (frame[0]), bi-tangent (frame[1]), normal (frame[2])을 포함하는 행렬입니다. 머티리얼이 범프 매핑에 대한 탄젠트 공간을 정규화하지 않거나 음영이 비등방성인 경우 이 행렬에서 normal만 유효합니다.
getWorldPosition()에 오신 것을 환영합니다. 부동 소수점3 월드 공간 내 프래그먼트 위치
getWorldViewVector()를 사용할 수 있습니다. 부동 소수점3 프래그먼트 위치에서 눈으로의 월드 공간의 정규화된 벡터
getWorldNormalVector() 부동 소수점3 범프 매핑 후 월드 공간에서 정규화된 정규화 (prepareMaterial() 이후에 사용해야 함)
getWorldReflectedVector() 부동 소수점3 노멀에 관한 뷰 벡터의 반사 (prepareMaterial() 이후에 사용되어야 함)
getNdotV() float dot(normal, view)의 결과는 항상 0보다 큽니다 (prepareMaterial() 이후에 사용해야 함).
getColor() 부동 소수점 수 색상 속성이 필요한 경우 프래그먼트의 보간 색상
getUV0() 부동 소수점 수 uv0 속성이 필요한 경우 첫 번째 UV 좌표 집합
getUV1() 부동 소수점 수 uv1 속성이 필요한 경우 첫 번째 UV 좌표 집합
inverseTonemap(float3) 부동 소수점3 반전 톤 매핑 연산자를 지정된 선형 sRGB 색에 적용합니다. 이 작업은 근사치일 수 있으며
inverseTonemapSRGB(부동 소수점 수3) 부동 소수점3 지정된 선형 sRGB 색에 역 톤 매핑 연산자를 적용합니다. 이 작업은 근사치일 수 있습니다.
휘도(float3) float 지정된 선형 sRGB 색상의 휘도를 계산합니다.

머티리얼 모델

장면 양식 머티리얼은 다음 머티리얼 모델 중 하나를 사용할 수 있습니다.

  • Lit (또는 표준)
  • 직물
  • 조명 없음

Lit 모델

조명 모델은 장면 모델의 표준 머티리얼 모델입니다. 이 물리적 기반 셰이딩 모델은 Unity 5, Unreal Engine 4, Subarticle Designerer 또는 Marmoset Toolpack과 같은 다른 일반적인 도구 및 엔진과의 양호한 상호 운용성을 제공하도록 설계되었습니다.

이 머티리얼 모델은 수많은 비금속 표면 (유전기) 또는 금속 표면 (도체)을 설명하는 데 사용할 수 있습니다.

표준 모델을 사용하는 머티리얼의 모양은 아래 표에 설명된 속성을 사용하여 제어됩니다.

표준 모델의 속성

속성 정의
기본 색상 비금속 표면의 경우 알베도 완화, 금속성 표면의 반사 색상
메탈릭 표면이 유전 (0.0) 또는 도체 (1.0)인지 표시합니다. 종종 바이너리 값(0 또는 1)으로 사용됨
거칠기 표면의 부드러움 (1.0) 또는 거칠기 (0.0) 매끄러운 표면에서 선명한 반사를 보입니다
반사 유전 표면의 정상 입자에서 프레넬 반사. 그러면 반사 강도를
clearCoat 명확한 코트 레이어의 강도
clearCoatRoughness 투명 코팅 레이어의 부드러움 또는 거칠기 인식
비등방성 탄젠트 방향 또는 탄젠트 방향의 비등방성량
비등방성 방향 지역 표면 방향
앰비언트 오클루전 표면 지점에 주변 빛이 어느 정도 액세스할 수 있는지 정의합니다. 0.0~1.0 사이의 픽셀당 섀도 처리 요소입니다.
일반 범프 매핑 (일반 매핑)을 사용하여 노출 영역을 방해하는 데 사용되는 세부 일반입니다.
clearCoatNormal 범프 매핑(일반 매핑)을 사용하여 클리어 코트 레이어를 바꾸는 데 사용되는 세부정보 노멀입니다.
분산형 방사형 표면 (예: 네온 등)을 시뮬레이션하기 위한 추가 디퓨즈 알베도 이 속성은 블룸 패스가 있는 HDR 파이프라인에서 주로 유용합니다.

각 속성의 유형과 범위는 아래 표에 설명되어 있습니다.

속성 유형 범위 참고
기본 색상 부동 소수점 수 [0..1] 사전 선형 RGB
메탈릭 float [0..1] 0 또는 1이어야 합니다.
거칠기 float [0..1]
반사 float [0..1] 0.35 이상의 값을 선호합니다.
clearCoat float [0..1] 0 또는 1이어야 합니다.
clearCoatRoughness float [0..1] [0..0.6]으로 다시 매핑
비등방성 float [-1..1] 비등방성은 값이 양수인 경우 탄젠트 방향입니다.
비등방성 방향 부동 소수점3 [0..1] 선형 RGB, 탄젠트 공간에서 방향 벡터를 인코딩
앰비언트 오클루전 float [0..1]
일반 부동 소수점3 [0..1] 선형 RGB, 탄젠트 공간에서 방향 벡터를 인코딩
clearCoatNormal 부동 소수점3 [0..1] 선형 RGB, 탄젠트 공간에서 방향 벡터를 인코딩
분산형 부동 소수점 수 RGB=[0..1], a=[-n..n] 알파는 노출 보정입니다.

기본 색상

baseColor 속성은 객체에서 인식된 색상 (albedo라고도 함)을 정의합니다. baseColor의 효과는 표시 영역의 특성에 따라 달라지며, Metallic 섹션에 설명된 metallic 속성으로 제어됩니다.

비금속 (유전기)

표면의 디퓨즈 색상을 정의합니다. 실제 값은 일반적으로 값이 0~255로 인코딩되는 경우 [10..240] 또는 0~1 사이인 [0.04..0.94] 범위에 있습니다. 비금속 표면의 기본 색상에 관한 몇 가지 예는 아래 표에서 확인할 수 있습니다.

메탈 sRGB 16진수 색상
석탄 0.19, 0.19, 0.19 #323232
 
고무 0.21, 0.21, 0.21 #353535
 
진흙 0.33, 0.24, 0.19 #553d31
 
목재 0.53, 0.36, 0.24 #875c3c
 
초목 0.48, 0.51, 0.31 #7b824e
 
Brick 0.58, 0.49, 0.46 #947d75
 
모래 0.69, 0.66, 0.52 #b1a884
 
콘크리트 0.75, 0.75, 0.73 #c0bfbb
 
금속 (도체)

표면의 반사 색상을 정의합니다. 실제 값은 일반적으로 값이 0에서 255 사이 또는 [0.66..1.0] 에서 0과 1 사이로 인코딩된 경우 범위 [170..255] 에 있습니다. 금속성 표면의 기본 색상에 대한 몇 가지 예는 아래 표에서 확인할 수 있습니다.

메탈 sRGB 16진수 색상
실버 0.98, 0.98, 0.96 #faf9f5
 
알루미늄 0.96, 0.96, 0.96 #f4f5f5
 
티타늄 0.81, 0.78, 0.76 #cec8c2
 
0.76, 0.74, 0.73 #c0bdba
 
플래티넘 0.84, 0.82, 0.79 #d6d1c8
 
골드 1.00, 0.87, 0.62 #fedc9d
 
황동 0.96, 0.89, 0.68 #f4e4ad
 
구리 0.98, 0.85, 0.72 #fbd8b8
 

메탈릭

metallic 속성은 표면이 금속성(도체)인지 또는 비금속(유전기) 표면인지 정의합니다. 이 속성은 바이너리 값으로 사용되어야 하며 0 또는 1로 설정됩니다. 중간 값은 텍스처를 사용할 때 여러 유형의 표시 경로 간 전환을 만드는 데만 유용합니다.

이 속성은 노출 영역의 모양을 크게 변경할 수 있습니다. 비금속 표면에는 색조 디퓨즈 반사 및 무색 반사 반사가 있습니다(반사된 빛은 색상이 변경되지 않음). 금속 표면에는 확산 반사 및 색 반사 반사가 없습니다 (반사된 빛은 baseColor에 의해 정의된 것처럼 표면의 색상을 따릅니다.)

metallic의 효과가 아래에 나와 있습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

거칠기

roughness 속성은 표면의 부드러운 동작을 제어합니다. roughness를 0으로 설정하면 표면이 완벽하게 매끄럽고 매우 광택됩니다. 표면이 비칠수록 '반사'가 커집니다. 이 속성은 다른 엔진 및 도구에서 종종 유광이라고 하며 거칠기 (roughness = 1 - glossiness)와 반대입니다.

비금속

비금속 표면에 roughness의 효과가 아래에 나와 있습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

금속

금속 표면에 roughness의 효과가 아래에 나와 있습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

반사

reflectance 속성은 비금속 표면에만 영향을 미칩니다. 이 속성은 반사 강도를 제어하는 데 사용할 수 있습니다. 이 값은 0~1 사이로 정의되며 반사율의 재매핑을 나타냅니다. 예를 들어 기본값 0.5는 반사율 4%에 해당합니다. 0.35 (반사율 2%) 미만의 값은 반사율이 높지 않은 실제 머티리얼이 없으므로 피해야 합니다.

비금속 표면에 reflectance의 효과가 아래에 나와 있습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

아래 그래프는 일반적인 값 및 이러한 값이 매핑 함수와 어떻게 관련이 있는지 보여줍니다.

아래 표에서는 다양한 유형의 머티리얼에 허용되는 반사 값을 설명합니다 (실제 머티리얼의 값이 2% 미만인 경우 없음).

머티리얼 반사 속성 값
2% 0.35
섬유 4% ~5.6% 0.5~0.59
일반적인 액체 2% ~4% 0.35~0.5
일반 보석 5~16% 0.56~1.0
플라스틱, 유리 4% ~5% 0.5~0.56
기타 유전 물질 2% ~5% 0.35~0.56
2.5% 0.39
스킨 2.8% 0.42
헤어 4.6% 0.54
치아 5.8% 0.6
기본값 4% 0.5

투명 코트

다중 레이어 머티리얼은 매우 일반적이며, 특히 기본 레이어 위에 얇은 반투명 레이어가 있는 머티리얼입니다. 이러한 물질의 실제 예로는 자동차 물감, 탄산음료, 유약 목재, 아크릴 등이 있습니다.

clearCoat 속성은 2개의 레이어가 있는 머티리얼을 설명하는 데 사용할 수 있습니다. 명확한 코트 레이어는 항상 비등방성이며 유전적입니다. 다음 이미지는 표준 머티리얼 모델 (왼쪽)과 투명 코트 모델 (오른쪽)의 탄소 섬유 소재를 비교한 것입니다.

clearCoat 속성은 투명 코트 레이어의 강도를 제어합니다. 0 또는 1로 설정된 바이너리 값으로 취급해야 합니다. 중간 값은 명확한 레이어가 있는 표면과 그렇지 않은 부분 간의 전환을 제어하는 데 유용합니다.

clearCoat이 러그 메탈에 미치는 영향은 다음과 같습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

코팅의 투명도를 유지합니다.

clearCoatRoughness 속성은 roughness 속성과 유사하지만 명확한 코트 레이어에만 적용됩니다. 또한 명확한 코트 레이어는 전혀 거칠지 않으므로 0과 1 사이의 값은 내부적으로 실제 거칠기인 0에서 0.6으로 다시 매핑됩니다.

clearCoatRoughness이 러그 메탈에 미치는 영향은 다음과 같습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

비등방성

브러시 메탈 등 실제 물질은 비등방성 반사 모델을 통해서만 복제할 수 있습니다. anisotropy 속성을 사용하여 머티리얼을 기본 비등방성 모델에서 비등방성 모델로 변경할 수 있습니다. 다음 이미지는 비등방성 머티리얼 (왼쪽)과 비등방성 머티리얼(오른쪽)을 비교합니다.

0.0 (왼쪽)에서 1.0 (오른쪽)까지의 가변 메탈에 다양한 anisotropy 효과가 미치는 영향은 다음과 같습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

아래 이미지는 비등방성 하이라이트의 방향을 양수 또는 음수 값을 사용하여 제어하는 방법을 보여줍니다. 양수 값 (왼쪽)은 탄젠트 방향에서 비등방성, 탄젠트 방향의 음수 값 (오른쪽)을 정의합니다.

비등방성 방향

anisotropyDirection 속성은 지정된 지점에서 면의 방향을 정의하므로 반사 하이라이트의 모양을 제어합니다. 일반적으로 텍스처에서 나오는 3개 값의 벡터로 지정되며 표면에 로컬인 경로를 인코딩합니다.

방향 맵을 사용하여 금속에 anisotropyDirection를 렌더링하는 효과는 다음과 같습니다 (이미지를 클릭하면 더 크게 볼 수 있음).

위의 이미지를 렌더링하는 데 사용되는 방향 지도는 아래에 나와 있습니다.

앰비언트 오클루전

ambientOcclusion 속성은 노출점에 액세스할 수 있는 주변광의 양을 정의합니다. 픽셀당 섀도 처리 계수는 0.0(완전히 섀도 처리됨)과 1.0 (완전히 밝음) 사이입니다. 이 속성은 디퓨즈 간접 조명 (이미지 기반 조명)에만 영향을 주며 방향, 점 및 스팟 조명과 같은 직접 조명이나 반사 조명에는 영향을 미치지 않습니다. 다음 이미지는 디퓨즈 앰비언트 오클루전이 없는 머티리얼 (왼쪽)과 머티리얼 (오른쪽)을 비교합니다.

보통

normal 속성은 지정된 지점에서 곡면의 노멀을 정의합니다. 일반적으로 픽셀당 속성을 변경할 수 있는 일반 맵 텍스처에서 가져옵니다. 노멀은 탄젠트 공간에 입력되며, 이는 +Z가 지면을 가리키고 있음을 의미합니다.

예를 들어 술로 장식한 가죽으로 덮인 가구를 렌더링한다고 가정해 보겠습니다. 술의 패턴을 정확하게 나타내도록 도형을 모델링하려면 삼각형이 너무 많이 필요하므로 일반 맵에 하이 폴리 메시를 만듭니다. 그런 다음 단순화된 메시에 기본 지도를 적용할 수 있습니다. 다음 이미지는 일반 매핑이 없는 간단한 메시 (왼쪽)와 메시를 비교하는 경우(오른쪽)를 보여줍니다.

normal 속성은 투명 코트 레이어가 아닌 기본 레이어에 영향을 줍니다.

클리어 코트

clearCoatNormal 속성은 특정 지점에서 명확한 코트 레이어의 노멀을 정의합니다. normal 속성과는 다르게 작동합니다.

불광

emissive 속성을 사용하여 표면에서 방출된 추가 광원을 시뮬레이션할 수 있습니다. RGB 색상 (선형 공간)과 노출 보정 값 (알파 채널)이 포함된 float4 값으로 정의됩니다.

노출 값은 실제로 카메라 설정의 조합을 나타내지만 사진가가 빛의 강도를 설명하는 데 자주 사용합니다. 이를 통해 카메라는 사진가가 이미지를 과다 노출하거나 과소 노출하는 데 노출 보상을 적용할 수 있습니다. 이 설정은 예술적 제어를 위해 사용할 수 있지만 적절한 노출을 달성하는 데에도 사용할 수 있습니다 (예: 눈이 18%의 중간 그레이로 노출됨).

방출 속성의 노출 보정 값을 사용하면 발광 색상을 현재 노출보다 밝게 (양수 값) 또는 어둡게 (음수 값)하도록 할 수 있습니다. 블룸 효과가 사용 설정된 경우 긍정적인 노출 보정을 사용하면 표면이 강제로 블룸될 수 있습니다.

천 모델

앞서 설명한 모든 머티리얼 모델은 거시적 및 미시적 측면에서 조밀한 표면을 시뮬레이션하도록 설계되었습니다. 그러나 옷과 직물은 종종 빛을 흡수하고 분산시키는 느슨하게 연결된 나사로 만들어집니다. 단단한 표면에 비해 천은 큰 감소와 함께 앞/뒤의 분산형으로 인해 퍼징 조명이 있는 부드러운 반사 형상을 특징으로 합니다. 일부 직물은 투톤 반사 색상(예: 벨벳)도 표시합니다.

다음 이미지는 표준 모델(왼쪽)과 옷 모델 (오른쪽)을 사용하여 렌더링된 데님 패브릭을 비교합니다. 표준 머티리얼 모델이 데님 직물 샘플의 모양을 캡처하지 못하는 이유를 확인합니다 (왼쪽). 표면이 플라스틱과 유사하고 단단하게 표시되며 옷 조각보다 트랩과 더 유사합니다. 이는 흡수 및 산란으로 인한 더 부드러운 반사 로브가 직물의 충실한 재생성에 얼마나 중요한지를 보여줍니다.

벨벳은 천 소재 모델의 흥미로운 사용 사례입니다. 아래 이미지와 같이 이 유형의 패브릭은 정방향 및 후면 분산형으로 인해 강력한 테두리 조명을 보여줍니다. 이러한 산란 이벤트는 직물 표면에 수직으로 서 있는 섬유에 의해 야기됩니다. 입사광이 보기 방향과 반대인 방향으로 들어오면 광섬유가 빛을 앞당기게 됩니다. 마찬가지로, 뷰 방향과 같은 방향에서 입사된 빛을 포함하면 광섬유가 빛을 뒤로 산란시킵니다.

단단한 표면 머티리얼 모델로 가장 잘 모델링되는 패브릭 유형이 있다는 점에 유의해야 합니다. 예를 들어 가죽, 실크, 새틴은 표준 또는 비등방성 머티리얼 모델을 사용하여 다시 만들 수 있습니다.

의류 소재 모델은 금속성반사율을 제외하고 표준 머티리얼 모드에서 이전에 정의된 모든 매개변수를 포함합니다. 아래 표에 설명된 두 가지 추가 매개변수도 사용할 수 있습니다.

매개변수 정의
ShenColor 투톤 반사 패브릭을 만드는 반사 색조(기본값: \(\sqrt{baseColor}\))
subsurfaceColor 머티리얼을 분산하고 흡수한 후 디퓨즈 색상에 색조를 적용합니다.

각 속성의 유형과 범위는 아래 표에 설명되어 있습니다.

속성 유형 범위 참고
ShenColor 부동 소수점3 [0..1] 선형 RGB
subsurfaceColor 부동 소수점3 [0..1] 선형 RGB

벨벳 같은 소재를 만들기 위해 기본 색상을 검은색 (또는 어두운 색상)으로 설정할 수 있습니다. 색도 정보는 대신 색에 설정해야 합니다. 데님, 면 등 보다 일반적인 직물을 만들려면 색도를 위해 기본 색상을 사용하고 기본 셰인 색상을 사용하거나 광택을 기본 색의 밝기로 설정합니다.

광택 색상

sheenColor 속성을 사용하여 반사 반사를 직접 수정할 수 있습니다. 천의 모양을 더 잘 제어하고 투톤 반사 머티리얼을 만들 수 있는 기능을 제공합니다.

다음 이미지는 파란색 패브릭과 왼쪽 (오른쪽) 및 광택이 있는(오른쪽) 패브릭을 비교합니다 (더 큰 버전을 보려면 이미지를 클릭).

이면 색상

subsurfaceColor 속성은 물리적 기반이 아니며 특정 유형의 직물에서 산란, 부분 흡수, 빛 재 방출을 시뮬레이션하는 데 사용할 수 있습니다. 이는 부드러운 직물을 만들 때 특히 유용합니다.

다음 이미지는 subsurfaceColor의 효과를 보여줍니다. 흰색 천 (왼쪽 열)과 흰색 갈색 표면 (오른쪽 열)이 있는 흰색 천입니다. 더 크게 보려면 이미지를 클릭하세요.

모델 해제

조명이 꺼진 머티리얼 모델은 모든 조명 계산을 끌 수 있습니다. 주요 목적은 큐브맵, 외부 콘텐츠 (예: 동영상 또는 카메라 스트림), 사용자 인터페이스, 시각화/디버깅과 같은 조명이 꺼진 요소를 렌더링하는 것입니다. 비라이트 모델에서는 아래 표에 설명된 두 가지 속성만 노출됩니다.

속성 정의
기본 색상 표면 완화 색상
분산형 발산된 표면을 시뮬레이션하는 추가 디퓨즈 색상입니다. 이 속성은 블룸 패스가 있는 HDR 파이프라인에서 주로 유용합니다.

각 속성의 유형과 범위는 아래 표에 설명되어 있습니다.

속성 유형 범위 참고
기본 색상 부동 소수점 수 [0..1] 사전 선형 RGB
분산형 부동 소수점 수 rgb=[0..1], a=N/A 사전 곱셈형 선형 RGB, 알파 무시됨

emissive 값은 있으면 단순히 baseColor에 추가됩니다. emissive의 주요 용도는 HDR 파이프라인이 블룸 패스로 구성된 경우 조명이 없는 표면을 강제로 블룸하는 것입니다.

다음 이미지는 디버그 정보를 렌더링하는 데 사용되는 언리트 머티리얼 모델의 예를 보여줍니다 (큰 이미지를 보려면 이미지를 클릭).

색상 처리

선형 색상

색상 데이터가 텍스처에서 제공된 경우 sRGB 텍스처를 사용하여 sRGB에서 선형으로 자동 하드웨어 변환을 활용하세요. 색상 데이터가 머티리얼에 매개변수로 전달되면 각 색상 채널에서 다음 알고리즘을 실행하여 sRGB에서 선형으로 변환할 수 있습니다.

float sRGB_to_linear(float color) {
    return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
}

또는 저렴하지만 정확도가 낮은 두 버전 중 하나를 사용하세요.

// Cheaper
linearColor = pow(color, 2.2);
// Cheapest
linearColor = color * color;

사전 곱하기 알파

RGB 구성요소에 알파 채널이 곱해진 경우 색상은 사전 곱하기 알파를 사용합니다.

// Compute pre-multiplied color
color.rgb *= color.a;

색상이 텍스처에서 샘플링된 경우 사전에 텍스처 데이터가 미리 곱하도록 할 수 있습니다. Android에서는 비트맵에서 업로드된 텍스처가 기본적으로 미리 곱해집니다.