9class ExampleRhiWidget :
public QRhiWidget
12 ExampleRhiWidget(QWidget *parent =
nullptr) : QRhiWidget(parent) { }
13 void initialize(QRhiCommandBuffer *cb) override;
14 void render(QRhiCommandBuffer *cb) override;
16 QRhi *m_rhi =
nullptr;
17 std::unique_ptr<QRhiBuffer> m_vbuf;
18 std::unique_ptr<QRhiBuffer> m_ubuf;
19 std::unique_ptr<QRhiShaderResourceBindings> m_srb;
20 std::unique_ptr<QRhiGraphicsPipeline> m_pipeline;
21 QMatrix4x4 m_viewProjection;
22 float m_rotation = 0.0f;
26 0.0f, 0.5f, 1.0f, 0.0f, 0.0f,
27 -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
28 0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
37void ExampleRhiWidget::initialize(QRhiCommandBuffer *cb)
45 m_vbuf.reset(m_rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer,
sizeof(vertexData)));
48 m_ubuf.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, 64));
51 m_srb.reset(m_rhi->newShaderResourceBindings());
53 QRhiShaderResourceBinding::uniformBuffer(0, QRhiShaderResourceBinding::VertexStage, m_ubuf.get()),
57 m_pipeline.reset(m_rhi->newGraphicsPipeline());
58 m_pipeline->setShaderStages({
59 { QRhiShaderStage::Vertex, getShader(QLatin1String(
":/shader_assets/color.vert.qsb")) },
60 { QRhiShaderStage::Fragment, getShader(QLatin1String(
":/shader_assets/color.frag.qsb")) }
63 inputLayout.setBindings({
66 inputLayout.setAttributes({
67 { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
68 { 0, 1, QRhiVertexInputAttribute::Float3, 2 *
sizeof(
float) }
70 m_pipeline->setVertexInputLayout(inputLayout);
71 m_pipeline->setShaderResourceBindings(m_srb.get());
72 m_pipeline->setRenderPassDescriptor(renderTarget()->renderPassDescriptor());
75 QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
76 resourceUpdates->uploadStaticBuffer(m_vbuf.get(), vertexData);
77 cb->resourceUpdate(resourceUpdates);
80 const QSize outputSize = colorTexture()->pixelSize();
81 m_viewProjection = m_rhi->clipSpaceCorrMatrix();
82 m_viewProjection.perspective(45.0f, outputSize.width() / (
float) outputSize.height(), 0.01f, 1000.0f);
83 m_viewProjection.translate(0, 0, -4);
86void ExampleRhiWidget::render(QRhiCommandBuffer *cb)
88 QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
90 QMatrix4x4 modelViewProjection = m_viewProjection;
91 modelViewProjection.rotate(m_rotation, 0, 1, 0);
92 resourceUpdates->updateDynamicBuffer(m_ubuf.get(), 0, 64, modelViewProjection.constData());
94 const QColor clearColor = QColor::fromRgbF(0.4f, 0.7f, 0.0f, 1.0f);
95 cb->beginPass(renderTarget(), clearColor, { 1.0f, 0 }, resourceUpdates);
97 cb->setGraphicsPipeline(m_pipeline.get());
98 const QSize outputSize = colorTexture()->pixelSize();
99 cb->setViewport(QRhiViewport(0, 0, outputSize.width(), outputSize.height()));
100 cb->setShaderResources();
101 const QRhiCommandBuffer::VertexInput vbufBinding(m_vbuf.get(), 0);
102 cb->setVertexInput(0, 1, &vbufBinding);