CustomMaterial QML Type

모델 음영에 사용되는 커스텀 머티리얼을 만들기 위한 기본 컴포넌트입니다. 더 보기...

Import Statement: import QtQuick3D
Inherits:

Material

속성

자세한 설명

커스텀 머티리얼을 사용하면 머티리얼에 커스텀 셰이더 코드를 사용하여 그래픽 셰이더 수준에서 프로그래밍할 수 있습니다. 버텍스, 조각 또는 두 가지 셰이더를 모두 제공할 수 있습니다. vertexShaderfragmentShader 속성은 셰이더 스니펫이 포함된 파일을 참조하는 URL이며 ShaderEffect 또는 Image.source 과 매우 유사하게 작동합니다. 사용자 지정 머티리얼에는 fileqrc 체계만 지원됩니다. file 스키마를 생략하여 편리한 방식으로 상대 경로를 지정할 수도 있습니다. 이러한 경로는 컴포넌트( .qml 파일)의 위치를 기준으로 확인됩니다.

사용자 정의 머티리얼에 대한 시작 가이드는 프로그래밍 가능한 머티리얼, 효과, 지오메트리 및 텍스처 데이터 페이지를 참조하세요.

소개

동일한 장면의 다음 버전을 살펴보겠습니다. 왼쪽의 원통은 프로그래밍할 수 없는 기본 제공 머티리얼을 사용하고 있습니다. 이러한 머티리얼은 다양한 프로퍼티를 통해 구성할 수 있지만, 내부에서 생성되는 셰이더에 대한 추가 제어는 없습니다. 오른쪽의 동일한 원통은 이제 애플리케이션에서 제공하는 버텍스 및 조각 셰이더 스니펫을 참조하는 커스텀 머티리얼에 연결됩니다. 이를 통해 버텍스 셰이더에 커스텀 애플리케이션별 로직을 삽입하여 지오메트리를 변형하고 프래그먼트 셰이더에서 커스텀 방식으로 특정 색상 프로퍼티를 결정할 수 있습니다. shaded 커스텀 머티리얼이므로 원통은 여전히 씬 조명에 정상적으로 참여합니다.

View3D {
    anchors.fill: parent
    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(0, 0, 600)
    }
    camera: camera
    DirectionalLight {
        position: Qt.vector3d(-500, 500, -100)
        color: Qt.rgba(0.2, 0.2, 0.2, 1.0)
        ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
    }
    Model {
        source: "#Cylinder"
        eulerRotation: Qt.vector3d(30, 30, 0)
        scale: Qt.vector3d(1.5, 1.5, 1.5)
        materials: [
            DefaultMaterial {
                diffuseColor: Qt.rgba(0, 1, 0, 1)
            }
        ]
    }
}
View3D {
    anchors.fill: parent
    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(0, 0, 600)
    }
    camera: camera
    DirectionalLight {
        position: Qt.vector3d(-500, 500, -100)
        color: Qt.rgba(0.2, 0.2, 0.2, 1.0)
        ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
    }
    Model {
        source: "#Cylinder"
        eulerRotation: Qt.vector3d(30, 30, 0)
        scale: Qt.vector3d(1.5, 1.5, 1.5)
        materials: [
            CustomMaterial {
                vertexShader: "material.vert"
                fragmentShader: "material.frag"
                property real uTime
                property real uAmplitude: 50
                NumberAnimation on uTime { from: 0; to: 100; duration: 10000; loops: -1 }
            }
        ]
    }
}

material.vertmaterial.frag 의 셰이더 스니펫이 다음과 같다고 가정해 보겠습니다:

void MAIN()
{
    VERTEX.x += sin(uTime + VERTEX.y) * uAmplitude;
}
void MAIN()
{
    BASE_COLOR = vec4(0.0, 1.0, 0.0, 1.0);
}

uTimeuAmplitude 은 CustomMaterial 요소의 프로퍼티입니다. 값을 변경하고 정상적으로 애니메이션을 적용할 수 있으며, 개발자의 추가 작업 없이 값이 셰이더에 자동으로 노출됩니다.

그 결과 정점에 애니메이션을 적용하는 원통이 생성됩니다:

두 가지 맛의 커스텀 머티리얼

사용자 정의 머티리얼에는 두 가지 주요 유형이 있습니다. shadingMode 프로퍼티로 지정됩니다. unshaded 사용자 정의 재질에서 조각 셰이더는 장면의 조명, 조명 프로브, 그림자를 무시하고 단일 vec4 색상을 출력합니다. shaded 머티리얼에서 셰이더는 특정 기능을 구현하고 조명 및 그림자 기여도를 고려하기 위해 내장 변수를 사용하여 작업할 것으로 예상됩니다.

기본 선택은 일반적으로 음영 처리된 머티리얼이며, 이는 shadingMode 프로퍼티의 기본값에 반영됩니다. 이는 지오메트리에서 버텍스 또는 기타 입력 데이터를 변환하거나 SCREEN_TEXTURE 또는 DEPTH_TEXTURE 을 샘플링하여 사용자 정의 방식으로 BASE_COLOR 또는 EMISSIVE_COLOR 과 같은 값을 결정해야 하는 머티리얼에 적합하며 씬에서 조명 및 그림자 기여도를 계속 수신합니다. 또한 이러한 머티리얼은 방향성, 포인트 및 기타 조명의 기여도를 계산하는 데 사용되는 방정식을 재정의하고 다시 구현할 수도 있습니다. 애플리케이션에서 제공하는 셰이더 스니펫은 표준 머티리얼에 있는 조명과 같은 기능을 제공하기 위해 Qt Quick 3D 엔진에서 내부적으로 크게 수정되었습니다.

음영 처리되지 않은 머티리얼은 오브젝트의 모양이 사용자 정의 셰이더 코드에 의해 완전히 결정될 때 유용합니다. 이러한 머티리얼의 셰이더는 엔진에 의해 최소한의 추가만 받으므로 최종 조각 색상을 결정하는 것은 전적으로 셰이더에 달려 있습니다. 이는 더 많은 자유를 제공하지만 조명과 같은 씬의 다른 요소와 통합할 수 있는 가능성을 제한하기도 합니다.

참고: 셰이더 코드는 런타임에 Qt에서 사용하는 그래픽 API에 관계없이 항상 Vulkan 스타일의 GLSL을 사용하여 제공됩니다.

참고: 머티리얼에서 제공하는 버텍스 및 프래그먼트 셰이더 코드는 그 자체로 완전한 GLSL 셰이더가 아닙니다. 그보다는 함수 집합을 제공하며, 엔진에서 추가 셰이더 코드로 수정합니다.

셰이더에 데이터 노출

커스텀머티리얼의 동적 프로퍼티는 QML 및 Qt Quick 기능을 사용하여 변경하고 애니메이션을 적용할 수 있으며, 그 값은 셰이더에 자동으로 노출됩니다. 이는 실제로 매우 유사합니다 ShaderEffect. 다음 목록은 프로퍼티가 매핑되는 방법을 보여줍니다:

  • 부울, 정수, 실수 -> 부울, 정수, 실수
  • QColor, color -> vec4, 그리고 색은 QML에 지정된 색상 값에 대해 sRGB 공간을 가정하여 선형으로 변환됩니다. "green" 와 같은 기본 제공 Qt 색도 sRGB 색 공간에 있으며, DefaultMaterial과 PrincipledMaterial 의 모든 색 속성에 대해 동일한 변환이 수행되므로 CustomMaterial의 이러한 동작은 이들과 일치합니다. Qt Quick 과 달리 Qt Quick 3D 의 경우 일반적으로 3D 씬에서 톤 매핑이 수행되므로 선형화가 필수적입니다.
  • QRect, QRectF, rect -> vec4
  • QPoint, QPointF, point, QSize, QSizeF, size -> vec2
  • QVector2D, vector2d -> vec2
  • QVector3D, vector3d -> vec3
  • QVector4D, vector4d -> vec4
  • QMatrix4x4, matrix4x4 -> mat4
  • QQuaternion, quaternion -> vec4, 스칼라 값은 w
  • TextureInput -> TextureInput 의 텍스처 프로퍼티에 Texture 또는 CubeMapTexture 이 사용되는지 여부에 따라 샘플러2D 또는 샘플러큐브입니다. enabled 프로퍼티를 false로 설정하면 셰이더에 더미 텍스처가 노출되므로 셰이더는 여전히 작동하지만 불투명한 검정 이미지 콘텐츠가 있는 텍스처를 샘플링하게 됩니다. 샘플러의 프로퍼티는 항상 Texture 이 아닌 TextureInput 객체를 직접 참조해야 한다는 사실에 주의하세요. Texture 속성의 경우 소스, 타일링 및 필터링 관련 속성만 커스텀 머티리얼에 암시적으로 고려되며, 나머지 속성(예: UV 변환)은 커스텀 셰이더가 적절하다고 판단되는 대로 구현할 수 있습니다.

