Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qssgrenderreflectionmap.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include <QtQuick3DRuntimeRender/private/qssgrenderreflectionprobe_p.h>
5#include <QtQuick3DRuntimeRender/private/qssgrenderlayer_p.h>
6#include <QtQuick3DRuntimeRender/private/qssglayerrenderdata_p.h>
7#include <QtQuick3DRuntimeRender/private/qssgrendercontextcore_p.h>
8#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
9
11
12const int prefilterSampleCount = 16;
13
15 : m_context(inContext)
16{
17}
18
20{
22}
23
25{
26 for (QSSGReflectionMapEntry &entry : m_reflectionMapList)
27 entry.destroyRhiResources();
28
29 m_reflectionMapList.clear();
30}
31
34 const QSize &size,
35 QRhiTexture::Flags flags = {})
36{
37 auto texture = rhi->newTexture(format, size, 1, flags);
38 if (!texture->create())
39 qWarning("Failed to create reflection map texture of size %dx%d", size.width(), size.height());
40 return texture;
41}
42
45 const QSize &size)
46{
47 auto renderBuffer = rhi->newRenderBuffer(type, size, 1);
48 if (!renderBuffer->create())
49 qWarning("Failed to build depth-stencil buffer of size %dx%d", size.width(), size.height());
50 return renderBuffer;
51}
52
53
55{
56 QRhi *rhi = m_context.rhiContext()->rhi();
57 // Bail out if there is no QRhi, since we can't add entries without it
58 if (!rhi)
59 return;
60
62
63 const QByteArray rtName = probe.debugObjectName.toLatin1();
64
65 const int mapRes = 1 << probe.reflectionMapRes;
66 QSize pixelSize(mapRes, mapRes);
68
69 if (!pEntry) {
75 m_reflectionMapList.push_back(QSSGReflectionMapEntry::withRhiCubeMap(probeIdx, map, prefiltered, depthStencil));
76
77 pEntry = &m_reflectionMapList.back();
78 }
79
80 if (pEntry) {
81 pEntry->m_needsRender = true;
82
83 if (probe.hasScheduledUpdate)
84 pEntry->m_rendered = false;
85
86 if (!pEntry->m_rhiDepthStencil || mapRes != pEntry->m_rhiCube->pixelSize().width()) {
87 pEntry->destroyRhiResources();
93 }
94
95 // Additional graphics resources: samplers, render targets.
96 if (pEntry->m_rhiRenderTargets.isEmpty()) {
97 pEntry->m_rhiRenderTargets.resize(6);
98 for (int i = 0; i < 6; ++i)
99 pEntry->m_rhiRenderTargets[i] = nullptr;
100 }
101 Q_ASSERT(pEntry->m_rhiRenderTargets.size() == 6);
102
103 if (pEntry->m_skyBoxSrbs.isEmpty()) {
104 pEntry->m_skyBoxSrbs.resize(6);
105 for (int i = 0; i < 6; ++i)
106 pEntry->m_skyBoxSrbs[i] = nullptr;
107 }
108
109
110 for (const auto face : QSSGRenderTextureCubeFaces) {
112 if (!rt) {
113 QRhiColorAttachment att(pEntry->m_rhiCube);
114 att.setLayer(quint8(face)); // 6 render targets, each referencing one face of the cubemap
116 rtDesc.setColorAttachments({ att });
118 rt = rhi->newTextureRenderTarget(rtDesc);
119 rt->setDescription(rtDesc);
120 if (!pEntry->m_rhiRenderPassDesc)
123 if (!rt->create())
124 qWarning("Failed to build reflection map render target");
125 }
126 rt->setName(rtName + QByteArrayLiteral(" reflection cube face: ") + QSSGBaseTypeHelpers::displayName(face));
127 }
128
129 if (!pEntry->m_prefilterPipeline) {
130 const QSize mapSize = pEntry->m_rhiCube->pixelSize();
131
132 int mipmapCount = rhi->mipLevelsForSize(mapSize);
133 mipmapCount = qMin(mipmapCount, 6); // don't create more than 6 mip levels
134
135 // Create a renderbuffer for each mip level
136 for (int mipLevel = 0; mipLevel < mipmapCount; ++mipLevel) {
137 const QSize levelSize = QSize(mapSize.width() * std::pow(0.5, mipLevel),
138 mapSize.height() * std::pow(0.5, mipLevel));
139 pEntry->m_prefilterMipLevelSizes.insert(mipLevel, levelSize);
140 // Setup Render targets (6 * mipmapCount)
142 for (const auto face : QSSGRenderTextureCubeFaces) {
144 att.setLayer(quint8(face));
145 att.setLevel(mipLevel);
147 rtDesc.setColorAttachments({att});
148 auto renderTarget = rhi->newTextureRenderTarget(rtDesc);
149 renderTarget->setName(rtName + QByteArrayLiteral(" reflection prefilter mip/face ")
151 renderTarget->setDescription(rtDesc);
152 if (!pEntry->m_rhiPrefilterRenderPassDesc)
154 renderTarget->setRenderPassDescriptor(pEntry->m_rhiPrefilterRenderPassDesc);
155 if (!renderTarget->create())
156 qWarning("Failed to build prefilter cube map render target");
157 renderTargets << renderTarget;
158 }
159 pEntry->m_rhiPrefilterRenderTargetsMap.insert(mipLevel, renderTargets);
160 }
161
162 const auto &prefilterShaderStages = m_context.shaderCache()->loadBuiltinForRhi("reflectionprobeprefilter");
163
164 const QSSGRhiSamplerDescription samplerMipMapDesc {
171 };
172
173 const QSSGRhiSamplerDescription samplerDesc {
180 };
181
182 QRhiSampler *sampler = m_context.rhiContext()->sampler(samplerDesc);
183 QRhiSampler *cubeSampler = m_context.rhiContext()->sampler(samplerMipMapDesc);
184
185 QRhiVertexInputLayout inputLayout;
186 inputLayout.setBindings({
187 { 3 * sizeof(float) }
188 });
189 inputLayout.setAttributes({
191 });
192
193 int ubufElementSize = rhi->ubufAligned(128);
195 pEntry->m_prefilterVertBuffer->create();
196
197 const int uBufSamplesSize = 16 * prefilterSampleCount + 8;
198 int uBufSamplesElementSize = rhi->ubufAligned(uBufSamplesSize);
199 pEntry->m_prefilterFragBuffer = rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, uBufSamplesElementSize * mipmapCount);
200 pEntry->m_prefilterFragBuffer->create();
201
207 *prefilterShaderStages->vertexStage(),
208 *prefilterShaderStages->fragmentStage()
209 });
210
212 pEntry->m_prefilterSrb->setBindings({
216 });
217 pEntry->m_prefilterSrb->create();
218
219 pEntry->m_prefilterPipeline->setVertexInputLayout(inputLayout);
222 if (!pEntry->m_prefilterPipeline->create())
223 qWarning("failed to create pre-filter reflection map pipeline state");
224
225 const auto &irradianceShaderStages = m_context.shaderCache()->loadBuiltinForRhi("environmentmapprefilter");
226
232 *irradianceShaderStages->vertexStage(),
233 *irradianceShaderStages->fragmentStage()
234 });
235
236 int ubufIrradianceSize = rhi->ubufAligned(20);
239
245 });
246 pEntry->m_irradianceSrb->create();
247
249 pEntry->m_irradiancePipeline->setVertexInputLayout(inputLayout);
251 if (!pEntry->m_irradiancePipeline->create())
252 qWarning("failed to create irradiance reflection map pipeline state");
253 }
254
255 pEntry->m_timeSlicing = probe.timeSlicing;
256 pEntry->m_probeIndex = probeIdx;
257 Q_QUICK3D_PROFILE_ASSIGN_ID(&probe, pEntry);
258 }
259}
260
262{
263 QSSGReflectionMapEntry *pEntry = reflectionMapEntry(probeIdx);
265 if (!pEntry) {
266 if (probeTexture.m_texture)
267 m_reflectionMapList.push_back(QSSGReflectionMapEntry::withRhiTexturedCubeMap(probeIdx, probeTexture.m_texture));
268 else
269 addReflectionMapEntry(probeIdx, probe);
270 } else {
271 if (pEntry->m_rhiDepthStencil)
272 pEntry->destroyRhiResources();
273 if (probeTexture.m_texture)
274 pEntry->m_rhiPrefilteredCube = probeTexture.m_texture;
275 }
276}
277
279{
280 Q_ASSERT(probeIdx >= 0);
281
282 for (int i = 0; i < m_reflectionMapList.size(); i++) {
283 QSSGReflectionMapEntry *pEntry = &m_reflectionMapList[i];
284 if (pEntry->m_probeIndex == quint32(probeIdx))
285 return pEntry;
286 }
287
288 return nullptr;
289}
290
292 : m_probeIndex(std::numeric_limits<quint32>::max())
293{
294}
295
296// Vertex data for rendering reflection cube map
297static const float cube[] = {
298 -1.0f,-1.0f,-1.0f, // -X side
299 -1.0f,-1.0f, 1.0f,
300 -1.0f, 1.0f, 1.0f,
301 -1.0f, 1.0f, 1.0f,
302 -1.0f, 1.0f,-1.0f,
303 -1.0f,-1.0f,-1.0f,
304
305 -1.0f,-1.0f,-1.0f, // -Z side
306 1.0f, 1.0f,-1.0f,
307 1.0f,-1.0f,-1.0f,
308 -1.0f,-1.0f,-1.0f,
309 -1.0f, 1.0f,-1.0f,
310 1.0f, 1.0f,-1.0f,
311
312 -1.0f,-1.0f,-1.0f, // -Y side
313 1.0f,-1.0f,-1.0f,
314 1.0f,-1.0f, 1.0f,
315 -1.0f,-1.0f,-1.0f,
316 1.0f,-1.0f, 1.0f,
317 -1.0f,-1.0f, 1.0f,
318
319 -1.0f, 1.0f,-1.0f, // +Y side
320 -1.0f, 1.0f, 1.0f,
321 1.0f, 1.0f, 1.0f,
322 -1.0f, 1.0f,-1.0f,
323 1.0f, 1.0f, 1.0f,
324 1.0f, 1.0f,-1.0f,
325
326 1.0f, 1.0f,-1.0f, // +X side
327 1.0f, 1.0f, 1.0f,
328 1.0f,-1.0f, 1.0f,
329 1.0f,-1.0f, 1.0f,
330 1.0f,-1.0f,-1.0f,
331 1.0f, 1.0f,-1.0f,
332
333 -1.0f, 1.0f, 1.0f, // +Z side
334 -1.0f,-1.0f, 1.0f,
335 1.0f, 1.0f, 1.0f,
336 -1.0f,-1.0f, 1.0f,
337 1.0f,-1.0f, 1.0f,
338 1.0f, 1.0f, 1.0f,
339
340 0.0f, 1.0f, // -X side
341 1.0f, 1.0f,
342 1.0f, 0.0f,
343 1.0f, 0.0f,
344 0.0f, 0.0f,
345 0.0f, 1.0f,
346
347 1.0f, 1.0f, // -Z side
348 0.0f, 0.0f,
349 0.0f, 1.0f,
350 1.0f, 1.0f,
351 1.0f, 0.0f,
352 0.0f, 0.0f,
353
354 1.0f, 0.0f, // -Y side
355 1.0f, 1.0f,
356 0.0f, 1.0f,
357 1.0f, 0.0f,
358 0.0f, 1.0f,
359 0.0f, 0.0f,
360
361 1.0f, 0.0f, // +Y side
362 0.0f, 0.0f,
363 0.0f, 1.0f,
364 1.0f, 0.0f,
365 0.0f, 1.0f,
366 1.0f, 1.0f,
367
368 1.0f, 0.0f, // +X side
369 0.0f, 0.0f,
370 0.0f, 1.0f,
371 0.0f, 1.0f,
372 1.0f, 1.0f,
373 1.0f, 0.0f,
374
375 0.0f, 0.0f, // +Z side
376 0.0f, 1.0f,
377 1.0f, 0.0f,
378 0.0f, 1.0f,
379 1.0f, 1.0f,
380 1.0f, 0.0f,
381};
382
384{
385 bits = (bits << 16u) | (bits >> 16u);
386 bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
387 bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
388 bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
389 bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
390 return float(bits) * 2.3283064365386963e-10; // / 0x100000000
391}
392
394{
395 return QVector2D(float(i) / float(N), radicalInverseVdC(i));
396}
397
399{
400 float a = roughness*roughness;
401
402 float phi = 2.0f * M_PI * xi.x();
403 float cosTheta = sqrt((1.0f - xi.y()) / (1.0f + (a*a - 1.0f) * xi.y()));
404 float sinTheta = sqrt(1.0f - cosTheta * cosTheta);
405
406 // from spherical coordinates to cartesian coordinates
407 return QVector3D(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
408}
409
410float distributionGGX(float nDotH, float roughness)
411{
412 float a = roughness * roughness;
413 float a2 = a * a;
414 float nDotH2 = nDotH * nDotH;
415
416 float nom = a2;
417 float denom = nDotH2 * (a2 - 1.0f) + 1.0f;
418 denom = M_PI * denom * denom;
419
420 return nom / denom;
421}
422
423void fillPrefilterValues(float roughness, float resolution,
425 float &invTotalWeight, uint &sampleCount)
426{
427 for (int i = 0; i < prefilterSampleCount * 8; ++i) {
429 const QVector3D half = importanceSampleGGX(xi, roughness);
430 QVector3D light = 2.0f * half.z() * half - QVector3D(0, 0, 1);
431 light.normalize();
432 const float D = distributionGGX(half.z(), roughness);
433 const float pdf = D * half.z() / (4.0f * half.z()) + 0.0001f;
434 const float saTexel = 4.0f * M_PI / (6.0f * resolution * resolution);
435 const float saSample = 1.0f / (float(prefilterSampleCount) * pdf + 0.0001f);
436 float mipLevel = roughness == 0.0f ? 0.0f : 0.5f * log2(saSample / saTexel);
437 if (light.z() > 0) {
438 sampleDirections.append(QVector4D(light, mipLevel));
439 invTotalWeight += light.z();
440 sampleCount++;
441 if (sampleCount >= prefilterSampleCount)
442 break;
443 }
444 }
445 invTotalWeight = 1.0f / invTotalWeight;
446}
447
449{
450 auto *rhi = context->rhi();
451 auto *cb = context->commandBuffer();
452
453 auto *rub = rhi->nextResourceUpdateBatch();
456 vertexBuffer->create();
457 vertexBuffer->deleteLater();
458 rub->uploadStaticBuffer(vertexBuffer, cube);
459 cb->resourceUpdate(rub);
460
461 const QRhiCommandBuffer::VertexInput vbufBinding(vertexBuffer, 0);
462
463 int ubufElementSize = rhi->ubufAligned(128);
464
465 const int uBufSamplesSize = 16 * prefilterSampleCount + 8;
466 int uBufSamplesElementSize = rhi->ubufAligned(uBufSamplesSize);
467 int uBufIrradianceElementSize = rhi->ubufAligned(20);
468
469 // Uniform Data
470 QMatrix4x4 mvp = rhi->clipSpaceCorrMatrix();
471 mvp.perspective(90.0f, 1.0f, 0.1f, 10.0f);
472
473 auto lookAt = [](const QVector3D &eye, const QVector3D &center, const QVector3D &up) {
474 QMatrix4x4 viewMatrix;
475 viewMatrix.lookAt(eye, center, up);
476 return viewMatrix;
477 };
479 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(1.0, 0.0, 0.0), QVector3D(0.0f, -1.0f, 0.0f)));
480 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(-1.0, 0.0, 0.0), QVector3D(0.0f, -1.0f, 0.0f)));
481 if (rhi->isYUpInFramebuffer()) {
482 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, 1.0, 0.0), QVector3D(0.0f, 0.0f, 1.0f)));
483 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, -1.0, 0.0), QVector3D(0.0f, 0.0f, -1.0f)));
484 } else {
485 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, -1.0, 0.0), QVector3D(0.0f, 0.0f, -1.0f)));
486 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, 1.0, 0.0), QVector3D(0.0f, 0.0f, 1.0f)));
487 }
488 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, 0.0, 1.0), QVector3D(0.0f, -1.0f, 0.0f)));
489 views.append(lookAt(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, 0.0, -1.0), QVector3D(0.0f, -1.0f, 0.0f)));
490
491 rub = rhi->nextResourceUpdateBatch();
492 for (const auto face : QSSGRenderTextureCubeFaces) {
493 rub->updateDynamicBuffer(m_prefilterVertBuffer, quint8(face) * ubufElementSize, 64, mvp.constData());
494 rub->updateDynamicBuffer(m_prefilterVertBuffer, quint8(face) * ubufElementSize + 64, 64, views[quint8(face)].constData());
495 }
496
497 const QSize mapSize = m_rhiCube->pixelSize();
498
499 int mipmapCount = rhi->mipLevelsForSize(mapSize);
500 mipmapCount = qMin(mipmapCount, 6);
501
502 const float resolution = mapSize.width();
504
505 // set the samples uniform buffer data
506 for (int mipLevel = 0; mipLevel < mipmapCount - 1; ++mipLevel) {
507 Q_ASSERT(mipmapCount - 2);
508 const float roughness = float(mipLevel) / float(mipmapCount - 2);
509 float invTotalWeight = 0.0f;
510 uint sampleCount = 0;
511
512 sampleDirections.clear();
513 fillPrefilterValues(roughness, resolution, sampleDirections, invTotalWeight, sampleCount);
514
515 rub->updateDynamicBuffer(m_prefilterFragBuffer, mipLevel * uBufSamplesElementSize, 16 * prefilterSampleCount, sampleDirections.constData());
516 rub->updateDynamicBuffer(m_prefilterFragBuffer, mipLevel * uBufSamplesElementSize + 16 * prefilterSampleCount, 4, &invTotalWeight);
517 rub->updateDynamicBuffer(m_prefilterFragBuffer, mipLevel * uBufSamplesElementSize + 16 * prefilterSampleCount + 4, 4, &sampleCount);
518 }
519 {
520 const float roughness = 0.0f; // doesn't matter for irradiance
521 const float lodBias = 0.0f;
522 const int distribution = 0;
523 const int sampleCount = resolution / 4;
524
525 rub->updateDynamicBuffer(m_irradianceFragBuffer, 0, 4, &roughness);
526 rub->updateDynamicBuffer(m_irradianceFragBuffer, 4, 4, &resolution);
527 rub->updateDynamicBuffer(m_irradianceFragBuffer, 4 + 4, 4, &lodBias);
528 rub->updateDynamicBuffer(m_irradianceFragBuffer, 4 + 4 + 4, 4, &sampleCount);
529 rub->updateDynamicBuffer(m_irradianceFragBuffer, 4 + 4 + 4 + 4, 4, &distribution);
530 }
531
532 cb->resourceUpdate(rub);
533
534 // Render
535 for (int mipLevel = 0; mipLevel < mipmapCount; ++mipLevel) {
537 mipLevel = m_timeSliceFrame;
538
539 for (auto face : QSSGRenderTextureCubeFaces) {
542
543 cb->beginPass(m_rhiPrefilterRenderTargetsMap[mipLevel][quint8(face)], QColor(0, 0, 0, 1), { 1.0f, 0 }, nullptr, QSSGRhiContext::commonPassFlags());
545 Q_QUICK3D_PROFILE_START(QQuick3DProfiler::Quick3DRenderPass);
546 if (mipLevel < mipmapCount - 1) {
547 // Specular pre-filtered Cube Map levels
548 cb->setGraphicsPipeline(m_prefilterPipeline);
549 cb->setVertexInput(0, 1, &vbufBinding);
550 cb->setViewport(QRhiViewport(0, 0, m_prefilterMipLevelSizes[mipLevel].width(), m_prefilterMipLevelSizes[mipLevel].height()));
551 QVector<QPair<int, quint32>> dynamicOffsets = {
552 { 0, quint32(ubufElementSize * quint8(face)) },
553 { 2, quint32(uBufSamplesElementSize * mipLevel) }
554 };
555 cb->setShaderResources(m_prefilterSrb, 2, dynamicOffsets.constData());
556 } else {
557 // Diffuse Irradiance
558 cb->setGraphicsPipeline(m_irradiancePipeline);
559 cb->setVertexInput(0, 1, &vbufBinding);
560 cb->setViewport(QRhiViewport(0, 0, m_prefilterMipLevelSizes[mipLevel].width(), m_prefilterMipLevelSizes[mipLevel].height()));
561 QVector<QPair<int, quint32>> dynamicOffsets = {
562 { 0, quint32(ubufElementSize * quint8(face)) },
563 { 2, quint32(uBufIrradianceElementSize) }
564 };
565 cb->setShaderResources(m_irradianceSrb, 1, dynamicOffsets.constData());
566 }
567 Q_QUICK3D_PROFILE_START(QQuick3DProfiler::Quick3DRenderCall);
568 cb->draw(36);
570 Q_QUICK3D_PROFILE_END_WITH_ID(QQuick3DProfiler::Quick3DRenderCall, 36llu | (1llu << 32), profilingId);
571 cb->endPass();
572 QSSGRHICTX_STAT(context, endRenderPass());
573 Q_QUICK3D_PROFILE_END_WITH_STRING(QQuick3DProfiler::Quick3DRenderPass, 0, QSSG_RENDERPASS_NAME("reflection_map", mipLevel, face));
574
576 break;
577 }
578
581 if (m_timeSliceFrame >= mipmapCount)
583 break;
584 }
585 }
586 cb->debugMarkEnd();
587}
588
590{
592 e.m_probeIndex = probeIdx;
593 e.m_rhiPrefilteredCube = prefiltered;
594 return e;
595}
596
599 QRhiTexture *prefiltered,
600 QRhiRenderBuffer *depthStencil)
601{
603 e.m_probeIndex = probeIdx;
604 e.m_rhiCube = cube;
605 e.m_rhiPrefilteredCube = prefiltered;
606 e.m_rhiDepthStencil = depthStencil;
607 return e;
608}
609
611{
612 delete m_rhiCube;
613 m_rhiCube = nullptr;
614 // Without depth stencil the prefiltered cubemap is assumed to be not owned here and shouldn't be deleted
617 m_rhiPrefilteredCube = nullptr;
618 delete m_rhiDepthStencil;
619 m_rhiDepthStencil = nullptr;
620
623 delete m_rhiRenderPassDesc;
624 m_rhiRenderPassDesc = nullptr;
625
626 delete m_prefilterPipeline;
627 m_prefilterPipeline = nullptr;
629 m_irradiancePipeline = nullptr;
630 delete m_prefilterSrb;
631 m_prefilterSrb = nullptr;
632 delete m_irradianceSrb;
633 m_irradianceSrb = nullptr;
635 m_prefilterVertBuffer = nullptr;
637 m_prefilterFragBuffer = nullptr;
639 m_irradianceFragBuffer = nullptr;
642 for (const auto &e : std::as_const(m_rhiPrefilterRenderTargetsMap))
643 qDeleteAll(e);
646}
647
\inmodule QtCore
Definition qbytearray.h:57
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
Definition qlist.h:74
qsizetype size() const noexcept
Definition qlist.h:386
const_pointer constData() const noexcept
Definition qlist.h:416
reference back()
Definition qlist.h:686
void push_back(parameter_type t)
Definition qlist.h:672
void clear()
Definition qlist.h:417
iterator insert(const Key &key, const T &value)
Definition qmap.h:687
void clear()
Definition qmap.h:288
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
void lookAt(const QVector3D &eye, const QVector3D &center, const QVector3D &up)
Multiplies this matrix by a viewing matrix derived from an eye point.
void perspective(float verticalAngle, float aspectRatio, float nearPlane, float farPlane)
Multiplies this matrix by another that applies a perspective projection.
const float * constData() const
Returns a constant pointer to the raw data of this matrix.
Definition qmatrix4x4.h:147
\inmodule QtGui
Definition qrhi.h:834
@ Immutable
Definition qrhi.h:837
@ Dynamic
Definition qrhi.h:839
@ VertexBuffer
Definition qrhi.h:843
@ UniformBuffer
Definition qrhi.h:845
virtual bool create()=0
Creates the corresponding native graphics resources.
\inmodule QtGui
Definition qrhi.h:568
void setLevel(int level)
Sets the mip level.
Definition qrhi.h:584
void setLayer(int layer)
Sets the layer index.
Definition qrhi.h:581
QPair< QRhiBuffer *, quint32 > VertexInput
Synonym for QPair<QRhiBuffer *, quint32>.
Definition qrhi.h:1643
void setCullMode(CullMode mode)
Sets the specified face culling mode.
Definition qrhi.h:1364
void setFrontFace(FrontFace f)
Sets the front face mode f.
Definition qrhi.h:1367
void setShaderResourceBindings(QRhiShaderResourceBindings *srb)
Associates with srb describing the resource binding layout and the resources (QRhiBuffer,...
Definition qrhi.h:1433
void setDepthOp(CompareOp op)
Sets the depth comparison function op.
Definition qrhi.h:1388
void setVertexInputLayout(const QRhiVertexInputLayout &layout)
Specifies the vertex input layout.
Definition qrhi.h:1430
void setShaderStages(std::initializer_list< QRhiShaderStage > list)
Sets the list of shader stages.
Definition qrhi.h:1417
void setRenderPassDescriptor(QRhiRenderPassDescriptor *desc)
Associates with the specified QRhiRenderPassDescriptor desc.
Definition qrhi.h:1436
virtual bool create()=0
Creates the corresponding native graphics resources.
\inmodule QtGui
Definition qrhi.h:1071
Type
Specifies the type of the renderbuffer.
Definition qrhi.h:1073
virtual QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const =0
void setRenderPassDescriptor(QRhiRenderPassDescriptor *desc)
Sets the QRhiRenderPassDescriptor desc for use with this render target.
Definition qrhi.h:1142
void generateMips(QRhiTexture *tex)
Enqueues a mipmap generation operation for the specified texture tex.
Definition qrhi.cpp:8812
void updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
Enqueues updating a region of a QRhiBuffer buf created with the type QRhiBuffer::Dynamic.
Definition qrhi.cpp:8595
void setName(const QByteArray &name)
Sets a name for the object.
Definition qrhi.cpp:3455
void deleteLater()
When called without a frame being recorded, this function is equivalent to deleting the object.
Definition qrhi.cpp:3419
\inmodule QtGui
Definition qrhi.h:1007
@ ClampToEdge
Definition qrhi.h:1017
static QRhiShaderResourceBinding sampledTexture(int binding, StageFlags stage, QRhiTexture *tex, QRhiSampler *sampler)
Definition qrhi.cpp:5406
static QRhiShaderResourceBinding uniformBufferWithDynamicOffset(int binding, StageFlags stage, QRhiBuffer *buf, quint32 size)
Definition qrhi.cpp:5366
void setBindings(std::initializer_list< QRhiShaderResourceBinding > list)
Sets the list of bindings.
Definition qrhi.h:1194
virtual bool create()=0
void setDepthStencilBuffer(QRhiRenderBuffer *renderBuffer)
Sets the renderBuffer for depth-stencil.
Definition qrhi.h:632
void setColorAttachments(std::initializer_list< QRhiColorAttachment > list)
Sets the list of color attachments.
Definition qrhi.h:619
\inmodule QtGui
Definition qrhi.h:1161
void setDescription(const QRhiTextureRenderTargetDescription &desc)
Sets the render target description desc.
Definition qrhi.h:1172
virtual QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor()=0
virtual bool create()=0
Creates the corresponding native graphics resources.
\inmodule QtGui
Definition qrhi.h:883
@ UsedWithGenerateMips
Definition qrhi.h:891
@ MipMapped
Definition qrhi.h:888
@ RenderTarget
Definition qrhi.h:886
@ CubeMap
Definition qrhi.h:887
Format
Specifies the texture format.
Definition qrhi.h:902
@ RGBA16F
Definition qrhi.h:913
QSize pixelSize() const
Definition qrhi.h:963
\inmodule QtGui
Definition qrhi.h:313
void setBindings(std::initializer_list< QRhiVertexInputBinding > list)
Sets the bindings from the specified list.
Definition qrhi.h:317
void setAttributes(std::initializer_list< QRhiVertexInputAttribute > list)
Sets the attributes from the specified list.
Definition qrhi.h:329
\inmodule QtGui
Definition qrhi.h:85
\inmodule QtGui
Definition qrhi.h:1767
QRhiBuffer * newBuffer(QRhiBuffer::Type type, QRhiBuffer::UsageFlags usage, quint32 size)
Definition qrhi.cpp:10079
int ubufAligned(int v) const
Definition qrhi.cpp:9570
QMatrix4x4 clipSpaceCorrMatrix() const
Definition qrhi.cpp:9662
bool isYUpInFramebuffer() const
Definition qrhi.cpp:9601
QRhiShaderResourceBindings * newShaderResourceBindings()
Definition qrhi.cpp:10060
QRhiRenderBuffer * newRenderBuffer(QRhiRenderBuffer::Type type, const QSize &pixelSize, int sampleCount=1, QRhiRenderBuffer::Flags flags={}, QRhiTexture::Format backingFormatHint=QRhiTexture::UnknownFormat)
Definition qrhi.cpp:10106
static int mipLevelsForSize(const QSize &size)
Definition qrhi.cpp:9579
QRhiTextureRenderTarget * newTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget::Flags flags={})
Definition qrhi.cpp:10245
QRhiGraphicsPipeline * newGraphicsPipeline()
Definition qrhi.cpp:10037
QRhiTexture * newTexture(QRhiTexture::Format format, const QSize &pixelSize, int sampleCount=1, QRhiTexture::Flags flags={})
Definition qrhi.cpp:10133
QRhiResourceUpdateBatch * nextResourceUpdateBatch()
Definition qrhi.cpp:8854
static const char * displayName(QSSGRenderTextureCubeFace face)
const std::unique_ptr< QSSGRhiContext > & rhiContext() const
const std::unique_ptr< QSSGBufferManager > & bufferManager() const
const std::unique_ptr< QSSGShaderCache > & shaderCache() const
QSSGReflectionMapEntry * reflectionMapEntry(int probeIdx)
void addTexturedReflectionMapEntry(qint32 probeIdx, const QSSGRenderReflectionProbe &probe)
const QSSGRenderContextInterface & m_context
QSSGRenderReflectionMap(const QSSGRenderContextInterface &inContext)
void addReflectionMapEntry(qint32 probeIdx, const QSSGRenderReflectionProbe &probe)
static QRhiCommandBuffer::BeginPassFlags commonPassFlags()
\inmodule QtCore
Definition qsize.h:25
constexpr int height() const noexcept
Returns the height.
Definition qsize.h:132
constexpr int width() const noexcept
Returns the width.
Definition qsize.h:129
QByteArray toLatin1() const &
Definition qstring.h:559
constexpr size_type size() const noexcept
bool isEmpty() const
void resize(qsizetype sz)
void append(const T &t)
const T * constData() const
The QVector2D class represents a vector or vertex in 2D space.
Definition qvectornd.h:31
constexpr float y() const noexcept
Returns the y coordinate of this point.
Definition qvectornd.h:502
constexpr float x() const noexcept
Returns the x coordinate of this point.
Definition qvectornd.h:501
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
void normalize() noexcept
Normalizes the current vector in place.
Definition qvectornd.h:702
constexpr float z() const noexcept
Returns the z coordinate of this point.
Definition qvectornd.h:672
The QVector4D class represents a vector or vertex in 4D space.
Definition qvectornd.h:330
QMap< QString, QString > map
[6]
qDeleteAll(list.begin(), list.end())
double e
Combined button and popup list for selecting options.
static void * context
#define QByteArrayLiteral(str)
Definition qbytearray.h:52
#define qWarning
Definition qlogging.h:162
#define M_PI
Definition qmath.h:209
constexpr const T & qMin(const T &a, const T &b)
Definition qminmax.h:40
GLint GLsizei GLsizei height
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint sampler
GLenum face
GLint GLsizei width
GLenum type
GLbitfield flags
GLenum GLuint texture
GLint GLsizei GLsizei GLenum format
GLuint entry
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
static int log2(uint i)
#define Q_QUICK3D_PROFILE_START(Type)
#define Q_QUICK3D_PROFILE_END_WITH_ID(Type, Payload, POID)
#define QSSG_RENDERPASS_NAME(passName, level, face)
#define Q_QUICK3D_PROFILE_END_WITH_STRING(Type, Payload, Str)
#define Q_QUICK3D_PROFILE_ASSIGN_ID(bgnode, obj)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static constexpr QSSGRenderTextureCubeFace QSSGRenderTextureCubeFaces[]
float distributionGGX(float nDotH, float roughness)
static QRhiRenderBuffer * allocateRhiReflectionRenderBuffer(QRhi *rhi, QRhiRenderBuffer::Type type, const QSize &size)
QT_BEGIN_NAMESPACE const int prefilterSampleCount
static QRhiTexture * allocateRhiReflectionTexture(QRhi *rhi, QRhiTexture::Format format, const QSize &size, QRhiTexture::Flags flags={})
void fillPrefilterValues(float roughness, float resolution, QVarLengthArray< QVector4D, prefilterSampleCount > &sampleDirections, float &invTotalWeight, uint &sampleCount)
float radicalInverseVdC(uint bits)
static const float cube[]
QVector3D importanceSampleGGX(QVector2D xi, float roughness)
QVector2D hammersley(uint i, uint N)
#define QSSGRHICTX_STAT(ctx, f)
SSL_CTX int(* cb)(SSL *ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
#define a2
unsigned int quint32
Definition qtypes.h:45
int qint32
Definition qtypes.h:44
unsigned int uint
Definition qtypes.h:29
unsigned char quint8
Definition qtypes.h:41
myFilter draw(painter, QPoint(0, 0), originalPixmap)
QJSValue cube
QVarLengthArray< QRhiTextureRenderTarget *, 6 > m_rhiRenderTargets
QSSGRenderReflectionProbe::ReflectionTimeSlicing m_timeSlicing
QVarLengthArray< QRhiShaderResourceBindings *, 6 > m_skyBoxSrbs
static QSSGReflectionMapEntry withRhiTexturedCubeMap(quint32 probeIdx, QRhiTexture *preFiltered)
QRhiRenderPassDescriptor * m_rhiRenderPassDesc
static QSSGReflectionMapEntry withRhiCubeMap(quint32 probeIdx, QRhiTexture *cube, QRhiTexture *prefiltered, QRhiRenderBuffer *depthStencil)
QRhiShaderResourceBindings * m_irradianceSrb
QRhiShaderResourceBindings * m_prefilterSrb
QMap< int, QSize > m_prefilterMipLevelSizes
void renderMips(QSSGRhiContext *context)
QRhiRenderPassDescriptor * m_rhiPrefilterRenderPassDesc
QRhiGraphicsPipeline * m_irradiancePipeline
QRhiGraphicsPipeline * m_prefilterPipeline
QMap< int, QVarLengthArray< QRhiTextureRenderTarget *, 6 > > m_rhiPrefilterRenderTargetsMap
QSSGRenderTextureCubeFace m_timeSliceFace