QRhiCommandBuffer Class
명령 버퍼 리소스. 더 보기...
| 헤더: | #include <rhi/qrhi.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS GuiPrivate) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
| qmake: | QT += gui-private |
| 다음부터: | Qt 6.6 |
| 상속: | QRhiResource |
공개 타입
| enum | BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute } |
| flags | BeginPassFlags |
| DynamicOffset | |
| enum | IndexFormat { IndexUInt16, IndexUInt32 } |
| VertexInput |
공개 함수
| void | beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {}) |
| void | beginExternal() |
| void | beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {}) |
| void | debugMarkBegin(const QByteArray &name) |
| void | debugMarkEnd() |
| void | debugMarkMsg(const QByteArray &msg) |
| void | dispatch(int x, int y, int z) |
| void | draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0) |
| void | drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0) |
(since 6.12) void | drawIndexedIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndexedIndirectDrawCommand)) |
(since 6.12) void | drawIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndirectDrawCommand)) |
| void | endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr) |
| void | endExternal() |
| void | endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr) |
| double | lastCompletedGpuTime() |
| const QRhiNativeHandles * | nativeHandles() |
| void | resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates) |
| void | setBlendConstants(const QColor &c) |
| void | setComputePipeline(QRhiComputePipeline *ps) |
| void | setGraphicsPipeline(QRhiGraphicsPipeline *ps) |
| void | setScissor(const QRhiScissor &scissor) |
| void | setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr) |
(since 6.9) void | setShadingRate(const QSize &coarsePixelSize) |
| void | setStencilRef(quint32 refValue) |
| void | setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16) |
| void | setViewport(const QRhiViewport &viewport) |
재구현된 공용 함수
| virtual QRhiResource::Type | resourceType() const override |
상세 설명
현재 애플리케이션에서는 생성할 수 없습니다. 유효한 QRhiCommandBuffer를 얻는 유일한 방법은 QRhiSwapChain::currentFrameCommandBuffer()를 통해 대상 스왑체인에서 가져오거나, 완전히 오프스크린으로 렌더링하는 경우 QRhi::beginOffscreenFrame()를 통해 초기화하는 것입니다.
참고: 이는 호환성 보장이 제한적인 RHI API입니다. 자세한 내용은 QRhi 를 참조하십시오.
멤버 유형 설명서
enum QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags
QRhi::beginPass()의 플래그 값
| 상수 | 값 | 설명 |
|---|---|---|
QRhiCommandBuffer::ExternalContent | 0x01 | 이 패스에서 ` QRhiCommandBuffer::beginExternal()` 호출이 발생함을 지정합니다. 일부 백엔드(특히 Vulkan)의 경우, 이 플래그가 설정되지 않았음에도 ` beginExternal()`가 호출되면 오류가 발생합니다. |
QRhiCommandBuffer::DoNotTrackResourcesForCompute | 0x02 | 이 패스에서 사용되는 리소스를 추적하는 유일한 목적이 컴퓨트용 배리어를 생성하는 것일 경우, 해당 리소스를 추적할 필요가 없음을 지정합니다. 이는 프레임 내에 컴퓨트 패스가 없음을 의미합니다. 이는 특정 백엔드(특히 OpenGL)에서 고려할 수 있는 최적화 힌트로, 이를 통해 특정 작업을 건너뛸 수 있게 합니다. 프레임 내의 렌더 패스에 대해 이 플래그가 설정된 상태에서 해당 프레임에서 ` beginComputePass()`를 호출하면, 렌더 패스와 컴퓨트 패스 간의 리소스 종속성에 따라 예기치 않은 동작이 발생할 수 있습니다. |
BeginPassFlags 유형은 QFlags<BeginPassFlag>에 대한 typedef입니다. 이 유형은 BeginPassFlag 값들의 OR 조합을 저장합니다.
[alias] QRhiCommandBuffer::DynamicOffset
std::pair<int, quint32>의 동의어입니다. 첫 번째 항목은 바인딩이며, 두 번째 항목은 버퍼 내의 오프셋입니다.
enum QRhiCommandBuffer::IndexFormat
인덱스 데이터 유형을 지정합니다
| 상수 | 값 | 설명 |
|---|---|---|
QRhiCommandBuffer::IndexUInt16 | 0 | 부호 없는 16비트(quint16) |
QRhiCommandBuffer::IndexUInt32 | 1 | 부호 없는 32비트 (quint32) |
[alias] QRhiCommandBuffer::VertexInput
std::pair<QRhiBuffer *, quint32>의 동의어입니다. 두 번째 요소는 첫 번째 요소가 지정한 버퍼 내의 오프셋입니다.
멤버 함수 설명서
void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
새로운 연산 패스를 시작하는 레코드입니다.
resourceUpdates, null이 아닐 경우, 커밋된 후 해제될 리소스 업데이트 배치를 지정합니다.
참고: 패스 간에 상태나 리소스 바인딩이 유지된다고 가정해서는 안됩니다 .
참고: 컴퓨트패스는 그래픽 관련 호출이 아닌 setComputePipeline(), setShaderResources() 및 dispatch() 호출을 기록할 수 있습니다. 디버그 마커 및 beginExternal()와 같은 일반 기능은 렌더링 패스와 컴퓨트 패스 모두에서 사용할 수 있습니다.
참고: 컴퓨트 기능은 Compute 기능이 지원되는 것으로 보고된 경우에만 사용할 수 있습니다.
flags 현재는 사용되지 않습니다.
void QRhiCommandBuffer::beginExternal()
이 애플리케이션보다 앞서 실행되는 애플리케이션이 그래픽 API 함수를 직접 호출하여 현재 패스의 명령 버퍼에 명령을 큐에 추가하려고 할 때 호출됩니다.
참고: 이 기능은 beginPass() 또는 beginComputePass()에서 사전에 의도를 선언한 경우에만 사용할 수 있습니다. 따라서 이 함수는 QRhiCommandBuffer::ExternalContent 를 지정하여 패스 기록을 시작한 경우에만 호출해야 합니다.
Vulkan, Metal 또는 Direct3D 12를 사용하는 경우, nativeHandles()을 통해 네이티브 명령 버퍼나 인코더 객체를 조회하고, 해당 객체에 명령을 큐에 추가할 수 있습니다. OpenGL 또는 Direct3D 11을 사용하는 경우, QRhi::nativeHandles()을 통해 (디바이스) 컨텍스트를 가져올 수 있습니다. 그러나 이 작업은 QRhiCommandBuffer 의 상태가 최신 상태로 유지되도록 보장하지 않고서는 절대 수행해서는 안 됩니다. 따라서 외부에서 추가된 명령어 기록은 반드시 beginExternal()과 endExternal() 사이에 포함되어야 합니다. 개념적으로 이는 QPainter 의 beginNativePainting() 및 endNativePainting() 함수와 동일합니다.
특히 OpenGL의 경우, 이 함수는 컨텍스트가 현재 스레드에서 활성 상태가 되도록 보장하는 추가적인 역할을 수행합니다.
참고: beginExternal()이호출되면 , endExternal()이 호출될 때까지 QRhiCommandBuffer 에서 다른 렌더 패스 관련 함수(set* 또는 draw*)를 호출해서는 안 됩니다.
경고: 일부 백엔드는 beginExternal() - endExternal() 블록 내부에서 QRhiCommandBuffer::nativeHandles()을 호출했을 때, 기본 명령 버퍼 객체와 다른 네이티브 명령 버퍼 객체를 반환할 수 있습니다. 따라서 beginExternal()을 호출한 후 네이티브 명령 버퍼 객체를 (재)조회하는 것이 중요합니다. 실질적으로 이는 예를 들어 Vulkan의 경우, 외부에서 기록된 Vulkan 명령들이 보조 명령 버퍼(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT 설정)에 배치된다는 것을 의미합니다. begin/endExternal 사이에서 nativeHandles()를 호출하면 이 보조 명령 버퍼가 반환됩니다.
endExternal() 및 nativeHandles()도 참조하십시오 .
void QRhiCommandBuffer::beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
rt 렌더 타깃을 대상으로 하는 새로운 렌더 패스를 시작하는 레코드를 기록합니다.
resourceUpdates, null이 아닐 경우, 커밋된 후 해제될 리소스 업데이트 배치를 지정합니다.
렌더 타겟의 색상 및 깊이/스텐실 버퍼는 일반적으로 지워집니다. 지우기 값은 colorClearValue 및 depthStencilClearValue 에 지정됩니다. 단, 렌더 타겟이 QRhiTextureRenderTarget::PreserveColorContents 및/또는 QRhiTextureRenderTarget::PreserveDepthStencilContents 로 생성된 경우는 예외입니다. 이 경우 지우기 값은 무시됩니다.
참고: 색상 또는 깊이 내용을 보존하도록설정하면 기본 하드웨어에 따라 성능이 저하될 수 있습니다. 타일 아키텍처를 사용하는 모바일 GPU의 경우, 이전 내용을 타일 버퍼에 다시 불러올 필요가 없기 때문에 성능 이점을 얻을 수 있습니다. 마찬가지로, QRhiTexture 를 깊이 버퍼로 사용하는 QRhiTextureRenderTarget 는 QRhiRenderBuffer 보다 효율이 낮습니다. 깊이 텍스처를 사용하면 해당 텍스처에 데이터를 기록해야 하지만, 렌더버퍼의 경우(API가 렌더버퍼에서 샘플링하거나 읽는 것을 허용하지 않기 때문에) 이러한 작업이 필요하지 않기 때문입니다.
참고: 패스 간에 상태나 리소스 바인딩이 유지된다고 가정해서는 안됩니다 .
참고: QRhiCommandBuffer의 set 및 draw 함수는 패스 내부에서만 호출할 수 있습니다. 또한, setGraphicsPipeline()를 제외하고는 명령 버퍼에 파이프라인이 이미 설정되어 있어야 합니다. 그렇지 않은 경우 백엔드에 따라 명시되지 않은 문제가 발생할 수 있습니다.
rt 가 QRhiTextureRenderTarget 인 경우, beginPass()는 렌더 타겟에서 참조되는 텍스처 및 렌더 버퍼 객체가 최신 상태인지 확인합니다. 이는 setShaderResources()가 QRhiShaderResourceBindings 에 대해 수행하는 작업과 유사합니다. QRhiTextureRenderTarget::create() 호출 이후 첨부 파일 중 하나라도 재구축된 경우, rt 에 대해 create() 호출이 묵시적으로 수행됩니다. 따라서 rt 에 QRhiTexture 색상 첨부 파일 texture 이 있고, 텍스처의 크기를 변경해야 하는 경우 다음 코드는 유효합니다:
QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ { texture } });
rt->create();
// ...
texture->setPixelSize(new_size);
texture->create();
cb->beginPass(rt, colorClear, dsClear); // this is ok, no explicit rt->create() is required beforeflags 특정 고급 기능을 제어할 수 있게 해줍니다. 자주 사용되는 플래그 중 하나는 ExternalContents 입니다. 이 함수로 시작된 패스 내에서 beginExternal()가 호출될 때마다 이 플래그를 지정해야 합니다.
endPass() 및 BeginPassFlags도 참조하십시오 .
void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)
지정된 name 를 사용하여 명령 버퍼에 이름이 지정된 디버그 그룹을 기록합니다. 이 정보는 RenderDoc 및 XCode와 같은 그래픽 디버깅 도구에서 표시됩니다. 그룹화의 끝은 debugMarkEnd()로 표시됩니다.
참고: QRhi::DebugMarkers 가 지원되지 않거나 QRhi::EnableDebugMarkers 가 설정되지 않은 경우무시됩니다 .
참고: 프레임 내 어디에서나, 패스 내부나 외부 모두에서 호출할수 있습니다 .
void QRhiCommandBuffer::debugMarkEnd()
디버그 그룹의 끝을 기록합니다.
참고: QRhi::DebugMarkers 가 지원되지 않거나 QRhi::EnableDebugMarkers 가 설정되지 않은 경우무시됩니다 .
참고: 프레임 내 어디에서나, 패스 내부나 외부 모두에서 호출할수 있습니다 .
void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)
명령어 스트림에 “ msg ” 디버그 메시지를 삽입합니다.
참고: QRhi::DebugMarkers 가 지원되지 않거나 QRhi::EnableDebugMarkers 가 설정되지 않은 경우무시됩니다 .
참고: 일부 백엔드의경우 debugMarkMsg()는 패스 내부에서만 지원되며, 패스 외부에서 호출되면 무시됩니다. 다른 백엔드의 경우 프레임 내 어디에서나 기록됩니다.
void QRhiCommandBuffer::dispatch(int x, int y, int z)
x, y 및 z 를 사용하여 해당 차원 내의 로컬 워크그룹 수를 지정함으로써, 컴퓨트 워크 항목을 할당하는 레코드입니다.
참고: 이 함수는 컴퓨트 패스 내부, 즉 beginComputePass() 호출과 endComputePass() 호출 사이에서만 호출할 수 있습니다.
참고: x, y 및 z 는 실행 시 기본 그래픽 API 구현의 제한 범위 내에 있어야 합니다. 최대값은 일반적으로 65535입니다.
참고: 로컬 작업 그룹 크기에 대한 제한 사항도주의해야 합니다 . 이는 셰이더에서 지정되며, 예를 들어 다음과 같습니다: layout(local_size_x = 16, local_size_y = 16) in;. 예를 들어, OpenGL의 경우 사양에서 단일 로컬 워크그룹 내 호출 횟수( local_size_x, local_size_y, local_size_z 의 곱)에 대해 규정하는 최소값은 1024인 반면, OpenGL ES(3.1)에서는 이 값이 128까지 낮아질 수 있습니다. 즉, 위에서 제시한 예제의 호출 횟수가 256회이므로 일부 OpenGL ES 구현체에서는 이 예제가 거부될 수 있습니다.
void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
인덱스가 지정되지 않은 그리기를 기록합니다.
정점 수는 ` vertexCount`에서 지정됩니다. 인스턴스화된 그리기를 수행하려면 ` instanceCount `을 1 이외의 값으로 설정하십시오. ` firstVertex `는 그릴 첫 번째 정점의 인덱스입니다. 여러 인스턴스를 그릴 때 첫 번째 인스턴스 ID는 ` firstInstance`로 지정됩니다.
참고: firstInstance 는 지원되지 않을 수 있으며, QRhi::BaseInstance 기능이 지원되지 않는 것으로 보고될 경우 무시됩니다. 이 경우 첫 번째 인스턴스 ID는 항상 0입니다. QRhi::BaseInstance 는 주로 OpenGL ES의 제한 사항으로 인해 현재 OpenGL에서는 지원되지 않으므로, 이 인수를 사용하는 포터블 애플리케이션을 설계해서는 안 됩니다.
참고: 현재 정점 또는 인스턴스의 인덱스에 액세스해야 하는셰이더는 gl_VertexID 및 gl_InstanceID 대신 gl_VertexIndex 및 gl_InstanceIndex, 즉 Vulkan과 호환되는 내장 변수를 사용해야 합니다.
참고: firstInstance 가 0이 아닐경우 , 일부 기본 3D API에서는 gl_InstanceIndex 에 기준값이 포함되지 않습니다. 이는 QRhi::InstanceIndexIncludesBaseInstance 기능으로 표시됩니다. 기준 인스턴스 값에 의존해야 하는 상황을 피할 수 없는 경우, 애플리케이션은 해당 기능이 보고하는 내용에 따라 조건부로 uniform으로 값을 전달하고, 셰이더 내에서 gl_InstanceIndex 에 이를 더하는 것이 좋습니다.
void QRhiCommandBuffer::drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)
인덱스가 지정된 드로우를 기록합니다.
정점 수는 ` indexCount`에서 지정됩니다. ` firstIndex `는 기본 인덱스입니다. 인덱스 버퍼 내의 유효 오프셋은 ` indexOffset + firstIndex * n `로 주어지며, 여기서 ` n `는 인덱스 요소 유형에 따라 2 또는 4입니다. ` indexOffset `는 ` setVertexInput()`에서 지정됩니다.
참고: 일부 백엔드(예: Metal)의 경우, 인덱스 버퍼 내의 유효오프셋은 4바이트 단위로 정렬되어야 합니다. 이러한 백엔드에서는 ` NonFourAlignedEffectiveIndexBufferOffset ` 기능이 지원되지 않는 것으로 보고됩니다.
vertexOffset ( base vertex 라고도 함)은 버텍스 버퍼에 인덱싱하기 전에 요소 인덱스에 더해지는 부호 있는 값입니다. 이 기능에 대한 지원이 항상 제공되는 것은 아니며, QRhi::BaseVertex 기능이 지원되지 않는 것으로 보고될 경우 이 값은 무시됩니다.
인스턴스 드로잉의 경우 instanceCount 을 1 이외의 값으로 설정하십시오. 여러 인스턴스를 그릴 때 첫 번째 인스턴스 ID는 firstInstance 으로 지정됩니다.
참고: ` firstInstance `는 지원되지 않을 수 있으며, ` QRhi::BaseInstance ` 기능이 지원되지 않는 것으로 보고될 경우 무시됩니다. 이 경우 첫 번째 인스턴스 ID는 항상 0입니다. 현재 OpenGL에서는 주로 OpenGL ES의 제한 사항으로 인해 ` QRhi::BaseInstance `가 지원되지 않으므로, 이 인수를 기반으로 하는 이식성 있는 애플리케이션을 설계해서는 안 됩니다.
참고: 현재 정점 또는 인스턴스의 인덱스에 액세스해야 하는셰이더는 gl_VertexID 및 gl_InstanceID 대신 gl_VertexIndex 및 gl_InstanceIndex, 즉 Vulkan 호환 내장 변수를 사용해야 합니다.
참고: firstInstance 가 0이 아닐경우 , 일부 기본 3D API에서는 gl_InstanceIndex 에 기준값이 포함되지 않습니다. 이는 QRhi::InstanceIndexIncludesBaseInstance 기능으로 표시됩니다. 기준 인스턴스 값에 의존하는 것을 피할 수 없는 경우, 애플리케이션은 해당 기능이 보고하는 내용에 따라 조건부로 uniform을 전달하고, 셰이더 내에서 gl_InstanceIndex 에 이를 더하는 것이 좋습니다.
[since 6.12] void QRhiCommandBuffer::drawIndexedIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndexedIndirectDrawCommand))
인덱스가 지정된 간접 드로우를 기록합니다.
드로우 매개변수는 ` indirectBuffer`에 지정된 버퍼에서 제공되며, 이 버퍼에는 ` QRhiIndexedIndirectDrawCommand` 유형의 요소로 구성된 배열이 포함되어야 합니다. ` QRhiIndexedIndirectDrawCommand `의 매개변수는 ` drawIndexed()`의 매개변수와 동일한 의미를 가집니다.
버퍼에서 매개변수를 읽기 시작하는 오프셋(바이트 단위)은 indirectBufferOffset 에 의해 지정됩니다.
drawCount 발행할 해당 그리기 명령의 수를 지정합니다.
stride 버퍼 내 각 개별 드로잉 명령 구조체의 바이트 크기를 나타냅니다. 이를 통해 필요한 경우 명령들 사이에 사용자 정의 데이터를 삽입할 수 있습니다. 이 값은 4의 배수여야 하며 sizeof(QRhiIndexedIndirectDrawCommand) 이상이어야 합니다.
참고: drawCount 값이 1보다 큰 경우, QRhi::DrawIndirectMulti 기능이 지원되는 것으로 보고되고 stride가 기본값인 경우에만 네이티브로 지원됩니다. 그렇지 않은 경우, 이 함수는 여러 드로우 호출을 기록하여 멀티 드로우를 에뮬레이트하므로, drawIndexed() 호출을 반복하는 것보다 성능상의 이점이 없습니다.
이 함수는 Qt 6.12에서 도입되었습니다.
[since 6.12] void QRhiCommandBuffer::drawIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndirectDrawCommand))
인덱스가 지정되지 않은 간접 드로우를 기록합니다.
드로우 매개변수는 indirectBuffer 에 지정된 버퍼에서 제공되며, 이 버퍼는 QRhiIndirectDrawCommand 유형의 요소로 구성된 배열을 포함해야 합니다. QRhiIndirectDrawCommand 의 매개변수는 draw()에서와 동일한 의미를 가집니다.
버퍼에서 매개변수를 읽기 시작하는 오프셋(바이트 단위)은 indirectBufferOffset 에 의해 지정됩니다.
drawCount 발행할 해당 그리기 명령의 수를 지정합니다.
stride 버퍼 내 각 개별 그리기 명령 구조체의 바이트 크기를 나타냅니다. 이를 통해 필요한 경우 명령어 사이에 사용자 정의 데이터를 삽입할 수 있습니다. 이 값은 4의 배수여야 하며, sizeof(QRhiIndirectDrawCommand) 이상이어야 합니다.
참고: drawCount 값이 1보다 큰 경우, QRhi::DrawIndirectMulti 기능이 지원된다고 보고되고 stride가 기본값인 경우에만 네이티브로 지원됩니다. 그렇지 않은 경우, 이 함수는 여러 드로우 호출을 기록하여 멀티 드로우를 에뮬레이트하므로, 반복적인 draw() 호출에 비해 성능상의 이점이 없습니다.
이 함수는 Qt 6.12에서 도입되었습니다.
void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
현재 계산 패스를 종료하는 레코드입니다.
resourceUpdates, null이 아닐 경우, 커밋된 후 해제될 리소스 업데이트 배치를 지정합니다.
void QRhiCommandBuffer::endExternal()
외부에서 추가된 명령이 명령 버퍼나 컨텍스트에 기록되면 호출됩니다.
참고: 이 함수를 호출한 후에는모든 QRhiCommandBuffer 상태를 무효한 것으로 간주해야 합니다. 외부 명령어 이후에 더 많은 드로우 호출이 기록되는 경우, 파이프라인, 버텍스 및 인덱스 버퍼, 기타 상태를 다시 설정해야 합니다.
beginExternal() 및 nativeHandles()도 참조하십시오 .
void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
현재 렌더링 패스를 종료하는 레코드입니다.
resourceUpdates, null이 아닐 경우, 커밋된 후 해제될 리소스 업데이트 배치를 지정합니다.
beginPass()도 참조하십시오 .
double QRhiCommandBuffer::lastCompletedGpuTime()
QRhi 를 생성할 때 ‘ QRhi::EnableTimestamps ’ 기능이 활성화된 상태에서 사용 가능한 가장 최근의 타임스탬프를 초 단위로 반환합니다. 이 값은 마지막으로 완료된 프레임 동안 GPU에서 경과한 시간을 나타냅니다.
참고: ` QRhi::Timestamps ` 기능이 지원되지 않는 것으로 보고되었거나, ` QRhi::EnableTimestamps `가 ` QRhi::create()`에 전달되지 않은 경우에는 0 이외의 결과가 반환되지않습니다 . 일부 그래픽 API(Metal)의 경우 추가 작업(타임스탬프 쿼리)을 수행하지 않아도 타이밍 정보를 얻을 수 있어 예외가 존재하지만, 이식 가능한 애플리케이션은 타임스탬프 수집이 필요하다는 것을 알 때 항상 의도적으로 이를 활성화하고, 그에 따라 이 함수를 호출해야 합니다.
값의 해석에는 주의를 기울여야 합니다. 그 정밀도와 세분성은 종종 Qt에 의해 제어되지 않으며, 기본 그래픽 API와 그 구현에 따라 달라지기 때문입니다. 특히, 서로 다른 그래픽 API와 하드웨어 간의 값을 비교하는 것은 권장되지 않으며, 의미가 없을 수도 있습니다.
타이밍 값은 비동기적으로 제공될 가능성이 높습니다. 따라서 반환된 값은 0(예: 처음 1~2 프레임)이거나, 이전 프레임을 참조하는 마지막으로 알려진 값일 수 있습니다. 또한 창 크기 조정과 같은 특정 조건에서는 값이 다시 0이 될 수도 있습니다. beginFrame()에서 가장 최신의 사용 가능한 값이 가져와지며, beginFrame()이 반환되면 이 함수를 통해 해당 값을 조회할 수 있게 될 것으로 예상됩니다.
참고: 이 값이 바로 이전 프레임(currently_recorded - 1)을 가리킨다고 가정하지마십시오 . currently_recorded - 2 또는 currently_recorded - 3 을 가리킬 수도 있습니다. 정확한 동작은 그래픽 API 및 그 구현 방식에 따라 달라질 수 있습니다.
플랫폼에 따라 GPU 주파수 스케일링 및 GPU 클럭 변경으로 인한 결과를 주의 깊게 살펴보아야 합니다. 예를 들어, Windows 환경에서 최신 그래픽 카드를 사용하는 경우, 유사하거나 동일한 워크로드로 프레임을 제출하더라도 프레임 간 반환되는 타이밍이 상당히 넓은 범위에서 변동할 수 있습니다. 일반적으로 말해서, 이는 Qt가 제어하거나 해결할 수 있는 범위를 벗어납니다. 그러나 D3D12 백엔드는 환경 변수 ` QT_D3D_STABLE_POWER_STATE `가 0이 아닌 값으로 설정될 때마다 자동으로 ` ID3D12Device::SetStablePowerState()`를 호출합니다. 이를 통해 결과를 상당히 안정화할 수 있습니다. 또한, 특히 오프스크린 프레임이 포함된 경우, 예를 들어 ` QElapsedTimer `을 통해 측정된 CPU 측 타이밍에 무시할 수 없는 영향을 미칠 수도 있습니다.
참고: QT_D3D_STABLE_POWER_STATE 이 설정된 상태로 애플리케이션을 절대 프로덕션 환경에 배포해서는 안됩니다 . 자세한 내용은 Windows API 문서를 참조하십시오.
QRhi::Timestamps 및 QRhi::EnableTimestamps항목도 참조하십시오 .
const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()
QRhiVulkanCommandBufferNativeHandles 과 같은 백엔드별 QRhiNativeHandles 하위 클래스에 대한 포인터를 반환합니다. 백엔드에서 기본 네이티브 리소스의 노출을 지원하지 않거나 해당 리소스가 적용되지 않는 경우, 반환 값은 nullptr 입니다.
QRhiVulkanCommandBufferNativeHandles, QRhiMetalCommandBufferNativeHandles, beginExternal(), endExternal()도 참조하십시오 .
[override virtual] QRhiResource::Type QRhiCommandBuffer::resourceType() const
QRhiResource::resourceType() const를 재구현합니다.
리소스 유형을 반환합니다.
void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
때로는 렌더링 패스를 시작하지 않고 리소스 업데이트를 반영해야 하거나, 그렇게 하는 것이 더 편리한 경우가 있습니다. ` resourceUpdates ` 매개변수를 사용하여 이 함수를 호출하는 것은, ` beginPass()` 호출(또는 리드백의 경우 일반적으로 사용되는 ` endPass()`)에 ` resourceUpdates `을 전달하는 것의 대안입니다.
참고: 패스 내부에서는 호출할 수없습니다 .
void QRhiCommandBuffer::setBlendConstants(const QColor &c)
활성 블렌드 상수를 c 로 설정하는 레코드입니다.
이 함수는 바인딩된 파이프라인에 QRhiGraphicsPipeline::UsesBlendConstants 가 설정된 경우에만 호출할 수 있습니다.
void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)
새로운 컴퓨트 파이프라인을 설정하는 레코드 ps.
참고: 이 함수는 명령 버퍼에 setShaderResources() 또는 dispatch() 명령을 기록하기 전에 호출해야 합니다.
참고: QRhi 는 한 패스 내에서 불필요한 호출을 최적화하여 제거하므로, 애플리케이션 측에서 이 함수의 호출을 피하기 위해 과도하게 최적화할 필요는 없습니다.
참고: 이 함수는 컴퓨트 패스 내부, 즉 beginComputePass() 호출과 endComputePass() 호출 사이에서만 호출할 수 있습니다.
void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)
새로운 그래픽 파이프라인을 설정하는 레코드 ps.
참고: 이 함수는 명령 버퍼에 다른 set 또는 draw 명령을 기록하기 전에 호출해야 합니다.
참고: QRhi 는 한 패스 내에서 불필요한 호출을 최적화하여 제거하므로, 애플리케이션 측에서 이 함수의 호출을 피하기 위해 과도하게 최적화할 필요는 없습니다.
참고: 새로운 그래픽 파이프라인 ps 은 유효한 포인터여야 합니다.
UsesScissor 플래그가 없는 그래픽 파이프라인을 설정하면, 해당 기능이 적용되는 그래픽 API의 경우 시저링이 비활성화되거나, QRhi 백엔드 전반에 걸쳐 일관된 동작을 보장하기 위해 (시저링이 사실상 항상 활성화된 그래픽 API의 경우) 시저링 사각형이 마지막으로 설정된 뷰포트에 맞춰집니다.
void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)
scissor 에 지정된 활성 가위 사각형을 설정하는 레코드입니다.
이 함수는 바인딩된 파이프라인에 UsesScissor 가 설정된 경우에만 호출할 수 있습니다. 활성 파이프라인에서 이 플래그가 설정되면, 시저 테스트가 활성화되므로 시저 사각형을 반드시 제공해야 하므로 이 함수를 호출해야 합니다.
참고: ` QRhi `는 OpenGL 스타일의 뷰포트 좌표를 가정하므로, x와 y는 왼쪽 하단을 기준으로 합니다.
void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
하나 이상의 셰이더 단계에서 사용할 수 있도록 설정된, 유니폼 버퍼나 텍스처와 같은 셰이더 리소스 집합을 묶어주는 레코드입니다.
srb null일 수 있으며, 이 경우 현재 그래픽 또는 컴퓨트 파이프라인과 연관된 ` QRhiShaderResourceBindings `가 사용됩니다. ` srb `가 null이 아닐 경우, 반드시 ` layout-compatible`이어야 합니다. 즉, 레이아웃(바인딩 수, 각 바인딩의 유형 및 바인딩 번호)은 파이프라인의 `create()`를 호출할 당시 파이프라인에 연관되어 있던 ` QRhiShaderResourceBindings `와 완전히 일치해야 합니다.
겉보기에는 불필요해 보이는 setShaderResources() 호출이 필수적인 경우가 있습니다. srb 에서 참조되는 리소스를 재구축할 때, 예를 들어 QRhiBuffer 의 크기를 변경한 후 QRhiBuffer::create()를 호출하는 경우입니다. 이 시점에서 연관된 네이티브 객체(Vulkan의 경우 디스크립터 세트 등)가 업데이트되어, srb 에서 참조되는 QRhiBuffer, QRhiTexture, QRhiSampler 객체를 뒷받침하는 현재의 네이티브 리소스를 가리키게 됩니다. 이 경우 srb 가 마지막 호출 시와 동일하더라도 setShaderResources()를 반드시 호출해야 합니다.
srb 가 null이 아닐 경우, create()에서 파이프라인을 구축하는 데 사용된 QRhiShaderResourceBindings 객체는 어떠한 형태로도 접근되지 않는 것이 보장됩니다. 사실, 이 시점에서 해당 객체가 유효할 필요조차 없습니다. create() 이후 파이프라인에 연관된 srb를 파괴하고, 대신 모든 setShaderResources() 호출에서 layout compatible 에 명시된 다른 srb를 지정하는 것도 유효합니다.
dynamicOffsets QRhiShaderResourceBinding::uniformBufferWithDynamicOffset()을 통해 에 연결된 유니폼 버퍼에 대한 버퍼 오프셋을 지정할 수 있게 해줍니다. 이는 자체에서 오프셋을 제공하는 것과는 다릅니다. 동적 오프셋은 서로 다른 오프셋마다 새로운 를 생성할 필요가 없으며, (해당되는 백엔드의 경우) 기본 디스크립터를 작성하는 것을 피할 수 있으므로 더 효율적일 수 있습니다. 의 각 요소는 - 쌍입니다. 는 내의 요소 수를 지정합니다. srb srb QRhiShaderResourceBindings dynamicOffsets binding offset dynamicOffsetCount dynamicOffsets
참고: dynamicOffsets 내의모든 오프셋은 QRhi::ubufAlignment()에서 반환된 값에 대해 바이트 단위로 정렬되어야 합니다.
참고: 일부 백엔드는 지원되는 동적 오프셋의 수를 제한할 수 있습니다. dynamicOffsetCount 를 8보다 크게 설정하지 마십시오.
참고: QRhi 는 (위에서 설명한 조건을 고려하여) 한 패스 내의 불필요한 호출을 최적화하여 제거하므로, 애플리케이션 측에서 이 함수의 호출을 피하기 위해 과도하게 최적화할 필요는 없습니다.
참고: 이 함수는 렌더링 또는 컴퓨트 패스 내부, 즉 beginPass()과 endPass() 사이, 또는 beginComputePass()과 endComputePass() 사이에서만 호출할 수 있습니다.
[since 6.9] void QRhiCommandBuffer::setShadingRate(const QSize &coarsePixelSize)
다음 드로우 콜에 대한 셰이딩 속도를 ` coarsePixelSize`로 설정합니다.
기본값은 1x1입니다.
이 기능은 ' QRhi::VariableRateShading ' 기능이 지원되는 것으로 보고되고, 명령 버퍼에 바인딩된 QRhiGraphicsPipeline 가 생성될 때 ' QRhiGraphicsPipeline::UsesShadingRate '를 선언한 경우에만 작동합니다.
QRhi::supportedShadingRates()를 호출하여 주어진 샘플 수에 대해 어떤 셰이딩 속도가 지원되는지 확인하십시오.
QRhiShadingRateMap 와 이 함수가 모두 사용 중인 경우, 각 타일에 대해 두 셰이딩 속도 중 더 높은 쪽이 사용됩니다. 현재 콤바이너의 동작을 제어할 수 있는 방법은 없습니다.
이 함수는 Qt 6.9에서 도입되었습니다.
void QRhiCommandBuffer::setStencilRef(quint32 refValue)
활성 스텐실 기준값을 ` refValue`로 설정하는 레코드입니다.
이 함수는 바인딩된 파이프라인에 QRhiGraphicsPipeline::UsesStencilRef 가 설정되어 있을 때만 호출할 수 있습니다.
void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
정점 입력 바인딩을 기록합니다.
후속 drawIndexed() 명령에서 사용되는 인덱스 버퍼는 indexBuf, indexOffset 및 indexFormat 로 지정됩니다. 인덱스 기반 렌더링이 필요하지 않은 경우 indexBuf 를 null로 설정할 수 있습니다.
버텍스 버퍼 바인딩은 일괄 처리됩니다. startBinding 는 첫 번째 바인딩 번호를 지정합니다. 기록된 명령은 bindings 에 있는 각 버퍼를 startBinding + i 의 바인딩 지점에 바인딩하며, 여기서 i 는 bindings 의 인덱스입니다. bindings 의 각 요소는 QRhiBuffer 와 오프셋을 지정합니다.
참고: 일부 백엔드는 버텍스 버퍼 바인딩의 개수를 제한할 수 있습니다. bindingCount 가 8보다 크지 않도록 하십시오.
대부분의 백엔드에서는 동일한 패스 내에서 불필요한 정점 입력 및 인덱스 변경이 자동으로 무시되므로, 애플리케이션은 이 함수의 호출을 피하기 위해 과도하게 최적화할 필요가 없습니다.
간단한 예로, 두 개의 입력을 가진 버텍스 셰이더를 생각해 봅시다.
layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;그리고 데이터가 인터리브된 형식으로 제공되며, 위치에 2개의 부동소수점 수만 사용한다고 가정해 봅시다(따라서 정점당 5개의 부동소수점 수: x, y, r, g, b). 이 셰이더에 대한 QRhiGraphicsPipeline 은 다음의 입력 레이아웃을 사용하여 생성할 수 있습니다:
QRhiVertexInputLayout inputLayout;
inputLayout.setBindings({
{ 5 * sizeof(float) }
});
inputLayout.setAttributes({
{ 0, 0, QRhiVertexInputAttribute::Float2, 0 },
{ 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
});여기에는 하나의 버퍼 바인딩(바인딩 번호 0)이 있으며, 두 개의 입력이 이를 참조합니다. 패스를 기록할 때, 파이프라인이 설정되면 vbuf가 모든 인터리브된 위치+색상 데이터를 포함하는 QRhiBuffer 라고 가정할 때, 버텍스 바인딩은 다음과 같이 간단히 지정할 수 있습니다:
const QRhiCommandBuffer::VertexInput vbufBinding(vbuf, 0);
cb->setVertexInput(0, 1, &vbufBinding);void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)
viewport 에 지정된 활성 뷰포트 사각형을 설정하는 레코드입니다.
기본 그래픽 API에서 시저링이 항상 활성화된 백엔드의 경우, 이 함수는 활성 QRhiGraphicsPipeline 에 UsesScissor 가 설정되어 있지 않을 때마다 뷰포트에 맞춰 시저를 설정합니다.
참고: ` QRhi `는 OpenGL 스타일의 뷰포트 좌표를 가정하며, 이는 x와 y가 왼쪽 하단을 기준으로 한다는 것을 의미합니다.
© 2026 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.