참고: 셰이더 코드에서 참조된 유니폼에 해당 프로퍼티가 없는 경우 런타임에 머티리얼을 처리할 때 셰이더 컴파일 오류가 발생합니다. 샘플러 유니폼의 경우 해당 QML 프로퍼티가 없을 때 더미 텍스처가 바인딩되는 등 일부 예외가 있지만 일반적으로 모든 유니폼과 샘플러에는 CustomMaterial 오브젝트에 선언된 해당 프로퍼티가 있어야 합니다.

음영 처리되지 않은 커스텀 머티리얼

다음은 unshaded 커스텀 머티리얼의 예시입니다.

CustomMaterial {
    // These properties are automatically exposed to the shaders
    property real time: 0.0
    property real amplitude: 5.0
    property real alpha: 1.0
    property TextureInput tex: TextureInput {
        enabled: true
        texture: Texture { source: "image.png" }
    }

    shadingMode: CustomMaterial.Unshaded
    sourceBlend: alpha < 1.0 ? CustomMaterial.SrcAlpha : CustomMaterial.NoBlend
    destinationBlend: alpha < 1.0 ? CustomMaterial.OneMinusSrcAlpha : CustomMaterial.NoBlend
    cullMode: CustomMaterial.BackFaceCulling

    vertexShader: "customshader.vert"
    fragmentShader: "customshader.frag"
}

위의 예제에서 unshaded 버텍스 및 조각 셰이더 스니펫은 다음과 같이 보일 수 있습니다. 셰이더가 유니폼이나 버텍스 입력을 선언하지 않으며, 최종 셰이더 코드를 어셈블할 때 Qt가 처리하므로 선언해서는 안 된다는 점에 유의하세요.

VARYING vec3 pos;
VARYING vec2 texcoord;

void MAIN()
{
    pos = VERTEX;
    pos.x += sin(time * 4.0 + pos.y) * amplitude;
    texcoord = UV0;
    POSITION = MODELVIEWPROJECTION_MATRIX * vec4(pos, 1.0);
}
VARYING vec3 pos;
VARYING vec2 texcoord;

void MAIN()
{
    vec4 c = texture(tex, texcoord);
    FRAGCOLOR = vec4(pos.x * 0.02, pos.y * 0.02, pos.z * 0.02, alpha) * c;
}

다음과 같은 특수 대문자 키워드를 사용할 수 있습니다:

  • MAIN -> 버텍스 또는 조각 셰이더 스니펫의 진입점 이름은 항상 MAIN 이어야 합니다. 셰이딩되지 않은 커스텀 머티리얼의 셰이더 스니펫에서 이 함수를 제공해야 합니다.
  • VARYING -> 버텍스 셰이더의 출력 또는 프래그먼트 셰이더의 입력을 선언합니다.
  • POSITION -> 버텍스 셰이더의 출력, vec4
  • FRAGCOLOR -> 프래그먼트 셰이더의 출력, vec4. 셰이딩되지 않은 커스텀 머티리얼에만 사용할 수 있습니다.
  • VERTEX -> vec3, 버텍스 셰이더의 버텍스 위치.
  • NORMAL -> vec3, 버텍스 셰이더의 버텍스 노멀입니다. 연결된 모델의 메시가 노멀을 제공하지 않는 경우, 값은 vec3(0.0)입니다.
  • UV0 -> vec2, 버텍스 셰이더의 첫 번째 텍스처 좌표 세트. 연결된 모델의 메시가 텍스처 좌표를 제공하지 않는 경우, 값은 vec2(0.0)입니다.
  • UV1 -> 버텍스 셰이더의 두 번째 텍스처 좌표 세트인 vec2. 연결된 모델의 메시가 두 번째 텍스처 좌표 세트를 제공하지 않는 경우, 값은 vec2(0.0)입니다.
  • COLOR -> 버텍스 셰이더의 버텍스 색상인 vec4입니다. 연결된 모델의 메시가 버텍스별 색을 제공하지 않는 경우, 값은 vec4(1.0)입니다.
  • TANGENT -> 버텍스 셰이더의 탄젠트, vec3. 연결된 모델의 메시가 탄젠트 데이터를 제공하지 않는 경우, 값은 vec3(0.0)입니다.
  • 바이노멀 -> 버텍스 셰이더의 바이노멀, vec3. 연결된 모델의 메시가 바이노멀 데이터를 제공하지 않는 경우, 값은 vec3(0.0)입니다.
  • JOINTS -> ivec4, 버텍스 셰이더의 조인트 인덱스. 연결된 모델의 메시가 조인트 인덱스 데이터를 제공하지 않는 경우, 값은 ivec4(0)입니다.
  • WEIGHTS -> vec4, 버텍스 셰이더의 조인트 가중치. 연결된 모델의 메시가 조인트 가중치 데이터를 제공하지 않는 경우, 값은 vec4(0.0)입니다.
  • MORPH_POSITION(n) -> vec3, 버텍스 셰이더의 n+1번째모프 타깃 위치. 관련 모델은 적절한 데이터를 제공해야 합니다.
  • MORPH_NORMAL(n) -> 버텍스 셰이더의 n+1번째모프 타깃 노멀, vec3. 연관된 모델은 적절한 데이터를 제공해야 합니다.
  • MORPH_TANGENT(n) -> 버텍스 셰이더의 n+1번째모프 타깃 탄젠트, vec3. 연관된 모델은 적절한 데이터를 제공해야 합니다.
  • MORPH_BINORMAL(n) -> 버텍스 셰이더의 n+1번째모프 타깃 바이노멀, vec3. 연관된 모델은 적절한 데이터를 제공해야 합니다.
  • MODELVIEWPROJECTION_MATRIX -> mat4, 모델 뷰 투영 행렬. 투영 행렬은 런타임에 사용되는 그래픽 API에 따라 Y축 방향과 클립 깊이에 대한 기본 제공 변환이 있는 OpenGL 규칙을 항상 따릅니다.
  • 뷰 프로젝션 매트릭스, 뷰 프로젝션 매트릭스인 mat4 -> mat4
  • PROJECTION_MATRIX -> mat4, 투영 행렬
  • INVERSE_PROJECTION_MATRIX -> mat4, 역 투영 행렬
  • VIEW_MATRIX -> mat4, 뷰(카메라) 매트릭스
  • MODEL_MATRIX -> mat4, 모델(월드) 매트릭스
  • NORMAL_MATRIX -> mat3, 노멀 행렬(모델 행렬의 왼쪽 상단 3x3 부분의 역의 전치)
  • BONE_TRANSFORMS -> mat4[], 모델의 본 매트릭스 배열
  • BONE_NORMAL_TRANSFORMS -> mat3[], 모델의 본 노멀 행렬 배열(각 본 행렬의 왼쪽 상단 3x3 부분의 역의 전치)
  • 모프 가중치 배열인 float[] -> 모프 가중치 배열. 연관된 모델은 적절한 데이터를 제공해야 합니다. 안전을 위해 QT_MORPH_MAX_COUNT는 이 배열의 크기로 정의됩니다.
  • CAMERA_POSITION -> vec3, 월드 스페이스에서의 카메라 위치
  • CAMERA_DIRECTION -> vec3, 카메라 방향 벡터
  • CAMERA_PROPERTIES -> vec2, 카메라의 근거리 및 원거리 클립 값
  • POINT_SIZE -> float, 버텍스 셰이더에서만 쓰기 가능. 점의 토폴로지가 있는 지오메트리를 렌더링할 때 사용자 정의 버텍스 셰이더는 음영 및 비음영 사용자 정의 머티리얼 모두에서 이 값을 1.0 또는 다른 값으로 설정해야 합니다. 1 이외의 크기 지원에 대한 자세한 내용은 PrincipledMaterial::pointSize 을 참조하세요.

음영 처리된 커스텀 머티리얼

