Effect QML Type
포스트 프로세싱 효과를 만들기 위한 기본 구성 요소입니다. 더 보기...
Import Statement: | import QtQuick3D |
Inherits: |
속성
- passes : list
상세 설명
효과 유형은 사용자가 QtQuick3D 에 대한 자체 포스트 프로세싱 효과를 구현할 수 있도록 합니다.
포스트 프로세싱 효과
포스트 프로세싱 효과는 개념적으로 Qt Quick 의 ShaderEffect 항목과 매우 유사합니다. 효과가 있으면 장면이 먼저 별도의 텍스처로 렌더링됩니다. 그런 다음 View3D 의 render mode 에 따라 텍스처 쿼드를 메인 렌더 대상에 그려서 효과를 적용합니다. 이 효과는 버텍스 셰이더, 조각 셰이더 또는 둘 다를 제공할 수 있습니다. 효과는 항상 View3D 에 따라 전체 씬에 적용됩니다.
효과는 SceneEnvironment::effects 속성의 SceneEnvironment 에 연결됩니다. 이 속성은 목록입니다. 효과는 서로 연결될 수 있으며, 이전 단계의 출력을 다음 단계의 입력으로 사용하여 목록에 있는 순서대로 적용되며, 마지막 효과의 출력은 View3D 의 내용을 정의합니다.
참고: SceneEnvironment 및 ExtendedSceneEnvironment 에서는 피사계 심도, 글로우/블룸, 렌즈 플레어, 컬러 그레이딩 및 비네팅과 같은 기본 제공 효과 세트를 제공합니다. 항상 이러한 효과가 애플리케이션의 요구 사항에 충분한지 먼저 고려하고 사용자 지정 후처리 효과를 구현하는 대신 기본 제공 기능을 사용하는 것을 선호하세요.
효과는 여러 면에서 custom materials 와 유사합니다. 그러나 커스텀 머티리얼은 모델과 연관되어 있으며 해당 메시의 음영을 담당합니다. 이펙트의 버텍스 셰이더는 항상 쿼드(예: 두 개의 삼각형)를 입력으로 받는 반면, 프래그먼트 셰이더는 씬의 콘텐츠로 텍스처를 샘플링합니다.
커스텀 머티리얼과 달리 이펙트는 다중 패스를 지원합니다. 많은 효과의 경우 이러한 기능이 필요하지 않으며, 여러 효과를 적용해야 하는 경우 the SceneEnvironment 에서 여러 효과를 체인으로 연결하여 동일한 결과를 얻을 수 있는 경우가 많습니다. 이는 사용자 지정 효과 예시에서도 확인할 수 있습니다. 그러나 패스는 추가 색상 버퍼(텍스처)를 요청할 수 있으며, 이러한 추가 버퍼 중 어느 버퍼로 출력할지 지정할 수 있습니다. 이렇게 하면 후속 패스에서 이러한 추가 버퍼 중 하나 이상과 원본 장면의 콘텐츠를 입력으로 사용할 수 있으므로 더 복잡한 이미지 처리 기술을 구현할 수 있습니다. 필요한 경우 이러한 추가 버퍼의 수명을 연장할 수 있으므로 프레임 간에 콘텐츠가 보존되므로 모션 블러와 같이 여러 프레임의 콘텐츠를 누적하는 효과를 구현할 수 있습니다.
Qt Quick 의 2D ShaderEffect 와 비교했을 때 3D 포스트 프로세싱 효과는 뎁스 버퍼 데이터로 작업할 수 있고 중간 버퍼로 여러 패스를 구현할 수 있다는 장점이 있습니다. 또한 텍스처 관련 기능이 확장되었습니다: Qt Quick 3D 필터링 모드를 더욱 세밀하게 제어할 수 있으며, RGBA8 이외의 텍스처 형식(예: 부동 소수점 형식)으로도 효과를 사용할 수 있습니다.
View3D 참고: 포스트 프로세싱 효과는 현재 renderMode 이 Offscreen
, Underlay
또는 Overlay
로 설정된 경우에만 사용할 수 있습니다. Inline
모드에서는 효과가 렌더링되지 않습니다.
참고: 포스트 프로세싱 효과를 사용할 때 애플리케이션에서 제공하는 셰이더는 톤 매핑이 적용되지 않은 선형 색상 데이터를 사용해야 합니다. tonemapMode 이 SceneEnvironment.TonemapModeNone
이외의 값으로 설정된 경우 메인 렌더링 패스 중(또는 스카이박스가 있는 경우 스카이박스 렌더링 중) 수행되는 톤 매핑은 SceneEnvironment 에 지정된 포스트 프로세싱 효과가 하나 이상 있는 경우 자동으로 비활성화됩니다. 체인의 마지막 효과(더 정확하게는 체인에서 마지막 효과의 마지막 패스)는 메인 렌더링 패스와 동일한 톤 매핑을 수행하도록 해당 조각 셰이더가 자동으로 수정됩니다.
참고: 자체 톤 매핑을 수행하는 효과는 tonemapMode 을 SceneEnvironment.TonemapModeNone
으로 설정하여 내장 톤 매핑이 비활성화된 SceneEnvironment 에서 사용해야 합니다.
참고: 기본적으로 효과의 입력으로 사용되는 텍스처는 16비트 부동 소수점 RGBA와 같은 부동 소수점 텍스처 형식으로 생성됩니다. 출력 텍스처의 형식은 기본적으로 입력 형식을 따르기 때문에 동일합니다. Buffer 와 빈 이름을 사용하여 재정의할 수 있습니다. 기본 RGBA16F는 0-1 범위를 벗어나는 색상 값을 고정하지 않고 톤 매핑되지 않은 선형 데이터로 작업할 수 있어 유용합니다.
셰이더에 데이터 노출
CustomMaterial 또는 ShaderEffect 에서와 마찬가지로 효과 개체의 동적 프로퍼티는 일반적인 QML 및 Qt Quick 기능을 사용하여 변경하고 애니메이션을 적용할 수 있으며, 값은 셰이더에 자동으로 노출됩니다. 다음 목록은 프로퍼티가 매핑되는 방법을 보여줍니다:
- 부울, 정수, 실수 -> 부울, 정수, 실수
- QColor, color -> vec4이며, 색상은 QML에 지정된 색상 값에 대해 sRGB 공간을 가정하여 선형으로 변환됩니다.
"green"
와 같은 기본 제공 Qt 색도 sRGB 색 공간에 있으며, DefaultMaterial 및 PrincipledMaterial 의 모든 색상 속성에 대해 동일한 변환이 수행되므로 Effect의 이러한 동작은 이들과 일치합니다. - QRect, QRectF, rect -> vec4
- QPoint, QPointF, point, QSize, QSizeF, size -> vec2
- QVector2D, vector2d -> vec3
- 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 프로퍼티가 없을 때 더미 텍스처가 바인딩되는 등 몇 가지 예외가 있지만 일반적으로 모든 유니폼과 샘플러에는 효과 오브젝트에 선언된 해당 프로퍼티가 있어야 합니다.
사용자 정의 효과 시작하기
사용자 정의 포스트 프로세싱 효과에는 최소한 Effect 개체와 조각 셰이더 스니펫이 포함됩니다. 일부 효과에는 사용자 정의 버텍스 셰이더도 필요합니다.
간단한 예로 씬의 콘텐츠를 이미지와 결합하고 빨간색 채널의 값을 애니메이션 방식으로 변경하는 효과를 만들어 보겠습니다:
Effect { id: simpleEffect property TextureInput tex: TextureInput { texture: Texture { source: "image.png" } } property real redLevel NumberAnimation on redLevel { from: 0; to: 1; duration: 5000; loops: -1 } passes: Pass { shaders: Shader { stage: Shader.Fragment shader: "effect.frag" } } } | void MAIN() { vec4 c = texture(tex, TEXTURE_UV); c.r *= redLevel; FRAGCOLOR = c * texture(INPUT, INPUT_UV); } |
여기서 image.png
이미지가 있는 텍스처는 tex
이라는 이름으로 셰이더에 노출됩니다. redLevel의 값은 셰이더에서 같은 이름의 float
유니폼으로 사용할 수 있습니다.
조각 셰이더에는 MAIN
이라는 함수가 포함되어야 합니다. 최종 조각 색상은 FRAGCOLOR
에 의해 결정됩니다. View3D 의 씬 콘텐츠가 포함된 메인 입력 텍스처는 INPUT
라는 이름의 sampler2D
에서 액세스할 수 있습니다. 쿼드의 UV 좌표는 INPUT_UV
에 있습니다. 이 UV 값은 런타임에 기본 그래픽 API에 관계없이 항상 INPUT
샘플링에 적합합니다(필요한 조정이 Qt Quick 3D 에 의해 자동으로 적용되므로 이미지의 Y축 방향과도 무관합니다). 외부 이미지로 텍스처 샘플링은 TEXTURE_UV
을 사용하여 수행됩니다. INPUT_UV
은 앞서 언급한 좌표계 차이에 대응하기 위해 V를 뒤집어야 하고 렌더 타깃으로 사용되는 이미지와 텍스처에 따라 다른 로직을 사용하므로 크로스 플랫폼 애플리케이션에서는 적합하지 않습니다. 다행히도 이 모든 것은 엔진에서 처리하므로 셰이더에 추가 로직이 필요하지 않습니다.
간단한 효과를 사용할 수 있게 되면 View3D 의 SceneEnvironment 의 효과 목록과 연결할 수 있습니다:
environment: SceneEnvironment { effects: [ simpleEffect ] }
결과는 다음과 같으며, 왼쪽에는 원본 씬이 있고 오른쪽에는 이펙트가 적용됩니다:
참고: 셰이더의 shader
속성 값은 QML 및 Qt Quick 의 커스텀과 마찬가지로 셰이더 스니펫이 포함된 파일을 참조하는 URL이며 ShaderEffect 또는 Image.source 와 매우 유사하게 작동합니다. file
및 qrc
체계만 지원됩니다. file
스키마를 생략하여 편리한 방식으로 상대 경로를 지정할 수도 있습니다. 이러한 경로는 컴포넌트( .qml
파일)의 위치를 기준으로 확인됩니다.
참고: 셰이더 코드는 런타임에 Qt에서 사용하는 그래픽 API에 관계없이 항상 Vulkan 스타일의 GLSL을 사용하여 제공됩니다.
참고: 이펙트에서 제공하는 버텍스 및 프래그먼트 셰이더 코드는 그 자체로 완전한 GLSL 셰이더가 아닙니다. 그 대신 MAIN
함수와 선택적으로 VARYING
선언 집합을 제공하며, 엔진에서 추가 셰이더 코드로 수정합니다.
참고: 위의 예제는 일부 VR/AR 애플리케이션에서 사용되는 선택적 멀티뷰 렌더링 모드와 호환되지 않습니다. 멀티뷰 모드를 사용하거나 사용하지 않고 모두 작동하도록 하려면 MAIN()을 다음과 같이 변경하세요:
void MAIN() { vec4 c = texture(tex, TEXTURE_UV); c.r *= redLevel; #if QSHADER_VIEW_COUNT >= 2 FRAGCOLOR = c * texture(INPUT, vec3(INPUT_UV, VIEW_INDEX)); #else FRAGCOLOR = c * texture(INPUT, INPUT_UV); #endif }
버텍스 셰이더를 사용한 효과
버텍스 셰이더가 있는 경우 MAIN
라는 함수를 제공해야 합니다. 대부분의 경우 커스텀 버텍스 셰이더는 동질 버텍스 위치에 대한 자체 계산을 제공하지 않지만 POSITION
, VERTEX
, MODELVIEWPROJECTION_MATRIX
을 사용하면 가능합니다. 커스텀 셰이더 코드에 POSITION
가 없는 경우 POSITION = MODELVIEWPROJECTION_MATRIX * vec4(VERTEX, 1.0);
에 해당하는 문이 Qt Quick 3D 에 의해 자동으로 삽입됩니다.
버텍스 셰이더와 프래그먼트 셰이더 간에 데이터를 전달하려면 VARYING 키워드를 사용합니다. 그러면 내부적으로 적절한 버텍스 출력 또는 프래그먼트 입력 선언으로 변환됩니다. 조각 셰이더는 동일한 선언을 사용하여 현재 조각에 대한 보간된 값을 읽을 수 있습니다.
내장된 DistortionSpiral 효과와 매우 유사한 예제를 살펴보겠습니다:
VARYING vec2 center_vec; void MAIN() { center_vec = INPUT_UV - vec2(0.5, 0.5); center_vec.y *= INPUT_SIZE.y / INPUT_SIZE.x; } | VARYING vec2 center_vec; void MAIN() { float radius = 0.25; float dist_to_center = length(center_vec) / radius; vec2 texcoord = INPUT_UV; if (dist_to_center <= 1.0) { float rotation_amount = (1.0 - dist_to_center) * (1.0 - dist_to_center); float r = radians(360.0) * rotation_amount / 4.0; mat2 rotation = mat2(cos(r), sin(r), -sin(r), cos(r)); texcoord = vec2(0.5, 0.5) + rotation * (INPUT_UV - vec2(0.5, 0.5)); } FRAGCOLOR = texture(INPUT, texcoord); } |
이제 Effect 객체의 passes
목록에 버텍스와 조각 조각이 모두 지정되어야 합니다:
passes: Pass { shaders: [ Shader { stage: Shader.Vertex shader: "effect.vert" }, Shader { stage: Shader.Fragment shader: "effect.frag" } ] }
최종 결과는 다음과 같습니다:
이펙트 셰이더의 특수 키워드
VARYING
- 현재 셰이더의 유형에 따라 버텍스 출력 또는 프래그먼트 입력을 선언합니다.MAIN
- 이 함수는 항상 효과 셰이더에 있어야 합니다.FRAGCOLOR
-vec4
- 최종 조각 색상, 조각 셰이더의 출력입니다. (조각 셰이더에만 해당)POSITION
-vec4
- 버텍스 셰이더에서 계산된 균질 위치입니다. (버텍스 셰이더만 해당)MODELVIEWPROJECTION_MATRIX
-mat4
- 화면 쿼드의 변환 행렬입니다.VERTEX
-vec3
- 쿼드의 버텍스, 버텍스 셰이더에 대한 입력입니다. (버텍스 셰이더만 해당)INPUT
-sampler2D
또는sampler2DArray
- 패스가 BufferInput 객체를 통해 입력을 리디렉션하지 않는 한, 장면이 렌더링된 입력 텍스처의 샘플러(이 경우INPUT
은 BufferInput 에서 참조하는 추가 컬러 버퍼의 텍스처를 참조합니다. VR/AR 애플리케이션에 관련될 수 있는 멀티뷰 렌더링을 활성화하면 샘플러2DArray가 되고, 입력 텍스처는 2D 텍스처 배열이 됩니다.INPUT_UV
-vec2
- 샘플링을 위한 UV 좌표INPUT
.TEXTURE_UV
-vec2
- 이미지 파일에서 로드된 콘텐츠가 있는 텍스처를 샘플링하는 데 적합한 UV 좌표입니다.INPUT_SIZE
-vec2
-INPUT
텍스처의 크기(픽셀 단위).OUTPUT_SIZE
-vec2
- 출력 버퍼의 크기(픽셀 단위)입니다. 패스가 크기 승수가 있는 추가 버퍼로 출력하지 않는 한 종종INPUT_SIZE
와 동일합니다.FRAME
-float
- 프레임 카운터로, View3D 에서 각 프레임마다 증가합니다.DEPTH_TEXTURE
-sampler2D
- 씬의 불투명 오브젝트와 함께 뎁스 버퍼 내용이 포함된 뎁스 텍스처입니다. CustomMaterial 와 마찬가지로 셰이더에 이 키워드가 있으면 뎁스 텍스처가 자동으로 생성됩니다.VIEW_INDEX
-uint
- 멀티뷰 렌더링이 활성화된 경우 버텍스 및 프래그먼트 셰이더에서 모두 사용할 수 있는 현재 뷰 인덱스입니다. 멀티뷰 렌더링을 사용하지 않을 때는 항상 0입니다.
멀티패스 효과 빌드
멀티 패스 효과는 종종 둘 이상의 셰이더 세트를 사용하며 output 및 commands 속성을 사용합니다. 패스 목록의 각 항목은 패스의 출력 텍스처에 쿼드를 그리는 렌더 패스로 변환되며, 효과의 입력 텍스처와 선택적으로 다른 텍스처도 샘플링합니다.
멀티 패스 효과의 일반적인 개요는 다음과 같습니다:
passes: [ Pass { shaders: [ Shader { stage: Shader.Vertex shader: "pass1.vert" }, Shader { stage: Shader.Fragment shader: "pass1.frag" } // This pass outputs to the intermediate texture described // by the Buffer object. output: intermediateColorBuffer ], }, Pass { shaders: [ Shader { stage: Shader.Vertex shader: "pass2.vert" }, Shader { stage: Shader.Fragment shader: "pass2.frag" } // The output of the last pass needs no redirection, it is // the final result of the effect. ], commands: [ // This pass reads from the intermediate texture, meaning // INPUT in the shader will refer to the texture associated // with the Buffer. BufferInput { buffer: intermediateColorBuffer } ] } ]
intermediateColorBuffer
?
Buffer { id: intermediateColorBuffer name: "tempBuffer" // format: Buffer.RGBA8 // textureFilterOperation: Buffer.Linear // textureCoordOperation: Buffer.ClampToEdge }
원하는 값이 기본값과 일치하는 경우 주석이 달린 프로퍼티는 필요하지 않습니다.
내부적으로 이 버퍼 오브젝트가 존재하고 패스의 output
프로퍼티에서 참조하면 View3D 과 일치하는 크기의 텍스처가 생성되므로 암시적 입력 및 출력 텍스처의 크기도 일치하게 됩니다. 원하지 않는 경우 sizeMultiplier 프로퍼티를 사용하여 다른 크기의 중간 텍스처를 얻을 수 있습니다. 이렇게 하면 셰이더의 INPUT_SIZE
및 OUTPUT_SIZE
유니폼이 다른 값을 갖게 될 수 있습니다.
기본적으로 이펙트는 프레임 간에 텍스처의 내용을 보존할 수 없습니다. 새 중간 텍스처가 생성되면 vec4(0.0)
로 지워집니다. 이후에는 동일한 텍스처를 다른 용도로 재사용할 수 있습니다. 따라서 이펙트 패스는 패스를 시작할 때 내용을 가정하지 않고 항상 전체 텍스처에 써야 합니다. 여기에는 예외가 있습니다: bufferFlags 가 Buffer.SceneLifetime으로 설정된 버퍼 오브젝트입니다. 이는 텍스처가 이펙트의 패스와 영구적으로 연관되어 있으며 다른 용도로 재사용되지 않음을 나타냅니다. 이러한 컬러 버퍼의 내용은 프레임 간에 보존됩니다. 이는 일반적으로 모션 블러와 같은 효과에서 핑퐁 방식으로 사용됩니다. 첫 번째 패스는 효과의 기본 입력 텍스처 외에 영구 버퍼를 입력으로 사용하여 다른 중간 버퍼로 출력하고 두 번째 패스는 영구 버퍼로 출력합니다. 이렇게 하면 첫 번째 프레임에서는 첫 번째 패스가 빈(투명한) 텍스처를 샘플링하고, 이후 프레임에서는 이전 프레임에서 두 번째 패스의 출력을 샘플링합니다. 그런 다음 세 번째 패스는 이펙트의 입력과 두 번째 패스의 출력을 함께 블렌딩할 수 있습니다.
BufferInput 명령 유형은 커스텀 텍스처 버퍼를 렌더 패스에 노출하는 데 사용됩니다.
예를 들어, mySampler
이라는 이름으로 렌더 패스 셰이더에서 someBuffer
에 액세스하려면 명령 목록에 다음을 추가할 수 있습니다:
BufferInput { buffer: someBuffer; sampler: "mySampler" }
sampler
이름을 지정하지 않으면 INPUT
이 기본값으로 사용됩니다.
버퍼는 렌더 패스 간에 중간 결과를 공유하는 데 유용할 수 있습니다.
미리 로드된 텍스처를 이펙트에 노출하려면 TextureInput 을 대신 사용해야 합니다. 이는 이펙트 자체의 프로퍼티로 정의할 수 있으며, 프로퍼티 이름으로 셰이더에 자동으로 액세스할 수 있습니다.
property TextureInput tex: TextureInput { texture: Texture { source: "image.png" } }
여기서 tex
은 이펙트의 모든 패스의 모든 셰이더에서 유효한 샘플러입니다.
프로퍼티의 균일한 값에 관해서는 이펙트의 모든 패스가 셰이더에서 동일한 값을 읽습니다. 필요한 경우 특정 패스에 대해서만 유니폼 값을 재정의할 수 있습니다. 이는 패스에 대한 명령 목록에 SetUniformValue 명령을 추가하면 됩니다.
참고: 패스별 유니폼 값 세터의 target 은 이펙트의 프로퍼티 이름인 이름만 참조할 수 있습니다. 프로퍼티의 해당 유니폼 값을 재정의할 수는 있지만 새로운 유니폼을 도입할 수는 없습니다.
성능 고려 사항
포스트 프로세싱 효과를 사용할 때는 리소스 사용량이 증가하고 성능이 저하될 수 있다는 점에 유의하세요. Qt Quick 레이어 및 ShaderEffect 에서와 마찬가지로 씬을 텍스처로 렌더링한 다음 이를 사용하여 쿼드를 텍스처링하는 작업은 특히 조각 처리 능력이 제한된 저사양 하드웨어에서는 비용이 많이 드는 작업이 아닙니다. 필요한 추가 그래픽 메모리의 양과 GPU 부하 증가는 모두 View3D 의 크기에 따라 달라집니다(윈도우 시스템이 없는 임베디드 디바이스의 경우 화면 해상도만큼 커질 수 있음). 멀티패스 효과와 여러 효과를 적용하면 리소스 및 성능 요구 사항이 더욱 증가합니다.
따라서 개발 수명 주기 초기에 대상 디바이스와 그래픽 스택이 최종 제품의 화면 해상도에서 3D 장면 디자인에 포함된 효과를 처리할 수 있는지 확인하는 것이 좋습니다.
필요한 기술에서는 어쩔 수 없지만 DEPTH_TEXTURE
은 해당 텍스처의 콘텐츠를 생성하기 위한 추가 렌더링 패스를 의미하며, 이는 성능이 낮은 하드웨어에서도 문제가 될 수 있습니다. 따라서 꼭 필요한 경우에만 이펙트의 셰이더에 DEPTH_TEXTURE
을 사용하세요.
셰이더의 연산 복잡도도 중요합니다. CustomMaterial 에서와 마찬가지로 최적이 아닌 조각 셰이더는 쉽게 렌더링 성능을 저하시킬 수 있습니다.
sizeMultiplier in Buffer 에는 1보다 큰 값이 포함될 경우 주의하세요. 예를 들어 승수가 4이면 View3D 의 4배 크기인 텍스처를 생성한 다음 렌더링한다는 의미입니다. 섀도 맵 및 멀티 또는 슈퍼샘플링과 마찬가지로 리소스 및 성능 비용 증가는 GPU 성능이 제한된 시스템에서 품질 향상으로 인한 이점보다 빠르게 더 커질 수 있습니다.
VR/AR 고려 사항
Qt Quick 3D XR을 사용하여 가상 현실 또는 증강 현실용 애플리케이션을 개발할 때 포스트 프로세싱 효과는 기능적으로 사용할 수 있습니다. 그러나 디자이너는 가상 현실 환경에서 어떤 종류의 효과가 적합한지 이해하기 위해 특별한 주의를 기울여야 합니다. ExtendedSceneEnvironment 또는 더 이상 사용되지 않는 효과 모듈에 내장된 효과 중 일부를 포함한 일부 효과는 VR 환경에서 좋은 시각적 경험을 제공하지 못하며, 사용자에게 신체적 영향(예: 멀미 또는 현기증 유발)을 줄 수도 있습니다.
VR/AR 애플리케이션에서 보다 효율적인 멀티뷰 렌더링 모드를 활성화하면 왼쪽 눈과 오른쪽 눈 콘텐츠에 대한 별도의 렌더링 패스가 없습니다. 대신 두 개의 독립적인 2D 텍스처 대신 두 개의 레이어가 있는 2D 텍스처 배열을 사용하여 모든 작업이 한 번의 패스로 이루어집니다. 이는 또한 이 모드에서는 많은 중간 버퍼, 즉 컬러 또는 뎁스 텍스처가 텍스처 배열이 되어야 한다는 것을 의미합니다. 이는 커스텀 머티리얼과 포스트 프로세싱 효과에도 영향을 미칩니다. 입력 텍스처(INPUT
), 뎁스 텍스처(DEPTH_TEXTURE
), 스크린 텍스처(SCREEN_TEXTURE
) 등의 텍스처는 2D 텍스처 배열이 되어 셰이더에 sampler2D
대신 sampler2DArray
으로 노출됩니다. 이는 texture(), textureLod(), textureSize() 등의 GLSL 함수에 영향을 미칩니다. 그러면 UV 좌표는 vec2가 아닌 vec3가 됩니다. 반면 textureSize()는 vec2가 아닌 vec3를 반환합니다. 렌더링 모드에 관계없이 작동하도록 의도된 이펙트는 적절한 ifdef를 사용하여 작성할 수 있습니다:
#if QSHADER_VIEW_COUNT >= 2 vec4 c = texture(INPUT, vec3(INPUT_UV, VIEW_INDEX)); #else vec4 c = texture(INPUT, INPUT_UV); #endif
Shader, Pass, Buffer, BufferInput, Qt Quick 3D - 커스텀 이펙트 예시를참조하세요 .
속성 문서
© 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.