CustomMaterial QML Type
모델 음영에 사용되는 커스텀 머티리얼을 만들기 위한 기본 컴포넌트입니다. 더 보기...
Import Statement: | import QtQuick3D |
Inherits: |
속성
- alwaysDirty : bool
- destinationAlphaBlend : enumeration
(since 6.7)
- destinationBlend : enumeration
- fragmentShader : url
- lineWidth : real
- shadingMode : enumeration
- sourceAlphaBlend : enumeration
(since 6.7)
- sourceBlend : enumeration
- vertexShader : url
자세한 설명
커스텀 머티리얼을 사용하면 머티리얼에 커스텀 셰이더 코드를 사용하여 그래픽 셰이더 수준에서 프로그래밍할 수 있습니다. 버텍스, 조각 또는 두 가지 셰이더를 모두 제공할 수 있습니다. vertexShader 및 fragmentShader 속성은 셰이더 스니펫이 포함된 파일을 참조하는 URL이며 ShaderEffect 또는 Image.source 과 매우 유사하게 작동합니다. 사용자 지정 머티리얼에는 file
및 qrc
체계만 지원됩니다. 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.vert
및 material.frag
의 셰이더 스니펫이 다음과 같다고 가정해 보겠습니다:
void MAIN() { VERTEX.x += sin(uTime + VERTEX.y) * uAmplitude; } | void MAIN() { BASE_COLOR = vec4(0.0, 1.0, 0.0, 1.0); } |
uTime
과 uAmplitude
은 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
의 재정의가 없는 경우POSITION
은VERTEX
및MODELVIEWPROJECTION_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이 아닌 다른 값으로 설정하면 조각의 최종 알파 값에 영향을 줄 수 있습니다. (이 경우 sourceBlend 및 destinationBlend 에서 알파 블렌딩도 활성화해야 하는 경우가 많습니다.)또 다른 시나리오는 사용자 지정
SPECULAR_LIGHT
함수가 제공되지 않거나 SceneEnvironment 에 광원 프로브가 설정된 경우입니다. 스페큘러 기여도 계산에 영향을 미치는 금속성, 거칠기 및 기타 값은MAIN
에서 원하는 사용자 지정 값으로 설정할 수 있습니다.이 함수는 다음과 같은 특수 변수에 쓸 수 있습니다. 여기에 기록되는 값은 일반적으로 하드코딩되거나 유니폼에 매핑된 QML 프로퍼티를 기반으로 계산됩니다. 의미는 PrincipledMaterial 와 동일합니다.
- vec4
BASE_COLOR
- 기본 색상 및 머티리얼 알파 값입니다. built-in materials' color property 에 해당합니다. 광원 프로세서 기능이 구현되지 않은 경우 기본 조명 계산에 고려되므로MAIN
에서 사용자 지정 기본 색상을 설정하는 것이 편리할 수 있습니다. 기본값은vec4(1.0)
으로 알파가 1.0인 흰색을 의미합니다. 알파 값은 조각의 최종 알파에 영향을 줍니다. 최종 알파 값은 객체(모델) 불투명도에 기본 색상 알파를 곱한 값입니다. QML의 색상 속성에서 노출된 균일한 값에 의존하지 않고 셰이더 코드에서 직접 값을 지정할 때는 필요한 경우 sRGB에서 선형 변환을 수행하는 것은 셰이더의 몫이라는 점에 유의하세요. 예를 들어vec3 color
및float 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 property 및 built-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.0
은 PrincipledMaterial 과 같은 값입니다. - float
CLEARCOAT_FRESNEL_BIAS
클리어코트 레이어의 프레넬 바이어스를 지정합니다. 일반적인 값이자 기본값인0.0
은 PrincipledMaterial 과 같은 값입니다. - 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.0
은 PrincipledMaterial 이 사용하는 값입니다. - vec3
NORMAL
- 월드 스페이스의 버텍스 셰이더에서 나오는 노멀입니다. 이 프로퍼티의 초기 값은VAR_WORLD_NORMAL
와 같지만NORMAL
값만 변경하면 라이팅에 영향을 미칩니다. - vec3
TANGENT
- 월드 스페이스의 버텍스 셰이더에서 나오는 탄젠트입니다. 이 값은 양면성을 위해 잠재적으로 조정될 수 있습니다. - vec3
BINORMAL
- 월드 스페이스의 버텍스 셰이더에서 나오는 바이노멀입니다. 이 값은 양면성을 위해 잠재적으로 조정될 수 있습니다. - vec2
UV0
- 버텍스 셰이더의 첫 번째 텍스처 좌표 세트입니다. 이 프로퍼티는 프래그먼트 셰이더에서 읽기 전용입니다. - vec2
UV1
- 버텍스 셰이더의 두 번째 텍스처 좌표 세트입니다. 이 프로퍼티는 프래그먼트 셰이더에서 읽기 전용입니다.
참고: 셰이딩되지 않은 머티리얼과 달리 셰이딩된 머티리얼의
MAIN
조각은FRAGCOLOR
을 직접 제어할 수 없습니다. 대신 조명 프로세서 함수에 기록된DIFFUSE
및SPECULAR
값에 따라 최종 조각 색상이 결정됩니다. 광원 프로세서 함수가 구현되지 않은 경우 관련 기본 음영 계산은 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); }
- vec4
void AMBIENT_LIGHT()
이 함수는 각 조각에 대해 한 번씩 호출됩니다. 이 함수의 작업은 쓰기 가능한 특수 변수DIFFUSE
에 총 앰비언트 기여도를 더하는 것입니다. 물론 다른 값을 계산하거나DIFFUSE
을 전혀 건드리지 않도록 선택할 수도 있습니다(주변 조명을 완전히 무시하기 위해). 이 함수가 전혀 없는 경우, 주변광 기여도는 PrincipledMaterial 처럼 정상적으로 계산됩니다.이 함수는 다음 특수 변수에 쓸 수 있습니다:
- vec3
DIFFUSE
조각별로 확산광 기여도를 누적합니다. 값을 덮어쓰면 다른 광원의 기여도가 손실되므로 광원 처리 함수는 일반적으로 (+=
)를 추가합니다.
이 함수는 위 표의 행렬(예:
MODEL_MATRIX
) 및 벡터(예:CAMERA_POSITION
) 유니폼 외에도 다음과 같은 특수 변수를 읽을 수 있습니다- . vec3
TOTAL_AMBIENT_COLOR
장면의 총 앰비언트 기여도.
예:
void AMBIENT_LIGHT() { DIFFUSE += TOTAL_AMBIENT_COLOR; }
- vec3
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))); }
- vec3
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))); }
- vec3
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))); }
- vec3
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
에서 제공하는 내장 프레넬 기여도를 사용하지 않을 때 프레넬 기여도를 계산하는 데 유용합니다
.- vec3
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); }
- vec4
void IBL_PROBE()
이 함수가 있는 경우 IBL(이미지 기반 조명)에 대해 호출됩니다.이 함수의
작업은 쓰기 가능한 특수 변수DIFFUSE
및SPECULAR
에 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 에서 가져옵니다
.- vec3
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_TEXTURE
및DEPTH_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
인 경우 깊이 값은-1
와1
사이가 되도록 스케일링됩니다.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_TEXTURE
은BASE_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_TEXTURE
은sampler2DArray
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_TEXTURE
은sampler2DArray
사용할 레이어를 선택하려면
을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_TEXTURE
는sampler2DArray
.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 - 사용자 정의 재질 예제 및 프로그래밍 가능한 재질, 효과, 지오메트리 및 텍스처 데이터도참조하세요 .
프로퍼티 문서
destinationAlphaBlend : enumeration |
대상 알파 블렌드 계수를 지정합니다. 기본값은 CustomMaterial.NoBlend
입니다. 이 값은 sourceBlend 및 destinationBlend 이 기본값이 아닌 값으로 설정된 경우에만 적극적으로 사용됩니다.
상수 | 값 |
---|---|
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 와 동일한 값이 할당됩니다.
이 프로퍼티는 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 |
머티리얼의 유형을 지정합니다. 기본값은 음영입니다.
Constant | Value |
---|---|
CustomMaterial.Unshaded | |
CustomMaterial.Shaded |
sourceAlphaBlend : enumeration |
소스 알파 블렌드 계수를 지정합니다. 기본값은 CustomMaterial.NoBlend
입니다. 이 값은 sourceBlend 및 destinationBlend 이 기본값이 아닌 값으로 설정된 경우에만 적극적으로 사용됩니다.
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 와 동일한 값이 할당됩니다.
이 프로퍼티는 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.