shaded 머티리얼 augments 에서 생성되는 셰이더 코드 PrincipledMaterial. 음영 처리되지 않은 머티리얼과 달리 버텍스 및 조각 셰이더 주요 기능에 대한 거의 모든 로직을 자체적으로 제공하므로 조명, 그림자, 전역 조명 등에 대한 생성된 코드를 추가할 수 없습니다, 셰이딩 머티리얼은 마치 CustomMaterial이 PrincipledMaterial. 버텍스 및 프래그먼트 셰이더 스니펫은 특정 지점에서 호출되는 옵션 함수를 제공하여 조명 및 최종 조각 색을 계산하는 데 사용되는 색상 및 기타 값을 사용자 정의할 수 있도록 합니다.

음영 사용자 정의 머티리얼의 조각 셰이더는 MAIN 함수 하나만 구현하는 것이 아니라 여러 함수를 구현할 수 있습니다. MAIN 를 포함한 모든 함수는 음영 처리된 커스텀 머티리얼에서 구현할 수 있는 선택 사항입니다. 빈 셰이더 스니펫을 사용하거나 vertexShader 또는 fragmentShader 프로퍼티를 전혀 지정하지 않는 것도 완벽하게 유효할 수 있습니다.

셰이딩된 커스텀 머티리얼의 버텍스 셰이더 스니펫

