Showing the changes to libraries/render-utils/src/DebugDeferredBuffer.cpp (1 of 1213 files). Show all
Unified · Split
| @@ -39,7 +39,7 @@ void DebugDeferredBufferConfig::setMode(int newMode) { · 38 unmodified lines | |||
| 39 | emit dirty(); | 39 | emit dirty(); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | enum Slot { | 42 | enum TextureSlot { |
| 43 | Albedo = 0, | 43 | Albedo = 0, |
| 44 | Normal, | 44 | Normal, |
| 45 | Specular, | 45 | Specular, |
| @@ -57,7 +57,11 @@ enum Slot { · 11 unmodified lines | |||
| 57 | Velocity, | 57 | Velocity, |
| 58 | }; | 58 | }; |
| 59 | 59 | ||
| 60 | 60 | enum ParamSlot { | |
| 61 | CameraCorrection = 0, | ||
| 62 | DeferredFrameTransform, | ||
| 63 | ShadowTransform | ||
| 64 | }; | ||
| 61 | 65 | ||
| 62 | static const std::string DEFAULT_ALBEDO_SHADER { | 66 | static const std::string DEFAULT_ALBEDO_SHADER { |
| 63 | "vec4 getFragmentColor() {" | 67 | "vec4 getFragmentColor() {" |
| @@ -128,12 +132,14 @@ static const std::string DEFAULT_DEPTH_SHADER { · 64 unmodified lines | |||
| 128 | " return vec4(vec3(texture(depthMap, uv).x), 1.0);" | 132 | " return vec4(vec3(texture(depthMap, uv).x), 1.0);" |
| 129 | " }" | 133 | " }" |
| 130 | }; | 134 | }; |
| 135 | |||
| 131 | static const std::string DEFAULT_LIGHTING_SHADER { | 136 | static const std::string DEFAULT_LIGHTING_SHADER { |
| 132 | "vec4 getFragmentColor() {" | 137 | "vec4 getFragmentColor() {" |
| 133 | " return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0);" | 138 | " return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0);" |
| 134 | " }" | 139 | " }" |
| 135 | }; | 140 | }; |
| 136 | static const std::string DEFAULT_SHADOW_SHADER { | 141 | |
| 142 | static const std::string DEFAULT_SHADOW_SHADER{ | ||
| 137 | "uniform sampler2DShadow shadowMap;" | 143 | "uniform sampler2DShadow shadowMap;" |
| 138 | "vec4 getFragmentColor() {" | 144 | "vec4 getFragmentColor() {" |
| 139 | " for (int i = 255; i >= 0; --i) {" | 145 | " for (int i = 255; i >= 0; --i) {" |
| @@ -146,10 +152,31 @@ static const std::string DEFAULT_SHADOW_SHADER { · 6 unmodified lines | |||
| 146 | " }" | 152 | " }" |
| 147 | }; | 153 | }; |
| 148 | 154 | ||
| 155 | static const std::string DEFAULT_SHADOW_CASCADE_SHADER{ | ||
| 156 | "vec3 cascadeColors[4] = vec3[4]( vec3(0,1,0), vec3(0,0,1), vec3(1,0,0), vec3(1) );" | ||
| 157 | "vec4 getFragmentColor() {" | ||
| 158 | " DeferredFrameTransform deferredTransform = getDeferredFrameTransform();" | ||
| 159 | " DeferredFragment frag = unpackDeferredFragment(deferredTransform, uv);" | ||
| 160 | " vec4 viewPosition = vec4(frag.position.xyz, 1.0);" | ||
| 161 | " float viewDepth = -viewPosition.z;" | ||
| 162 | " vec4 worldPosition = getViewInverse() * viewPosition;" | ||
| 163 | " vec4 cascadeShadowCoords[2];" | ||
| 164 | " ivec2 cascadeIndices;" | ||
| 165 | " float cascadeMix = determineShadowCascadesOnPixel(worldPosition, viewDepth, cascadeShadowCoords, cascadeIndices);" | ||
| 166 | " vec3 firstCascadeColor = cascadeColors[cascadeIndices.x];" | ||
| 167 | " vec3 secondCascadeColor = cascadeColors[cascadeIndices.x];" | ||
| 168 | " if (cascadeMix > 0.0 && cascadeIndices.y < getShadowCascadeCount()) {" | ||
| 169 | " secondCascadeColor = cascadeColors[cascadeIndices.y];" | ||
| 170 | " }" | ||
| 171 | " vec3 color = mix(firstCascadeColor, secondCascadeColor, cascadeMix);" | ||
| 172 | " return vec4(mix(vec3(0.0), color, evalShadowFalloff(viewDepth)), 1.0);" | ||
| 173 | "}" | ||
| 174 | }; | ||
| 175 | |||
| 149 | static const std::string DEFAULT_LINEAR_DEPTH_SHADER { | 176 | static const std::string DEFAULT_LINEAR_DEPTH_SHADER { |
| 150 | "vec4 getFragmentColor() {" | 177 | "vec4 getFragmentColor() {" |
| 151 | " return vec4(vec3(1.0 - texture(linearDepthMap, uv).x * 0.01), 1.0);" | 178 | " return vec4(vec3(1.0 - texture(linearDepthMap, uv).x * 0.01), 1.0);" |
| 152 | " }" | 179 | "}" |
| 153 | }; | 180 | }; |
| 154 | 181 | ||
| 155 | static const std::string DEFAULT_HALF_LINEAR_DEPTH_SHADER{ | 182 | static const std::string DEFAULT_HALF_LINEAR_DEPTH_SHADER{ |
| @@ -292,8 +319,13 @@ std::string DebugDeferredBuffer::getShaderSourceCode(Mode mode, std::string cust · 136 unmodified lines | |||
| 292 | return DEFAULT_SCATTERING_SHADER; | 319 | return DEFAULT_SCATTERING_SHADER; |
| 293 | case LightingMode: | 320 | case LightingMode: |
| 294 | return DEFAULT_LIGHTING_SHADER; | 321 | return DEFAULT_LIGHTING_SHADER; |
| 295 | case ShadowMode: | 322 | case ShadowCascade0Mode: |
| 323 | case ShadowCascade1Mode: | ||
| 324 | case ShadowCascade2Mode: | ||
| 325 | case ShadowCascade3Mode: | ||
| 296 | return DEFAULT_SHADOW_SHADER; | 326 | return DEFAULT_SHADOW_SHADER; |
| 327 | case ShadowCascadeIndicesMode: | ||
| 328 | return DEFAULT_SHADOW_CASCADE_SHADER; | ||
| 297 | case LinearDepthMode: | 329 | case LinearDepthMode: |
| 298 | return DEFAULT_LINEAR_DEPTH_SHADER; | 330 | return DEFAULT_LINEAR_DEPTH_SHADER; |
| 299 | case HalfLinearDepthMode: | 331 | case HalfLinearDepthMode: |
| @@ -346,8 +378,7 @@ bool DebugDeferredBuffer::pipelineNeedsUpdate(Mode mode, std::string customFile) · 46 unmodified lines | |||
| 346 | 378 | ||
| 347 | const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Mode mode, std::string customFile) { | 379 | const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Mode mode, std::string customFile) { |
| 348 | if (pipelineNeedsUpdate(mode, customFile)) { | 380 | if (pipelineNeedsUpdate(mode, customFile)) { |
| 349 | static const std::string VERTEX_SHADER { debug_deferred_buffer_vert }; | 381 | static const std::string FRAGMENT_SHADER { debug_deferred_buffer_frag::getSource() }; |
| 350 | static const std::string FRAGMENT_SHADER { debug_deferred_buffer_frag }; | ||
| 351 | static const std::string SOURCE_PLACEHOLDER { "//SOURCE_PLACEHOLDER" }; | 382 | static const std::string SOURCE_PLACEHOLDER { "//SOURCE_PLACEHOLDER" }; |
| 352 | static const auto SOURCE_PLACEHOLDER_INDEX = FRAGMENT_SHADER.find(SOURCE_PLACEHOLDER); | 383 | static const auto SOURCE_PLACEHOLDER_INDEX = FRAGMENT_SHADER.find(SOURCE_PLACEHOLDER); |
| 353 | Q_ASSERT_X(SOURCE_PLACEHOLDER_INDEX != std::string::npos, Q_FUNC_INFO, | 384 | Q_ASSERT_X(SOURCE_PLACEHOLDER_INDEX != std::string::npos, Q_FUNC_INFO, |
| @@ -357,11 +388,15 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Mode mode, std::str · 3 unmodified lines | |||
| 357 | bakedFragmentShader.replace(SOURCE_PLACEHOLDER_INDEX, SOURCE_PLACEHOLDER.size(), | 388 | bakedFragmentShader.replace(SOURCE_PLACEHOLDER_INDEX, SOURCE_PLACEHOLDER.size(), |
| 358 | getShaderSourceCode(mode, customFile)); | 389 | getShaderSourceCode(mode, customFile)); |
| 359 | 390 | ||
| 360 | static const auto vs = gpu::Shader::createVertex(VERTEX_SHADER); | 391 | const auto vs = debug_deferred_buffer_vert::getShader(); |
| 361 | const auto ps = gpu::Shader::createPixel(bakedFragmentShader); | 392 | const auto ps = gpu::Shader::createPixel(bakedFragmentShader); |
| 362 | const auto program = gpu::Shader::createProgram(vs, ps); | 393 | const auto program = gpu::Shader::createProgram(vs, ps); |
| 363 | 394 | ||
| 364 | gpu::Shader::BindingSet slotBindings; | 395 | gpu::Shader::BindingSet slotBindings; |
| 396 | slotBindings.insert(gpu::Shader::Binding("cameraCorrectionBuffer", CameraCorrection)); | ||
| 397 | slotBindings.insert(gpu::Shader::Binding("deferredFrameTransformBuffer", DeferredFrameTransform)); | ||
| 398 | slotBindings.insert(gpu::Shader::Binding("shadowTransformBuffer", ShadowTransform)); | ||
| 399 | |||
| 365 | slotBindings.insert(gpu::Shader::Binding("albedoMap", Albedo)); | 400 | slotBindings.insert(gpu::Shader::Binding("albedoMap", Albedo)); |
| 366 | slotBindings.insert(gpu::Shader::Binding("normalMap", Normal)); | 401 | slotBindings.insert(gpu::Shader::Binding("normalMap", Normal)); |
| 367 | slotBindings.insert(gpu::Shader::Binding("specularMap", Specular)); | 402 | slotBindings.insert(gpu::Shader::Binding("specularMap", Specular)); |
| @@ -415,6 +450,7 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I · 47 unmodified lines | |||
| 415 | auto& surfaceGeometryFramebuffer = inputs.get2(); | 450 | auto& surfaceGeometryFramebuffer = inputs.get2(); |
| 416 | auto& ambientOcclusionFramebuffer = inputs.get3(); | 451 | auto& ambientOcclusionFramebuffer = inputs.get3(); |
| 417 | auto& velocityFramebuffer = inputs.get4(); | 452 | auto& velocityFramebuffer = inputs.get4(); |
| 453 | auto& frameTransform = inputs.get5(); | ||
| 418 | 454 | ||
| 419 | gpu::doInBatch("DebugDeferredBuffer::run", args->_context, [&](gpu::Batch& batch) { | 455 | gpu::doInBatch("DebugDeferredBuffer::run", args->_context, [&](gpu::Batch& batch) { |
| 420 | batch.enableStereo(false); | 456 | batch.enableStereo(false); |
| @@ -433,8 +469,8 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I · 12 unmodified lines | |||
| 433 | 469 | ||
| 434 | // TODO REMOVE: Temporary until UI | 470 | // TODO REMOVE: Temporary until UI |
| 435 | auto first = _customPipelines.begin()->first; | 471 | auto first = _customPipelines.begin()->first; |
| 436 | 472 | auto pipeline = getPipeline(_mode, first); | |
| 437 | batch.setPipeline(getPipeline(_mode, first)); | 473 | batch.setPipeline(pipeline); |
| 438 | 474 | ||
| 439 | if (deferredFramebuffer) { | 475 | if (deferredFramebuffer) { |
| 440 | batch.setResourceTexture(Albedo, deferredFramebuffer->getDeferredColorTexture()); | 476 | batch.setResourceTexture(Albedo, deferredFramebuffer->getDeferredColorTexture()); |
| @@ -453,7 +489,10 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I · 12 unmodified lines | |||
| 453 | auto lightAndShadow = lightStage->getCurrentKeyLightAndShadow(); | 489 | auto lightAndShadow = lightStage->getCurrentKeyLightAndShadow(); |
| 454 | const auto& globalShadow = lightAndShadow.second; | 490 | const auto& globalShadow = lightAndShadow.second; |
| 455 | if (globalShadow) { | 491 | if (globalShadow) { |
| 456 | batch.setResourceTexture(Shadow, globalShadow->map); | 492 | const auto cascadeIndex = glm::clamp(_mode - Mode::ShadowCascade0Mode, 0, (int)globalShadow->getCascadeCount() - 1); |
| 493 | batch.setResourceTexture(Shadow, globalShadow->getCascade(cascadeIndex).map); | ||
| 494 | batch.setUniformBuffer(ShadowTransform, globalShadow->getBuffer()); | ||
| 495 | batch.setUniformBuffer(DeferredFrameTransform, frameTransform->getFrameTransformBuffer()); | ||
| 457 | } | 496 | } |
| 458 | 497 | ||
| 459 | if (linearDepthTarget) { | 498 | if (linearDepthTarget) { |
| @@ -474,7 +513,6 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I · 14 unmodified lines | |||
| 474 | const glm::vec2 topRight(_size.z, _size.w); | 513 | const glm::vec2 topRight(_size.z, _size.w); |
| 475 | geometryBuffer->renderQuad(batch, bottomLeft, topRight, color, _geometryId); | 514 | geometryBuffer->renderQuad(batch, bottomLeft, topRight, color, _geometryId); |
| 476 | 515 | ||
| 477 | |||
| 478 | batch.setResourceTexture(Albedo, nullptr); | 516 | batch.setResourceTexture(Albedo, nullptr); |
| 479 | batch.setResourceTexture(Normal, nullptr); | 517 | batch.setResourceTexture(Normal, nullptr); |
| 480 | batch.setResourceTexture(Specular, nullptr); | 518 | batch.setResourceTexture(Specular, nullptr); |