Showing the changes to libraries/render-utils/src/DeferredLightingEffect.cpp (1 of 16 files). Show all
Unified · Split
| @@ -308,8 +308,10 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 307 unmodified lines | ||
| 308 | 308 | float tMin = args->_viewport.y / (float)framebufferSize.height(); |
| 309 | 309 | float tHeight = args->_viewport.w / (float)framebufferSize.height(); |
| 310 | 310 | |
| 311 | − bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); | |
| 311 | + auto monoViewport = args->_viewport; | |
| 312 | 312 | |
| 313 | + | |
| 314 | + // The view furstum is the mono frustum base | |
| 313 | 315 | auto viewFrustum = args->_viewFrustum; |
| 314 | 316 | |
| 315 | 317 | float left, right, bottom, top, nearVal, farVal; |
| @@ -322,19 +324,27 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 6 unmodified lines | ||
| 322 | 324 | float depthTexCoordOffsetS = left * nearScale - sMin * depthTexCoordScaleS; |
| 323 | 325 | float depthTexCoordOffsetT = bottom * nearScale - tMin * depthTexCoordScaleT; |
| 324 | 326 | |
| 327 | + // Eval the mono projection | |
| 325 | 328 | mat4 monoProjMat; |
| 326 | 329 | viewFrustum->evalProjectionMatrix(monoProjMat); |
| 330 | + | |
| 331 | + // The mono view transform | |
| 327 | 332 | Transform monoViewTransform; |
| 328 | 333 | viewFrustum->evalViewTransform(monoViewTransform); |
| 329 | 334 | |
| 335 | + // THe mono view matrix coming from the mono view transform | |
| 336 | + glm::mat4 monoViewMat; | |
| 337 | + monoViewTransform.getMatrix(monoViewMat); | |
| 338 | + | |
| 330 | 339 | bool isStereo = args->_context->isStereo(); |
| 331 | 340 | int numPasses = 1; |
| 332 | 341 | |
| 333 | 342 | mat4 projMats[2]; |
| 334 | − Transform viewTransforms[2]; | |
| 335 | − vec4 viewports[2]; | |
| 343 | + ivec4 viewports[2]; | |
| 344 | + vec4 clipQuad[2]; | |
| 336 | 345 | vec2 screenBottomLeftCorners[2]; |
| 337 | 346 | vec2 screenTopRightCorners[2]; |
| 347 | + vec4 fetchTexcoordRects[2]; | |
| 338 | 348 | |
| 339 | 349 | DeferredTransform deferredTransforms[2]; |
| 340 | 350 | |
| @@ -345,18 +355,25 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 4 unmodified lines | ||
| 345 | 355 | args->_context->getStereoProjections(projMats); |
| 346 | 356 | args->_context->getStereoViews(eyeViews); |
| 347 | 357 | |
| 348 | − glm::mat4 monoViewMat; | |
| 349 | − monoViewTransform.getMatrix(monoViewMat); | |
| 358 | + | |
| 350 | 359 | |
| 351 | 360 | float halfWidth = 0.5 * sWidth; |
| 352 | 361 | |
| 353 | 362 | for (int i = 0; i < numPasses; i++) { |
| 363 | + // In stereo, the 2 sides are layout side by side in the mono viewport and their width is half | |
| 364 | + int sideWidth = monoViewport.z * 0.5; | |
| 365 | + viewports[i] = ivec4(monoViewport.x + (i * sideWidth), monoViewport.y, sideWidth, monoViewport.w); | |
| 354 | 366 | |
| 355 | 367 | auto sideViewMat = eyeViews[i] * monoViewMat; |
| 356 | 368 | |
| 357 | − viewTransforms[i].evalFromRawMatrix(sideViewMat); | |
| 358 | 369 | |
| 359 | − deferredTransforms[i]._viewInverse = sideViewMat; | |
| 370 | + | |
| 371 | + projMats[i] = projMats[i] * eyeViews[i]; | |
| 372 | + | |
| 373 | + deferredTransforms[i]._projection = projMats[i]; | |
| 374 | + | |
| 375 | + deferredTransforms[i]._viewInverse = monoViewMat; | |
| 376 | + | |
| 360 | 377 | deferredTransforms[i].nearVal = nearVal; |
| 361 | 378 | deferredTransforms[i].depthScale = depthScale; |
| 362 | 379 | deferredTransforms[i].isStereo = (i == 0 ? -1.0f : 1.0f); |
| @@ -364,16 +381,22 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 1 unmodified line | ||
| 364 | 381 | deferredTransforms[i].depthTexCoordScale = glm::vec2(depthTexCoordScaleS, depthTexCoordScaleT); |
| 365 | 382 | |
| 366 | 383 | |
| 367 | − viewports[i] = glm::vec4(sMin + i * halfWidth, tMin, halfWidth, tHeight); | |
| 384 | + clipQuad[i] = glm::vec4(sMin + i * halfWidth, tMin, halfWidth, tHeight); | |
| 368 | 385 | screenBottomLeftCorners[i] = glm::vec2(-1.0f + i * 1.0f, -1.0f); |
| 369 | 386 | screenTopRightCorners[i] = glm::vec2(i * 1.0f, 1.0f); |
| 387 | + | |
| 388 | + fetchTexcoordRects[i] = glm::vec4(sMin + i * halfWidth, tMin, halfWidth, tHeight); | |
| 389 | + | |
| 370 | 390 | } |
| 371 | 391 | } else { |
| 392 | + | |
| 393 | + viewports[0] = monoViewport; | |
| 394 | + | |
| 372 | 395 | projMats[0] = monoProjMat; |
| 373 | 396 | |
| 374 | − viewTransforms[0] = monoViewTransform; | |
| 397 | + deferredTransforms[0]._projection = monoProjMat; | |
| 375 | 398 | |
| 376 | − viewTransforms[0].getMatrix(deferredTransforms[0]._viewInverse); | |
| 399 | + deferredTransforms[0]._viewInverse = monoViewMat; | |
| 377 | 400 | |
| 378 | 401 | deferredTransforms[0].nearVal = nearVal; |
| 379 | 402 | deferredTransforms[0].depthScale = depthScale; |
| @@ -382,9 +405,11 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 2 unmodified lines | ||
| 382 | 405 | deferredTransforms[0].depthTexCoordScale = glm::vec2(depthTexCoordScaleS, depthTexCoordScaleT); |
| 383 | 406 | |
| 384 | 407 | |
| 385 | − viewports[0] = glm::vec4(sMin, tMin, sWidth, tHeight); | |
| 408 | + clipQuad[0] = glm::vec4(sMin, tMin, sWidth, tHeight); | |
| 386 | 409 | screenBottomLeftCorners[0] = glm::vec2(-1.0f, -1.0f); |
| 387 | 410 | screenTopRightCorners[0] = glm::vec2(1.0f, 1.0f); |
| 411 | + | |
| 412 | + fetchTexcoordRects[0] = glm::vec4(sMin, tMin, sWidth, tHeight); | |
| 388 | 413 | } |
| 389 | 414 | |
| 390 | 415 | auto eyePoint = viewFrustum->getPosition(); |
| @@ -392,22 +417,30 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 1 unmodified line | ||
| 392 | 417 | |
| 393 | 418 | |
| 394 | 419 | for (int side = 0; side < numPasses; side++) { |
| 420 | + // Render in this side's viewport | |
| 421 | + batch.setViewportTransform(viewports[side]); | |
| 422 | + batch.setStateScissorRect(viewports[side]); | |
| 395 | 423 | |
| 424 | + // Sync and Bind the correct DeferredTransform ubo | |
| 396 | 425 | _deferredTransformBuffer[side]._buffer->setSubData(0, sizeof(DeferredTransform), (const gpu::Byte*) &deferredTransforms[side]); |
| 397 | − | |
| 398 | 426 | batch.setUniformBuffer(_directionalLightLocations->deferredTransformBuffer, _deferredTransformBuffer[side]); |
| 399 | 427 | |
| 400 | 428 | |
| 401 | − /* glm::vec2 topLeft(-1.0f, -1.0f); | |
| 429 | + | |
| 430 | + glm::vec2 topLeft(-1.0f, -1.0f); | |
| 402 | 431 | glm::vec2 bottomRight(1.0f, 1.0f); |
| 403 | − glm::vec2 texCoordTopLeft(sMin, tMin); | |
| 432 | + /* glm::vec2 texCoordTopLeft(sMin, tMin); | |
| 404 | 433 | glm::vec2 texCoordBottomRight(sMin + sWidth, tMin + tHeight);*/ |
| 405 | − glm::vec2 topLeft = screenBottomLeftCorners[side]; | |
| 406 | − glm::vec2 bottomRight = screenTopRightCorners[side]; | |
| 407 | − glm::vec2 texCoordTopLeft(viewports[side].x, viewports[side].y); | |
| 408 | − glm::vec2 texCoordBottomRight(viewports[side].x + viewports[side].z, viewports[side].y + viewports[side].w); | |
| 434 | + /* glm::vec2 topLeft = screenBottomLeftCorners[side]; | |
| 435 | + glm::vec2 bottomRight = screenTopRightCorners[side];*/ | |
| 436 | + glm::vec2 texCoordTopLeft(clipQuad[side].x, clipQuad[side].y); | |
| 437 | + glm::vec2 texCoordBottomRight(clipQuad[side].x + clipQuad[side].z, clipQuad[side].y + clipQuad[side].w); | |
| 438 | + | |
| 439 | + | |
| 409 | 440 | |
| 410 | 441 | // First Global directional light and ambient pass |
| 442 | + bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); | |
| 443 | + | |
| 411 | 444 | auto& program = _directionalLight; |
| 412 | 445 | LightLocationsPtr locations = _directionalLightLocations; |
| 413 | 446 | |
| @@ -485,11 +518,13 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 71 unmodified lines | ||
| 485 | 518 | } |
| 486 | 519 | |
| 487 | 520 | { |
| 488 | − Transform model; | |
| 521 | + /* Transform model; | |
| 489 | 522 | model.setTranslation(glm::vec3(sMin, tMin, 0.0)); |
| 490 | 523 | model.setScale(glm::vec3(sWidth, tHeight, 1.0)); |
| 491 | 524 | batch.setModelTransform(model); |
| 525 | + */ | |
| 492 | 526 | |
| 527 | + batch.setModelTransform(Transform()); | |
| 493 | 528 | batch.setProjectionTransform(glm::mat4()); |
| 494 | 529 | batch.setViewTransform(Transform()); |
| 495 | 530 | |
| @@ -510,11 +545,11 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 14 unmodified lines | ||
| 510 | 545 | batch.setResourceTexture(4, nullptr); |
| 511 | 546 | }*/ |
| 512 | 547 | |
| 513 | − glm::vec4 sCoefficients(sWidth / 2.0f, 0.0f, 0.0f, sMin + sWidth / 2.0f); | |
| 514 | − glm::vec4 tCoefficients(0.0f, tHeight / 2.0f, 0.0f, tMin + tHeight / 2.0f); | |
| 515 | 548 | auto texcoordMat = glm::mat4(); |
| 516 | − texcoordMat[0] = glm::vec4(sWidth / 2.0f, 0.0f, 0.0f, sMin + sWidth / 2.0f); | |
| 549 | + /* texcoordMat[0] = glm::vec4(sWidth / 2.0f, 0.0f, 0.0f, sMin + sWidth / 2.0f); | |
| 517 | 550 | texcoordMat[1] = glm::vec4(0.0f, tHeight / 2.0f, 0.0f, tMin + tHeight / 2.0f); |
| 551 | + */ texcoordMat[0] = glm::vec4(fetchTexcoordRects[side].z / 2.0f, 0.0f, 0.0f, fetchTexcoordRects[side].x + fetchTexcoordRects[side].z / 2.0f); | |
| 552 | + texcoordMat[1] = glm::vec4(0.0f, fetchTexcoordRects[side].w / 2.0f, 0.0f, fetchTexcoordRects[side].y + fetchTexcoordRects[side].w / 2.0f); | |
| 518 | 553 | texcoordMat[2] = glm::vec4(0.0f, 0.0f, 1.0f, 0.0f); |
| 519 | 554 | texcoordMat[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); |
| 520 | 555 | |
| @@ -524,7 +559,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 3 unmodified lines | ||
| 524 | 559 | auto geometryCache = DependencyManager::get<GeometryCache>(); |
| 525 | 560 | |
| 526 | 561 | batch.setProjectionTransform(projMats[side]); |
| 527 | − batch.setViewTransform(viewTransforms[side]); | |
| 562 | + batch.setViewTransform(monoViewTransform); | |
| 528 | 563 | |
| 529 | 564 | if (!_pointLights.empty()) { |
| 530 | 565 | batch.setPipeline(_pointLight); |
| @@ -557,7 +592,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 26 unmodified lines | ||
| 557 | 592 | DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); |
| 558 | 593 | |
| 559 | 594 | batch.setProjectionTransform(projMats[side]); |
| 560 | − batch.setViewTransform(viewTransforms[side]); | |
| 595 | + batch.setViewTransform(monoViewTransform); | |
| 561 | 596 | } else { |
| 562 | 597 | Transform model; |
| 563 | 598 | model.setTranslation(glm::vec3(light->getPosition().x, light->getPosition().y, light->getPosition().z)); |
| @@ -608,7 +643,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 44 unmodified lines | ||
| 608 | 643 | DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); |
| 609 | 644 | |
| 610 | 645 | batch.setProjectionTransform( projMats[side]); |
| 611 | − batch.setViewTransform(viewTransforms[side]); | |
| 646 | + batch.setViewTransform(monoViewTransform); | |
| 612 | 647 | } else { |
| 613 | 648 | coneParam.w = 1.0f; |
| 614 | 649 | batch._glUniform4fv(_spotLightLocations->coneParam, 1, reinterpret_cast< const float* >(&coneParam)); |