버텍스 셰이더 스니펫에서 구현할 수 있는 함수는 다음과 같습니다:

  • void MAIN() 이 함수는 버텍스 셰이더의 vec4 출력인 POSITION 의 값을 설정하고, 선택적으로 VERTEX, COLOR, NORMAL, UV0, UV1, TANGENT, BINORMAL, JOINTS, WEIGHTS 의 값을 수정하기 위해 호출됩니다. 셰이딩되지 않은 머티리얼과 달리, 여기에 쓰면 수정된 값이 생성된 나머지 셰이더 코드에서 고려되므로 의미가 있습니다(셰이딩되지 않은 머티리얼의 경우 추가 셰이더 코드가 생성되지 않음). 예를 들어 커스텀 버텍스 셰이더가 버텍스 또는 노멀을 배치하는 경우 나중에 올바른 조명 계산을 위해 수정된 값을 VERTEX 또는 NORMAL 에 저장해야 합니다. 또한 이 함수는 보간된 데이터를 조각 셰이더에 전달하기 위해 VARYING 로 정의된 변수에 쓸 수 있습니다. 이 함수 또는 POSITION 의 재정의가 없는 경우 POSITIONVERTEXMODELVIEWPROJECTION_MATRIX 을 기반으로 계산되며, PrincipledMaterial 과 마찬가지로 계산됩니다.

    예를 들어, 유니폼으로 노출된 QML 프로퍼티에 의존하고 데이터를 조각 셰이더로 전달합니다:

    VARYING vec3 vNormal;
    VARYING vec3 vViewVec;
    
    void MAIN()
    {
        VERTEX.x += sin(uTime * 4.0 + VERTEX.y) * uAmplitude;
        vNormal = normalize(NORMAL_MATRIX * NORMAL);
        vViewVec = CAMERA_POSITION - (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
        POSITION = MODELVIEWPROJECTION_MATRIX * vec4(VERTEX, 1.0);
    }

    참고: 위의 예제에서 POSITION 에 값을 할당하는 것은 선택 사항이며, 이 경우의 사용법은 기본 동작과 동일합니다.

참고: 버텍스에서 조각 단계로 보간 없이 데이터를 전달하려면 VARYING 선언의 유형 앞에 flat 키워드를 추가하세요.

셰이딩된 커스텀 머티리얼의 조각 셰이더 스니펫

다음 함수는 조각 셰이더 스니펫에서 구현할 수 있습니다:

  • void MAIN() 이 함수는 특수 쓰기 가능 변수 BASE_COLOR, METALNESS, ROUGHNESS, SPECULAR_AMOUNT, NORMAL, CLEARCOAT_FRESNEL_POWER, CLEARCOAT_FRESNEL_SCALE, CLEARCOAT_FRESNEL_BIAS의 값을 설정하기 위해 호출됩니다, CLEARCOAT_AMOUNT, CLEARCOAT_ROUGHNESS, CLEARCOAT_NORMAL, FRESNEL_BIAS, FRESNEL_SCALE, FRESNEL_POWER, IOR, TRANSMISSION_FACTOR, THICKNESS_FACTOR, ATTENUATION_COLOR, ATTENUATION_DISTANCE 및 OCCLUSION_AMOUNT.

    일반적인 사용 사례 중 하나는 기본 색상 맵, SCREEN_TEXTURE, 또는 다른 종류의 소스 등 텍스처 샘플링을 기반으로 BASE_COLOR 의 값을 설정하는 것입니다. 이는 특히 사용자 정의 조명 프로세서 기능이 구현되지 않은 경우에 유용하고 편리할 수 있습니다. BASE_COLOR.a 을 기본값 1.0이 아닌 다른 값으로 설정하면 조각의 최종 알파 값에 영향을 줄 수 있습니다. (이 경우 sourceBlenddestinationBlend 에서 알파 블렌딩도 활성화해야 하는 경우가 많습니다.)

    또 다른 시나리오는 사용자 지정 SPECULAR_LIGHT 함수가 제공되지 않거나 SceneEnvironment 에 광원 프로브가 설정된 경우입니다. 스페큘러 기여도 계산에 영향을 미치는 금속성, 거칠기 및 기타 값은 MAIN 에서 원하는 사용자 지정 값으로 설정할 수 있습니다.

    이 함수는 다음과 같은 특수 변수에 쓸 수 있습니다. 여기에 기록되는 값은 일반적으로 하드코딩되거나 유니폼에 매핑된 QML 프로퍼티를 기반으로 계산됩니다. 의미는 PrincipledMaterial 와 동일합니다.

    • vec4 BASE_COLOR - 기본 색상 및 머티리얼 알파 값입니다. built-in materials' color property 에 해당합니다. 광원 프로세서 기능이 구현되지 않은 경우 기본 조명 계산에 고려되므로 MAIN 에서 사용자 지정 기본 색상을 설정하는 것이 편리할 수 있습니다. 기본값은 vec4(1.0) 으로 알파가 1.0인 흰색을 의미합니다. 알파 값은 조각의 최종 알파에 영향을 줍니다. 최종 알파 값은 객체(모델) 불투명도에 기본 색상 알파를 곱한 값입니다. QML의 색상 속성에서 노출된 균일한 값에 의존하지 않고 셰이더 코드에서 직접 값을 지정할 때는 필요한 경우 sRGB에서 선형 변환을 수행하는 것은 셰이더의 몫이라는 점에 유의하세요. 예를 들어 vec3 colorfloat alpha 을 가정하면 다음과 같이 변환할 수 있습니다:
      float C1 = 0.305306011;
      vec3 C2 = vec3(0.682171111, 0.682171111, 0.682171111);
      vec3 C3 = vec3(0.012522878, 0.012522878, 0.012522878);
      BASE_COLOR = vec4(rgb * (rgb * (rgb * C1 + C2) + C3), alpha);
    • vec3 EMISSIVE_COLOR - 자체 조명의 색상. built-in materials's emissiveFactor propertybuilt-in materials's emissiveMap property 으로 결합되는 내장 머티리얼의 발광 색상에 해당합니다. 기본값은 vec3(0.0) 입니다. QML의 색상 속성에서 노출되는 균일한 값에 의존하지 않고 셰이더 코드에서 직접 값을 지정할 때는 필요한 경우 sRGB를 선형 변환하는 것은 셰이더에 달려 있다는 점에 유의하세요.
    • float IOR 머티리얼의 굴절률을 지정합니다. 일반적인 값이자 기본값은 PrincipledMaterial 에서 사용하는 값인 1.5 입니다.
    • float TRANSMISSION_FACTOR 반투명도를 지정합니다. 일반적인 값은 1.0 이며 기본값은 0.0 으로 PrincipledMaterial 이 사용됩니다.
    • float THICKNESS_FACTOR 반투명 재질 두께의 양을 지정합니다. 일반적인 값은 10.0 이며 기본값은 0.0 으로 PrincipledMaterial 이 사용됩니다.
    • vec3 ATTENUATION_COLOR 거리에 따른 반투명 머티리얼의 색상 변화를 지정합니다. 일반적인 값은 vec3(1.0, 0.0, 0.0) 이며 기본값은 PrincipledMaterial 이므로 vec3(1.0) 입니다.
    • float ATTENUATION_DISTANCE 반투명 머티리얼의 거리별 색상 변화 감쇠를 지정합니다. 일반적인 값은 100.0 이며 기본값은 0.0 으로 PrincipledMaterial 이 사용됩니다.
    • float METALNESS 0.0 - 1.0 범위의 금속성 양입니다. 기본값은 0입니다. 0이 아닌 값으로 설정해야 효과를 발휘합니다.
    • float ROUGHNESS 0.0 - 1.0 범위의 거칠기 값입니다. 기본값은 0입니다.
    • float CLEARCOAT_FRESNEL_POWER 클리어코트 레이어의 프레넬 파워를 지정합니다. 일반적인 값이자 기본값은 PrincipledMaterial 에서 사용하는 값인 5.0 입니다.
    • float CLEARCOAT_FRESNEL_SCALE 클리어코트 레이어의 프레넬 스케일을 지정합니다. 일반적인 값이자 기본값인 1.0PrincipledMaterial 과 같은 값입니다.
    • float CLEARCOAT_FRESNEL_BIAS 클리어코트 레이어의 프레넬 바이어스를 지정합니다. 일반적인 값이자 기본값인 0.0PrincipledMaterial 과 같은 값입니다.
    • float CLEARCOAT_AMOUNT 머티리얼 위에 클리어코트 레이어의 양을 지정합니다. 일반적인 값은 1.0 이며 기본값은 PrincipledMaterial 이므로 0.0 입니다.
    • float CLEARCOAT_ROUGHNESS 클리어코트 레이어의 거칠기를 지정합니다. 일반적인 값은 완전히 흐릿한 클리어코트 레이어의 경우 1.0, 기본값은 0.0 ( PrincipledMaterial )입니다.
    • vec3 CLEARCOAT_NORMAL - 월드 스페이스의 버텍스 셰이더에서 가져온 클리어코트 레이어 노멀입니다. 이 프로퍼티의 초기 값은 VAR_WORLD_NORMAL 와 같지만 CLEARCOAT_NORMAL 의 값만 변경하면 클리어코트 레이어 노멀에 영향을 미칩니다.
    • float FRESNEL_POWER 프레넬 파워를 지정합니다. 일반적인 값이자 기본값은 PrincipledMaterial 에서 사용하는 값인 5.0 입니다.
    • float FRESNEL_SCALE 프레넬 스케일을 지정합니다. 일반적인 값이자 기본값은 PrincipledMaterial 에서 사용하는 1.0 입니다.
    • float FRESNEL_BIAS 프레넬 바이어스를 지정합니다. 일반적인 값이자 기본값은 0.0 이며 PrincipledMaterial 이 사용됩니다.
    • float SPECULAR_AMOUNT 0.0 - 1.0 범위의 스페큘러 양을 지정합니다. 기본값은 PrincipledMaterial::specularAmount 과 일치하는 0.5 입니다. 0이 아닌 값으로 설정해야 효과가 있습니다.
    • float OCCLUSION_AMOUNT AO 계수를 지정합니다. 일반적인 값이자 기본값인 1.0PrincipledMaterial 이 사용하는 값입니다.
    • vec3 NORMAL - 월드 스페이스의 버텍스 셰이더에서 나오는 노멀입니다. 이 프로퍼티의 초기 값은 VAR_WORLD_NORMAL 와 같지만 NORMAL 값만 변경하면 라이팅에 영향을 미칩니다.
    • vec3 TANGENT - 월드 스페이스의 버텍스 셰이더에서 나오는 탄젠트입니다. 이 값은 양면성을 위해 잠재적으로 조정될 수 있습니다.
    • vec3 BINORMAL - 월드 스페이스의 버텍스 셰이더에서 나오는 바이노멀입니다. 이 값은 양면성을 위해 잠재적으로 조정될 수 있습니다.
    • vec2 UV0 - 버텍스 셰이더의 첫 번째 텍스처 좌표 세트입니다. 이 프로퍼티는 프래그먼트 셰이더에서 읽기 전용입니다.
    • vec2 UV1 - 버텍스 셰이더의 두 번째 텍스처 좌표 세트입니다. 이 프로퍼티는 프래그먼트 셰이더에서 읽기 전용입니다.

    참고: 셰이딩되지 않은 머티리얼과 달리 셰이딩된 머티리얼의 MAIN 조각은 FRAGCOLOR 을 직접 제어할 수 없습니다. 대신 조명 프로세서 함수에 기록된 DIFFUSESPECULAR 값에 따라 최종 조각 색상이 결정됩니다. 광원 프로세서 함수가 구현되지 않은 경우 관련 기본 음영 계산은 PrincipledMaterial 에서와 같이 BASE_COLOR 및 위 목록의 다른 값을 고려하여 수행됩니다.

    간단한 메탈릭 커스텀 머티리얼 셰이더의 예는 다음과 같습니다:

    void MAIN()
    {
        METALNESS = 1.0;
        ROUGHNESS = 0.5;
        FRESNEL_POWER = 5.0;
    }

    텍스처를 샘플링하여 기본 색상과 알파를 설정하는 또 다른 예시입니다:

    VARYING vec2 texcoord;
    void MAIN()
    {
        BASE_COLOR = texture(uColorMap, texcoord);
    }
  • void AMBIENT_LIGHT() 이 함수는 각 조각에 대해 한 번씩 호출됩니다. 이 함수의 작업은 쓰기 가능한 특수 변수 DIFFUSE 에 총 앰비언트 기여도를 더하는 것입니다. 물론 다른 값을 계산하거나 DIFFUSE 을 전혀 건드리지 않도록 선택할 수도 있습니다(주변 조명을 완전히 무시하기 위해). 이 함수가 전혀 없는 경우, 주변광 기여도는 PrincipledMaterial 처럼 정상적으로 계산됩니다.

    이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec3 DIFFUSE 조각별로 확산광 기여도를 누적합니다. 값을 덮어쓰면 다른 광원의 기여도가 손실되므로 광원 처리 함수는 일반적으로 (+=)를 추가합니다.

    이 함수는 위 표의 행렬(예: MODEL_MATRIX) 및 벡터(예: CAMERA_POSITION) 유니폼 외에도 다음과 같은 특수 변수를 읽을 수 있습니다

    • . vec3 TOTAL_AMBIENT_COLOR 장면의 총 앰비언트 기여도.

    예:

    void AMBIENT_LIGHT()
    {
        DIFFUSE += TOTAL_AMBIENT_COLOR;
    }
  • void DIRECTIONAL_LIGHT() 이 함수는 장면의 각 활성 디렉셔널 라이트에 대해 각 조각에 대해 호출됩니다. 이 함수의 작업은 쓰기 가능한 특수 변수 DIFFUSE 에 디퓨즈 기여도를 추가하는 것입니다. 이 함수는 아무것도 하지 않도록 선택할 수도 있으며, 이 경우 디렉셔널 라이트의 디퓨즈 기여도는 무시됩니다. 함수가 전혀 존재하지 않는 경우, 방향광의 확산 기여도는 PrincipledMaterial 처럼 정상적으로 누적됩니다.

    이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec3 DIFFUSE 조각별로 확산광 기여도를 누적합니다.
    • 값을 덮어쓰면 다른 광원의 기여도가 손실되므로 광원 처리 함수는 일반적으로 (+=
    )
    • 를 추가합니다.

    이 함수는 위 표의 행렬(예: MODEL_MATRIX) 및 벡터(예: CAMERA_POSITION

    )

    균등 외에도 다음과 같은 특수 변수를 읽을 수 있습니다:

    • vec3 LIGHT_COLOR 확산광 색상.
    • float SHADOW_CONTRIB 그림자 기여도, 또는 1.0(그림자가 전혀 없거나 그림자를 받지 않는 경우).
    • vec3 TO_LIGHT_DIR 광원을 가리키는 벡터.
    • vec3 NORMAL 월드 스페이스의 노멀 벡터.
    • vec4 BASE_COLOR 베이스 컬러 및 머티리얼 알파 값.
    • float METALNESS 메탈니스 양.
    • float ROUGHNESS 러프니스 양.

    예:

    void DIRECTIONAL_LIGHT()
    {
        DIFFUSE += LIGHT_COLOR * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR)));
    }
  • void POINT_LIGHT() 이 함수는 장면의 각 활성 포인트 라이트에 대해 각 조각마다 호출됩니다. 이 함수의 작업은 쓰기 가능한 특수 변수 DIFFUSE 에 디퓨즈 기여도를 추가하는 것입니다. 이 함수는 아무것도 하지 않도록 선택할 수도 있으며, 이 경우 포인트 라이트의 디퓨즈 기여도는 무시됩니다. 함수가 전혀 존재하지 않으면 포인트 라이트의 디퓨즈 기여도는 PrincipledMaterial 처럼 정상적으로 누적됩니다.

    이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec3 DIFFUSE 조각별로 디퓨즈 라이트 기여도를 누적합니다.

    이 함수는 위 표의 행렬(예: MODEL_MATRIX

    )

    및 벡터(예: CAMERA_POSITION

    )

    유니폼 외에도 다음 특수 변수를 읽을 수 있습니다:

    • vec3 LIGHT_COLOR 디퓨즈 라이트 색상.
    • float LIGHT_ATTENUATION 빛 감쇠.
    • float SHADOW_CONTRIB 그림자 기여도(그림자가 전혀 없거나 그림자를 받지 않는 경우 1.0).
    • vec3 TO_LIGHT_DIR 광원을 가리키는 벡터.
    • vec3 NORMAL 월드 공간의 일반 벡터.
    • vec4 BASE_COLOR 기본 색상 및 재질 알파 값.
    • float METALNESS 메탈니스 양.
    • float ROUGHNESS 러프니스 양.

    예:

    void POINT_LIGHT()
    {
        DIFFUSE += LIGHT_COLOR * LIGHT_ATTENUATION * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR)));
    }
  • void SPOT_LIGHT() 이 함수는 장면의 각 조각에 대한 각 활성 스포트 라이트에 대해 호출됩니다. 이 함수의 작업은 쓰기 가능한 특수 변수 DIFFUSE 에 디퓨즈 기여도를 추가하는 것입니다. 이 함수는 아무것도 하지 않도록 선택할 수도 있으며, 이 경우 스포트 라이트의 디퓨즈 기여도는 무시됩니다. 함수가 전혀 존재하지 않으면 PrincipledMaterial 처럼 스포트 라이트의 확산 기여도가 정상적으로 누적됩니다.

    이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec3 DIFFUSE 조각별로 확산 조명 기여도를 누적합니다.

    이 함수는 위 표의 행렬(예: MODEL_MATRIX) 및 벡터(예: CAMERA_POSITION

    )

    유니폼 외에도 다음 특수 변수를 읽을 수 있습니다:

    • vec3 LIGHT_COLOR 확산 조명 색상.
    • float LIGHT_ATTENUATION 빛 감쇠.
    • float SHADOW_CONTRIB 그림자 기여도(그림자가 전혀 없거나 그림자를 받지 않는 경우 1.0).
    • vec3 TO_LIGHT_DIR 광원을 가리키는 벡터.
    • float SPOT_FACTOR 스포트 라이트 계수.
    • vec3 NORMAL 월드 스페이스의 노멀 벡터.
    • vec4 BASE_COLOR 베이스 컬러 및 머티리얼 알파 값.
    • float METALNESS 메탈니스 양.
    • float ROUGHNESS 러프니스 양.

    예:

    void SPOT_LIGHT()
    {
        DIFFUSE += LIGHT_COLOR * LIGHT_ATTENUATION * SPOT_FACTOR * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR)));
    }
  • void SPECULAR_LIGHT() 이 함수는 씬의 각 활성 조명에 대해 각 조각에 대해 호출됩니다. 이 함수의 작업은 스페큘러 기여도를 쓰기 가능한 특수 변수 SPECULAR 에 추가하는 것입니다. 이 함수는 아무것도 하지 않도록 선택할 수도 있으며, 이 경우 라이트의 스페큘러 기여도는 무시됩니다. 함수가 전혀 존재하지 않으면 PrincipledMaterial 처럼 라이트의 스페큘러 기여도가 정상적으로 누적됩니다.

    이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec3 SPECULAR 프레임당 스페큘러 라이트 기여도를 누적합니다.
    • 값을 덮어쓰면 다른 광원의 기여도가 손실되므로 광원 처리 함수는 일반적으로 (+=
    )
    • 를 추가합니다.

    이 함수는 위 표의 행렬(예: MODEL_MATRIX

    )

    과 벡터(예: CAMERA_POSITION

    )

    균등 외에도 다음과 같은 특수 변수를 읽을 수 있습니다:

    • vec3 LIGHT_COLOR 스페큘러 라이트 컬러.
    • float LIGHT_ATTENUATION 라이트 감쇠
    • .
    • 디렉셔널 라이트의 경우 값은 1.0입니다.
    • 스포트 라이트의 경우 값은 void SPOT_LIGHT()LIGHT_ATTENUATION * SPOT_FACTOR 와 동일합니다
    • .
    • float SHADOW_CONTRIB 그림자 기여도, 그림자가 전혀 없거나 그림자를 받지 않는 경우 1.0.
    • vec3 FRESNEL_CONTRIB 내장된 프레넬 계산의 프레넬 기여도.
    • vec3 TO_LIGHT_DIR 광원을 가리키는 벡터.
    • vec3 NORMAL 월드 공간의 노멀 벡터.
    • vec4 BASE_COLOR 베이스 컬러 및 머티리얼 알파 값.
    • float METALNESS 메탈니스 양.
    • float ROUGHNESS 러프니스 양.
    • float SPECULAR_AMOUNT 스페큘러 양입니다
    • .
    • 이 값은 0.0에서 1.0 사이로 커스텀 MAIN 함수에 설정된 값과 동일합니다. 이 값은 FRESNEL_CONTRIB 에서 제공하는 내장 프레넬 기여도를 사용하지 않을 때 프레넬 기여도를 계산하는 데 유용합니다
  • .
  • void SPECULAR_LIGHT()
    {
        vec3 H = normalize(VIEW_VECTOR + TO_LIGHT_DIR);
        float cosAlpha = max(0.0, dot(H, normalize(NORMAL)));
        float shine = pow(cosAlpha, exp2(15.0 * (1.0 - ROUGHNESS) + 1.0) * 0.25);
        SPECULAR += shine * LIGHT_COLOR * FRESNEL_CONTRIB * SHADOW_CONTRIB * LIGHT_ATTENUATION;
    }
  • void POST_PROCESS() 이 함수는 조각 파이프라인이 끝날 때 호출됩니다. 이 함수의 작업은 최종 디퓨즈, 스페큘러 및 이미시브 텀으로 COLOR_SUM 을 마무리하는 것입니다. 음영 처리되지 않은 머티리얼의 FRAGCOLOR 과 달리 COLOR_SUM 은 프레임버퍼에 기록되기 전에 자동으로 톤 매핑됩니다. 디버깅 목적으로 색상으로 취급해서는 안 되는 값을 출력하는 것이 유용할 때가 있습니다. 이 값을 왜곡하는 톤 매핑을 방지하려면 tonemapMode 속성을 TonemapModeNone 으로 설정하여 비활성화할 수 있습니다.

    이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec4 COLOR_SUM 조각 셰이더의 출력.
    • 기본값은

    다음과 같은 특수 변수를 읽을 수 있습니다.

    • vec4 DIFFUSE 프래그먼트 파이프라인의 최종 디퓨즈 텀.
    • vec3 SPECULAR 프래그먼트 파이프라인의 최종 스페큘러 텀
    • .
    • vec3 EMISSIVE 조각 파이프라인의 최종 이미시브
    • 텀. vec2 UV0 - 버텍스 셰이더의 첫 번째 텍스처 좌표 세트.
    • vec2 UV1 - 버텍스 셰이더의 두 번째 텍스처 좌표 세트.
    void POST_PROCESS()
    {
        float center_x = textureSize(SCREEN_TEXTURE, 0).x * 0.5;
        if (gl_FragCoord.x > center_x)
            COLOR_SUM = DIFFUSE;
        else
            COLOR_SUM = vec4(EMISSIVE, DIFFUSE.a);
    }
  • void IBL_PROBE() 이 함수가 있는 경우 IBL(이미지 기반 조명)에 대해 호출됩니다.

    이 함수의

    작업은 쓰기 가능한 특수 변수 DIFFUSESPECULAR 에 IBL의 확산 및 스페큘러 기여도를 모두 추가하는 것입니다

    . 이 함수는 다음 특수 변수에 쓸 수 있습니다:

    • vec3 DIFFUSE 조각당 확산광 기여도를 누적합니다.
    • vec3 SPECULAR 프레임당 스페큘러광 기여도를 누적합니다
    • .

    이 함수는 다음과 같은 특수 변수를 읽을 수 있습니다.

    • vec4 BASE_COLOR 기본 색상 및 머티리얼 알파 값.
    • float AO_FACTOR 스크린 공간 오클루전 계수.
    • float SPECULAR_AMOUNT 스페큘러 양.
    • float ROUGHNESS 조각 파이프라인의 최종 이미시브 항.
    • vec3 NORMAL 월드 공간의 일반 벡터.
    • vec3 VIEW_VECTOR 카메라를 향한
    • 방향
    • .
    • mat3 IBL_ORIENTATION 라이트 프로브의 방향. SceneEnvironment::probeOrientation 에서 가져옵니다
  • .
  • void IBL_PROBE()
    {
        vec3 smpDir = IBL_ORIENTATION * NORMAL;
        DIFFUSE += AO_FACTOR * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, smpDir, IBL_MAXMIPMAP).rgb;
    }

함수 간 커스텀 변수

MAIN 함수에서 다른 함수로 추가 변수를 전달할 수 있습니다. SHARED_VARS 키워드는 새로운 사용자 정의 변수를 정의하는 데 사용할 수 있습니다. 이러한 사용자 정의 변수는 SHARED.<변수 이름>으로 액세스할 수 있습니다.

예를 들어 음영 처리된 사용자 정의 머티리얼은 MAIN에서 공유 값을 가져와 다른 함수에서 사용할 수 있습니다.

SHARED_VARS {
    vec3 colorThreshold;
};
void MAIN()
{
    BASE_COLOR = texture(baseColorMap, UV0);
    SHARED.colorThreshold = texture(thresholdMap, UV0).rgb;
}
void DIRECTIONAL_LIGHT()
{
    if (DIFFUSE >= SHARED.colorThreshold) {
        DIFFUSE = SHARED.colorThreshold;
        return;
    }
    DIFFUSE += LIGHT_COLOR * SHADOW_CONTRIB;
}

참고: SHARED는 POST_PROCESS 없이 모든 함수에 쓸 수 있지만, MAIN에 쓰고 다른 함수에서 읽는 것이 안전합니다.

참고: LIGHT 함수에 SHARED를 쓰는 권장 사용 사례는 먼저 MAIN에서 재설정하고 각 LIGHT 함수에 누적하는 것입니다.

SHARED_VARS {
    float sheenIntensity;
    float sheenRoughness;
    vec3 sheenColor;
    vec3 outSheenColor;
};
void MAIN()
{
    ...
    vec4 tex = texture(uSheenMap, UV0);
    SHARED.sheenColor = tex.rgb;
    SHARED.sheenIntensity = tex.a;
    SHARED.sheenRoughness = uSheenRoughness;
    SHARED.outSheenColor = vec3(0.0);
}
void SPECULAR_LIGHT()
{
    SHARED.outSheenColor += ...;
}
void POST_PROCESS()
{
    COLOR_SUM = DIFFUSE + SPECULAR + EMISSIVE + SHARED.outSheenColor;
}

참고: MAIN은 다른 함수보다 먼저 호출되고 POST_PROCESS는 다른 모든 함수보다 나중에 호출되지만, 라이트 프로세서의 경우 다른 순서는 보장되지 않습니다.

추가 특수 키워드

커스텀 프래그먼트 셰이더 코드는 유니폼(예: CAMERA_DIRECTION 또는 CAMERA_POSITION)과 커스텀 버텍스 셰이더에서 전달된 변수에 자유롭게 액세스할 수 있습니다. 또한 특수 키워드로 사용할 수 있는 여러 가지 기본 제공 변형이 있습니다. 이 중 일부는 버텍스 MAIN 가 자체적으로 계산하여 전달할 수 있다는 점에서 선택 사항이지만, 중복된 데이터 조각 셰이더를 줄이기 위해 이러한 내장 기능을 대신 사용할 수도 있습니다. 이러한 내장 기능은 광원 프로세서 함수와 프래그먼트 MAIN에서 사용할 수 있습니다.

  • vec3 VAR_WORLD_NORMAL - NORMAL_MATRIX 에 의해 보간된 노멀 변환.
  • vec3 VAR_WORLD_TANGENT - MODEL_MATRIX 에 의해 변환된 보간 탄젠트.
  • vec3 VAR_WORLD_BINORMAL - 다음으로 변환된 보간된 이항 노멀 MODEL_MATRIX
  • vec3 NORMAL - 보간된 노멀을 그대로 사용하는 VAR_WORLD_NORMAL 과 달리, 이 값은 양면성을 위해 조정될 수 있습니다: 컬링을 비활성화한 상태로 렌더링할 경우 필요에 따라 노멀이 반전됩니다. 따라서 모든 컬링 모드에서 올바르게 작동하려면 조명 및 기타 계산에 VAR_WORLD_NORMAL 대신 NORMAL 을 사용하는 것이 좋습니다.
  • vec3 TANGENT - NORMAL 과 마찬가지로 이 값은 양면성을 위해 조정될 수 있습니다. 컬링을 비활성화한 상태로 렌더링할 때 필요에 따라 탄젠트가 반전됩니다.
  • vec3 BINORMAL - NORMAL 과 마찬가지로 이 값은 양면성을 위해 조정될 수 있습니다. 컬링을 비활성화한 상태로 렌더링할 때 필요에 따라 이항이 반전됩니다.
  • vec3 VAR_WORLD_POSITION - 보간된 월드 스페이스 버텍스 위치 ((MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz)
  • vec4 VAR_COLOR - 메시에서 색이 제공된 경우 보간된 버텍스 색. 그렇지 않으면 vec4(1.0).
  • vec3 VIEW_VECTOR - 카메라를 가리킵니다. 이는 사실상 정규화된 CAMERA_POSITION - VAR_WORLD_POSITION 벡터입니다.
  • vec4 FRAGCOORD - 현재 조각의 창 상대 좌표를 포함합니다.
  • float FRAMEBUFFER_Y_UP - 프레임버퍼(텍스처)의 좌표계에서 Y축이 위쪽을 가리킬 때 값은 1, 즉 (0, 0) 왼쪽 하단 모서리입니다. Y축이 아래를 가리키면 값은 -1, 즉 (0, 0) 이 왼쪽 상단 모서리입니다. 기본 그래픽 API의 이러한 차이는 대부분의 커스텀 머티리얼에는 적용되지 않습니다. 한 가지 주목할 만한 예외는 FRAGCOORD 을 기반으로 하지 않는 텍스처 좌표로 SCREEN_TEXTURE 를 샘플링하는 것입니다. SCREEN_TEXTURE 의 방향은 기본적으로 기본 그래픽 API에 연결되어 있으므로 메시의 텍스처 좌표를 사용하려면 Y 좌표를 적절히 조정해야 할 수 있습니다.

    예를 들어 직사각형 또는 큐브 메시에 적합한 다음 조각 셰이더는 씬의 불투명한 개체를 모델에 표시합니다:

    VARYING vec2 texcoord;
    void MAIN()
    {
        vec2 screencoord = texcoord;
        if (FRAMEBUFFER_Y_UP < 0.0) // effectively: if not OpenGL
            screencoord.y = 1.0 - screencoord.y;
        BASE_COLOR = texture(SCREEN_TEXTURE, screencoord);
    }

    SCREEN_TEXTUREDEPTH_TEXTURE 이외의 텍스처를 샘플링하거나 FRAGCOORD 를 사용하여 텍스처 좌표를 계산하는 경우(화면 및 깊이 텍스처에 액세스하는 일반적인 사용 사례)에는 이러한 조정이 필요하지 않습니다.

  • float NDC_Y_UP - 정규화된 디바이스 좌표 공간에서 Y축이 위를 가리키면 1, Y축이 아래를 가리키면 -1 값이 됩니다. Y축이 아래를 가리키는 경우는 Vulkan으로 렌더링할 때입니다. 대부분의 머티리얼은 이에 대해 신경 쓸 필요가 없지만, 특정 고급 사용 사례에서는 이를 기반으로 분기할 수 있으면 유용할 수 있습니다.
  • float NEAR_CLIP_VALUE - 클리핑 평면 범위가 -1 에서 시작하여 1 로 이동하는 경우 값은 -1 입니다. 이는 렌더링에 OpenGL을 사용할 때 해당됩니다. 다른 렌더링 백엔드의 경우 이 프로퍼티의 값은 0 이며, 클리핑 평면 범위가 0 ~ 1 입니다. 이 값은 다음과 관련된 특정 기법에 유용합니다. DEPTH_TEXTURE

    예를 들어 다음 조각 셰이더는 깊이 버퍼에서 값의 위치를 재구성하여 렌더링 중인 현재 위치로부터의 거리를 결정하는 기법을 보여줍니다. INVERSE_PROJECTION_MATRIX 와 함께 사용할 경우 깊이 값은 정규화된 디바이스 좌표여야 하므로 깊이 값의 범위가 이를 반영하는지 확인하는 것이 중요합니다. NEAR_CLIP_VALUE-1 인 경우 깊이 값은 -11 사이가 되도록 스케일링됩니다.

    void MAIN() {
        vec2 screen_uv = FRAGCOORD.xy / vec2(textureSize(SCREEN_TEXTURE, 0));
        float depth = texture(DEPTH_TEXTURE, screen_uv).r;
    
        if (NEAR_CLIP_VALUE < 0.0) // effectively: if opengl
            depth = depth * 2.0 - 1.0;
    
        vec4 unproject = INVERSE_PROJECTION_MATRIX * vec4(screen_uv, depth, 1.0);
        depth = (unproject.xyz / unproject.w).z;
        float viewVectorZ = (VIEW_MATRIX * vec4(VAR_WORLD_POSITION, 1.0)).z;
        depth = viewVectorZ - depth;
    
        BASE_COLOR = vec4(depth, depth, depth, 1.0);
    }
  • float IBL_EXPOSE - 라이트 프로브에서 방출되는 빛의 양입니다. SceneEnvironment::probeExposure 에서 가져옵니다.
    DIFFUSE += AO_FACTOR * IBL_EXPOSE * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
  • float IBL_HORIZON - 하반부 환경에서 반사되는 수평 컷오프 값입니다. Horizon Cut-Off 에서 가져오지만 [-1, 0)으로 리매핑됩니다.
    vec3 diffuse += AO_FACTOR * IBL_EXPOSE * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
    if (IBL_HORIZON > -1.0) {
        float ctr = 0.5 + 0.5 * IBL_HORIZON;
        float vertWt = smoothstep(ctr * 0.25, ctr + 0.25, NORMAL.y);
        float wtScaled = mix(1.0, vertWt, IBL_HORIZON + 1.0);
        diffuse *= wtScaled;
    }
  • float IBL_MAXMIPMAP - IBL_TEXTURE 의 최대 밉맵 레벨입니다.

인스턴싱

인스턴스화된 렌더링을 수행할 때 위의 키워드 중 일부는 적용되지 않습니다. 다음 키워드는 인스턴싱에서만 사용할 수 있습니다:

  • INSTANCE_MODEL_MATRIX -> mat4, 인스턴싱 변환을 포함하여 MODEL_MATRIX 를 대체합니다.
  • INSTANCE_MODELVIEWPROJECTION_MATRIX -> mat4, 인스턴싱 변환을 포함하여 MODELVIEWPROJECTION_MATRIX 를 대체합니다.
  • INSTANCE_COLOR -> vec4, 인스턴스 색상: COLOR 와 결합할 수 있습니다.
  • INSTANCE_DATA -> vec4, 인스턴스 사용자 정의 데이터.
  • INSTANCE_INDEX -> int, 인스턴스 번호, 인스턴스 테이블에 대한 인덱스.

화면, 깊이 및 기타 텍스처

렌더링 파이프라인은 특수 렌더 패스의 콘텐츠로 여러 텍스처를 커스텀 머티리얼 셰이더에 노출할 수 있습니다. 이는 음영 및 비음영 커스텀 머티리얼 모두에 적용됩니다.

예를 들어 셰이더는 씬의 불투명 오브젝트에 대한 뎁스 버퍼 콘텐츠가 포함된 뎁스 텍스처에 액세스하고 싶을 수 있습니다. 이는 DEPTH_TEXTURE 을 샘플링하여 달성할 수 있습니다. 이러한 텍스처는 실제로 필요한 경우가 아니라면 일반적으로 생성되지 않습니다. 따라서 버텍스 또는 프래그먼트 셰이더에 다음 키워드가 있으면 해당 텍스처를 생성하는 데 비용이 많이 드는 패스를 선택할 수 있는 토글 역할도 합니다. (물론 이 중 일부는 SceneEnvironment 의 앰비언트 오클루전 파라미터나 뎁스 텍스처에 의존하는 포스트 프로세싱 효과와 같은 다른 설정으로 인해 이미 활성화되어 있을 수 있으며, 이 경우 문제의 텍스처는 사용자 정의 머티리얼과 관계없이 생성되므로 머티리얼에서 이러한 특수 텍스처를 샘플링하는 데 텍스처 액세스 자체 외에 추가 비용이 들지 않습니다).

  • SCREEN_TEXTURE - 이 경우, 투명 머티리얼이나 SCREEN_TEXTURE를 사용하는 머티리얼을 제외한 씬의 내용이 포함된 렌더링 패스의 컬러 버퍼가 있는 텍스처(sampler2D 또는 sampler2DArray)가 이 이름으로 셰이더에 노출됩니다. 이 텍스처는 렌더링되는 프레임버퍼의 콘텐츠가 필요한 기법에 사용할 수 있습니다. SCREEN_TEXTURE 텍스처는 View3D 와 동일한 클리어 모드를 사용합니다. 이 텍스처의 크기는 View3D 의 픽셀 단위 크기와 일치합니다. 예를 들어, 조각 셰이더에는 다음이 포함될 수 있습니다:
    vec2 uv = FRAGCOORD.xy / vec2(textureSize(SCREEN_TEXTURE, 0));
    vec2 displace = vec2(0.1);
    vec4 c = texture(SCREEN_TEXTURE, uv + displace);

    SCREEN_TEXTURE 사용하려면 장면을 적절하고 의식적으로 디자인해야 합니다. 이러한 머티리얼을 사용하는 오브젝트는 일반적으로 텍스처에 표시될 것으로 예상되는 다른 모든 오브젝트 위에 신중하게 배치해야 합니다. 어떤 형태로든 반투명도를 사용하는 오브젝트는 SCREEN_TEXTURE 에 포함되지 않습니다. 종종 SCREEN_TEXTUREBASE_COLOR 과 함께 MAIN 에서 사용됩니다. 예를 들어 다음 커스텀 조각 셰이더는 불투명한 오브젝트에 닿지 않은 조각은 투명하게 유지하면서 엠보스 효과를 적용합니다.

    여기서는 머티리얼이 있는 오브젝트가 전면에 배치되고 블렌딩이 활성화되어 있다고 가정합니다.

    void MAIN()
    {
        vec2 size = vec2(textureSize(SCREEN_TEXTURE, 0));
        vec2 uv = FRAGCOORD.xy / size;
    
        // basic emboss effect
        vec2 d = vec2(1.0 / size.x, 1.0 / size.y);
        vec4 diff = texture(SCREEN_TEXTURE, uv + d) - texture(SCREEN_TEXTURE, uv - d);
        float c = (diff.x + diff.y + diff.z) + 0.5;
    
        float alpha = texture(SCREEN_TEXTURE, uv).a;
        BASE_COLOR = vec4(vec3(c), alpha);
    }

    멀티뷰 렌더링의 경우 SCREEN_TEXTUREsampler2DArray

    .

    VIEW_INDEX 을 사용하여 사용할 레이어를 선택합니다. 두 가지 유형의 렌더링을 모두 지원하려는 VR/AR 애플리케이션의 경우 이식 가능한 방법은 다음과 같습니다:

    #if QSHADER_VIEW_COUNT >= 2
        vec4 c = texture(SCREEN_TEXTURE, vec3(uv, VIEW_INDEX));
    #else
        vec4 c = texture(SCREEN_TEXTURE, uv);
    #endif
  • SCREEN_MIP_TEXTURE - 대부분의 경우 SCREEN_TEXTURE 와 동일하지만 이 텍스처에는 밉맵이 생성된다는 차이점이 있습니다. 이 기능은 화면 크기에 따라 성능 면에서 비용이 많이 들 수 있으며 장면이 렌더링될 때마다 밉맵을 생성해야 하기 때문입니다. 따라서 텍스처 밉 레벨에 의존하는 기법(예: 셰이더에서 textureLod 사용)이 커스텀 머티리얼로 구현되지 않는 한 항상 SCREEN_TEXTURE 을 사용하는 것이 좋습니다.
  • DEPTH_TEXTURE - 존재하는 경우 (비선형화된) 뎁스 버퍼 콘텐츠가 있는 텍스처(sampler2D 또는 sampler2DArray)가 이 이름으로 셰이더에 노출됩니다. 불투명 오브젝트만 포함됩니다. 예를 들어, 조각 셰이더에는 다음이 포함될 수 있습니다:
    ivec2 dtSize = textureSize(DEPTH_TEXTURE, 0);
    vec2 dtUV = (FRAGCOORD.xy) / vec2(dtSize);
    vec4 depthSample = texture(DEPTH_TEXTURE, dtUV);
    float zNear = CAMERA_PROPERTIES.x;
    float zFar = CAMERA_PROPERTIES.y;
    float zRange = zFar - zNear;
    float z_n = 2.0 * depthSample.r - 1.0;
    float d = 2.0 * zNear * zFar / (zFar + zNear - z_n * zRange);
    d /= zFar;

    멀티뷰 렌더링의 경우 DEPTH_TEXTUREsampler2DArray

    .

    사용할 레이어를 선택하려면 VIEW_INDEX

    사용합니다

    .

    두 가지 유형의 렌더링을 모두 지원하려는 VR/AR 애플리케이션의 경우 이식 가능한 접근 방식은 다음과 같습니다:

    #if QSHADER_VIEW_COUNT >= 2
        vec4 depthSample = texture(DEPTH_TEXTURE, vec3(uv, VIEW_INDEX));
    #else
        vec4 depthSample = texture(DEPTH_TEXTURE, uv);
    #endif
  • AO_TEXTURE - 화면 공간 앰비언트 오클루전이 활성화된 경우(즉, AO 강도와 거리가 모두 0이 아닌 경우) SceneEnvironment, SSAO 텍스처(sampler2D 또는 sampler2DArray)가 이 이름으로 셰이더에 노출됩니다. 이 텍스처를 샘플링하면 셰이딩되지 않은 머티리얼에서 유용할 수 있습니다. 셰이딩된 머티리얼에는 앰비언트 오클루전 지원이 내장되어 있습니다. 즉, 앰비언트 오클루전 인자가 자동으로 고려됩니다. 반면 음영 처리되지 않은 머티리얼의 조각 셰이더에서는 다음과 같이 작성하여 동일한 효과를 얻을 수 있습니다:
    ivec2 aoSize = textureSize(AO_TEXTURE, 0);
    vec2 aoUV = (FRAGCOORD.xy) / vec2(aoSize);
    float aoFactor = texture(AO_TEXTURE, aoUV).x;

    멀티뷰 렌더링의 경우 AO_TEXTUREsampler2DArray. VIEW_INDEX 를 사용하여 사용할 레이어를 선택합니다. 두 가지 유형의 렌더링을 모두 지원하려는 VR/AR 애플리케이션의 경우 이식 가능한 접근 방식은 다음과 같습니다:

    #if QSHADER_VIEW_COUNT >= 2
        ivec2 aoSize = textureSize(AO_TEXTURE, 0).xy;
        vec2 aoUV = (FRAGCOORD.xy) / vec2(aoSize);
        float aoFactor = texture(AO_TEXTURE, vec3(aoUV, VIEW_INDEX)).x;
    #else
        ivec2 aoSize = textureSize(AO_TEXTURE, 0);
        vec2 aoUV = (FRAGCOORD.xy) / vec2(aoSize);
        float aoFactor = texture(AO_TEXTURE, aoUV).x;
    #endif
  • IBL_TEXTURE - 특별한 렌더링 패스를 활성화하지는 않지만 머티리얼에 Material::lightProbe 이 있거나 모델이 SceneEnvironment::lightProbe 의 범위 내에 있는 경우 사용할 수 있습니다 .
    void IBL_PROBE()
    {
        DIFFUSE += AO_FACTOR * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
    }
  • VIEW_INDEX - 커스텀 셰이더 코드에서 사용되는 경우, 이것은 (보간되지 않은) uint 변수입니다. 멀티뷰 렌더링을 사용하지 않는 경우 이 값은 항상 0입니다. 멀티뷰 렌더링을 사용하는 경우 값은 현재 뷰 인덱스(예: gl_ViewIndex)입니다. 특히 멀티뷰 렌더링이 활성화된 경우 DEPTH_TEXTURE 등과 함께 사용하면 유용합니다.

SceneEnvironment::tonemapMode이미지 기반 조명 사용, Qt Quick 3D - 사용자 정의 셰이더 예제, Qt Quick 3D - 사용자 정의 재질 예제프로그래밍 가능한 재질, 효과, 지오메트리 및 텍스처 데이터도참조하세요 .

프로퍼티 문서

alwaysDirty : bool

머티리얼 상태를 항상 더티로 지정하여 QtQuick3D 에서 사용할 때마다 머티리얼을 새로 고쳐야 함을 나타냅니다.


destinationAlphaBlend : enumeration [since 6.7]

대상 알파 블렌드 계수를 지정합니다. 기본값은 CustomMaterial.NoBlend 입니다. 이 값은 sourceBlenddestinationBlend 이 기본값이 아닌 값으로 설정된 경우에만 적극적으로 사용됩니다.

상수
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

참고: 이전 버전과의 호환성을 위해 기본값으로 두면 sourceBlenddestinationBlend 가 기본값이 아닌 값으로 설정된 경우 destinationBlend 와 동일한 값이 할당됩니다.

이 프로퍼티는 Qt 6.7에 도입되었습니다.

destinationBlend참조하십시오 .


destinationBlend : enumeration

대상 블렌드 계수를 지정합니다. 기본값은 CustomMaterial.NoBlend 입니다.

Constant
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

참고: 혼합을 사용하려면 sourceBlend 및 destinationBlend를 모두 기본값이 아닌 값으로 설정해야 합니다.

sourceBlend참조하세요 .


fragmentShader : url

커스텀 조각 셰이더 코드 스니펫이 포함된 파일을 지정합니다.

값은 URL이며, 로컬 파일이거나 Qt 리소스 시스템을 통해 임베드된 파일에 액세스하려면 qrc 스키마를 사용해야 합니다. 스킴이 없는 상대 파일 경로도 허용되며, 이 경우 파일은 컴포넌트( .qml 파일)에 상대적인 것으로 처리됩니다.

vertexShader참조하십시오 .


lineWidth : real

이 속성은 지오메트리가 기본 유형의 선 또는 선 스트립을 사용할 때 렌더링되는 선의 너비를 결정합니다. 기본값은 1.0입니다. 이 속성은 삼각형 메쉬와 같은 다른 유형의 지오메트리를 렌더링할 때는 관련이 없습니다.

경고: 기본 그래픽 API에 따라 런타임에 1 이외의 선 너비는 지원되지 않을 수 있습니다. 이 경우 너비 변경 요청은 무시됩니다. 예를 들어 다음 중 어느 것도 넓은 선을 지원할 것으로 예상할 수 없습니다: Direct3D, Metal, 핵심 프로파일 컨텍스트가 있는 OpenGL.

참고: 그래픽 파이프라인 개체의 일부인 선 너비와 달리 점의 토폴로지가 있는 지오메트리의 점 크기는 버텍스 셰이더(지원되는 경우)에 의해 제어되므로 해당 QML 프로퍼티가 없습니다.


shadingMode : enumeration

머티리얼의 유형을 지정합니다. 기본값은 음영입니다.

ConstantValue
CustomMaterial.Unshaded
CustomMaterial.Shaded

sourceAlphaBlend : enumeration [since 6.7]

소스 알파 블렌드 계수를 지정합니다. 기본값은 CustomMaterial.NoBlend 입니다. 이 값은 sourceBlenddestinationBlend 이 기본값이 아닌 값으로 설정된 경우에만 적극적으로 사용됩니다.

Constant
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

참고: 이전 버전과의 호환성을 위해 기본값으로 두면 sourceBlenddestinationBlend 가 기본값이 아닌 값으로 설정된 경우 sourceBlend 와 동일한 값이 할당됩니다.

이 프로퍼티는 Qt 6.7에 도입되었습니다.

sourceBlend참조하십시오 .


sourceBlend : enumeration

소스 블렌드 계수를 지정합니다. 기본값은 CustomMaterial.NoBlend 입니다.

Constant
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

참고: 블렌딩을 사용하려면 sourceBlend와 destinationBlend 모두 기본값이 아닌 값으로 설정해야 합니다.

destinationBlend참조하세요 .


vertexShader : url

커스텀 버텍스 셰이더 코드 스니펫이 포함된 파일을 지정합니다.

값은 URL이며, 로컬 파일이거나 Qt 리소스 시스템을 통해 임베드된 파일에 액세스하려면 qrc 스키마를 사용해야 합니다. 스킴이 없는 상대 파일 경로도 허용되며, 이 경우 파일은 컴포넌트( .qml 파일)에 상대적인 것으로 취급됩니다.

fragmentShader참조하십시오 .


© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.