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 | float tMin = args->_viewport.y / (float)framebufferSize.height(); | 308 | float tMin = args->_viewport.y / (float)framebufferSize.height(); |
| 309 | float tHeight = args->_viewport.w / (float)framebufferSize.height(); | 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 | auto viewFrustum = args->_viewFrustum; | 315 | auto viewFrustum = args->_viewFrustum; |
| 314 | 316 | ||
| 315 | float left, right, bottom, top, nearVal, farVal; | 317 | float left, right, bottom, top, nearVal, farVal; |
| @@ -322,19 +324,27 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 6 unmodified lines | |||
| 322 | float depthTexCoordOffsetS = left * nearScale - sMin * depthTexCoordScaleS; | 324 | float depthTexCoordOffsetS = left * nearScale - sMin * depthTexCoordScaleS; |
| 323 | float depthTexCoordOffsetT = bottom * nearScale - tMin * depthTexCoordScaleT; | 325 | float depthTexCoordOffsetT = bottom * nearScale - tMin * depthTexCoordScaleT; |
| 324 | 326 | ||
| 327 | // Eval the mono projection | ||
| 325 | mat4 monoProjMat; | 328 | mat4 monoProjMat; |
| 326 | viewFrustum->evalProjectionMatrix(monoProjMat); | 329 | viewFrustum->evalProjectionMatrix(monoProjMat); |
| 330 | |||
| 331 | // The mono view transform | ||
| 327 | Transform monoViewTransform; | 332 | Transform monoViewTransform; |
| 328 | viewFrustum->evalViewTransform(monoViewTransform); | 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 | bool isStereo = args->_context->isStereo(); | 339 | bool isStereo = args->_context->isStereo(); |
| 331 | int numPasses = 1; | 340 | int numPasses = 1; |
| 332 | 341 | ||
| 333 | mat4 projMats[2]; | 342 | mat4 projMats[2]; |
| 334 | Transform viewTransforms[2]; | 343 | ivec4 viewports[2]; |
| 335 | vec4 viewports[2]; | 344 | vec4 clipQuad[2]; |
| 336 | vec2 screenBottomLeftCorners[2]; | 345 | vec2 screenBottomLeftCorners[2]; |
| 337 | vec2 screenTopRightCorners[2]; | 346 | vec2 screenTopRightCorners[2]; |
| 347 | vec4 fetchTexcoordRects[2]; | ||
| 338 | 348 | ||
| 339 | DeferredTransform deferredTransforms[2]; | 349 | DeferredTransform deferredTransforms[2]; |
| 340 | 350 | ||
| @@ -345,18 +355,25 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 4 unmodified lines | |||
| 345 | args->_context->getStereoProjections(projMats); | 355 | args->_context->getStereoProjections(projMats); |
| 346 | args->_context->getStereoViews(eyeViews); | 356 | args->_context->getStereoViews(eyeViews); |
| 347 | 357 | ||
| 348 | glm::mat4 monoViewMat; | 358 | |
| 349 | monoViewTransform.getMatrix(monoViewMat); | ||
| 350 | 359 | ||
| 351 | float halfWidth = 0.5 * sWidth; | 360 | float halfWidth = 0.5 * sWidth; |
| 352 | 361 | ||
| 353 | for (int i = 0; i < numPasses; i++) { | 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 | auto sideViewMat = eyeViews[i] * monoViewMat; | 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 | deferredTransforms[i].nearVal = nearVal; | 377 | deferredTransforms[i].nearVal = nearVal; |
| 361 | deferredTransforms[i].depthScale = depthScale; | 378 | deferredTransforms[i].depthScale = depthScale; |
| 362 | deferredTransforms[i].isStereo = (i == 0 ? -1.0f : 1.0f); | 379 | deferredTransforms[i].isStereo = (i == 0 ? -1.0f : 1.0f); |
| @@ -364,16 +381,22 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 1 unmodified line | |||
| 364 | deferredTransforms[i].depthTexCoordScale = glm::vec2(depthTexCoordScaleS, depthTexCoordScaleT); | 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 | screenBottomLeftCorners[i] = glm::vec2(-1.0f + i * 1.0f, -1.0f); | 385 | screenBottomLeftCorners[i] = glm::vec2(-1.0f + i * 1.0f, -1.0f); |
| 369 | screenTopRightCorners[i] = glm::vec2(i * 1.0f, 1.0f); | 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 | } else { | 391 | } else { |
| 392 | |||
| 393 | viewports[0] = monoViewport; | ||
| 394 | |||
| 372 | projMats[0] = monoProjMat; | 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 | deferredTransforms[0].nearVal = nearVal; | 401 | deferredTransforms[0].nearVal = nearVal; |
| 379 | deferredTransforms[0].depthScale = depthScale; | 402 | deferredTransforms[0].depthScale = depthScale; |
| @@ -382,9 +405,11 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 2 unmodified lines | |||
| 382 | deferredTransforms[0].depthTexCoordScale = glm::vec2(depthTexCoordScaleS, depthTexCoordScaleT); | 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 | screenBottomLeftCorners[0] = glm::vec2(-1.0f, -1.0f); | 409 | screenBottomLeftCorners[0] = glm::vec2(-1.0f, -1.0f); |
| 387 | screenTopRightCorners[0] = glm::vec2(1.0f, 1.0f); | 410 | screenTopRightCorners[0] = glm::vec2(1.0f, 1.0f); |
| 411 | |||
| 412 | fetchTexcoordRects[0] = glm::vec4(sMin, tMin, sWidth, tHeight); | ||
| 388 | } | 413 | } |
| 389 | 414 | ||
| 390 | auto eyePoint = viewFrustum->getPosition(); | 415 | auto eyePoint = viewFrustum->getPosition(); |
| @@ -392,22 +417,30 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 1 unmodified line | |||
| 392 | 417 | ||
| 393 | 418 | ||
| 394 | for (int side = 0; side < numPasses; side++) { | 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 | _deferredTransformBuffer[side]._buffer->setSubData(0, sizeof(DeferredTransform), (const gpu::Byte*) &deferredTransforms[side]); | 425 | _deferredTransformBuffer[side]._buffer->setSubData(0, sizeof(DeferredTransform), (const gpu::Byte*) &deferredTransforms[side]); |
| 397 | |||
| 398 | batch.setUniformBuffer(_directionalLightLocations->deferredTransformBuffer, _deferredTransformBuffer[side]); | 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 | glm::vec2 bottomRight(1.0f, 1.0f); | 431 | glm::vec2 bottomRight(1.0f, 1.0f); |
| 403 | glm::vec2 texCoordTopLeft(sMin, tMin); | 432 | /* glm::vec2 texCoordTopLeft(sMin, tMin); |
| 404 | glm::vec2 texCoordBottomRight(sMin + sWidth, tMin + tHeight);*/ | 433 | glm::vec2 texCoordBottomRight(sMin + sWidth, tMin + tHeight);*/ |
| 405 | glm::vec2 topLeft = screenBottomLeftCorners[side]; | 434 | /* glm::vec2 topLeft = screenBottomLeftCorners[side]; |
| 406 | glm::vec2 bottomRight = screenTopRightCorners[side]; | 435 | glm::vec2 bottomRight = screenTopRightCorners[side];*/ |
| 407 | glm::vec2 texCoordTopLeft(viewports[side].x, viewports[side].y); | 436 | glm::vec2 texCoordTopLeft(clipQuad[side].x, clipQuad[side].y); |
| 408 | glm::vec2 texCoordBottomRight(viewports[side].x + viewports[side].z, viewports[side].y + viewports[side].w); | 437 | glm::vec2 texCoordBottomRight(clipQuad[side].x + clipQuad[side].z, clipQuad[side].y + clipQuad[side].w); |
| 438 | |||
| 439 | |||
| 409 | 440 | ||
| 410 | // First Global directional light and ambient pass | 441 | // First Global directional light and ambient pass |
| 442 | bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap()); | ||
| 443 | |||
| 411 | auto& program = _directionalLight; | 444 | auto& program = _directionalLight; |
| 412 | LightLocationsPtr locations = _directionalLightLocations; | 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 | model.setTranslation(glm::vec3(sMin, tMin, 0.0)); | 522 | model.setTranslation(glm::vec3(sMin, tMin, 0.0)); |
| 490 | model.setScale(glm::vec3(sWidth, tHeight, 1.0)); | 523 | model.setScale(glm::vec3(sWidth, tHeight, 1.0)); |
| 491 | batch.setModelTransform(model); | 524 | batch.setModelTransform(model); |
| 525 | */ | ||
| 492 | 526 | ||
| 527 | batch.setModelTransform(Transform()); | ||
| 493 | batch.setProjectionTransform(glm::mat4()); | 528 | batch.setProjectionTransform(glm::mat4()); |
| 494 | batch.setViewTransform(Transform()); | 529 | batch.setViewTransform(Transform()); |
| 495 | 530 | ||
| @@ -510,11 +545,11 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 14 unmodified lines | |||
| 510 | batch.setResourceTexture(4, nullptr); | 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 | auto texcoordMat = glm::mat4(); | 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 | texcoordMat[1] = glm::vec4(0.0f, tHeight / 2.0f, 0.0f, tMin + tHeight / 2.0f); | 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 | texcoordMat[2] = glm::vec4(0.0f, 0.0f, 1.0f, 0.0f); | 553 | texcoordMat[2] = glm::vec4(0.0f, 0.0f, 1.0f, 0.0f); |
| 519 | texcoordMat[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); | 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 | auto geometryCache = DependencyManager::get<GeometryCache>(); | 559 | auto geometryCache = DependencyManager::get<GeometryCache>(); |
| 525 | 560 | ||
| 526 | batch.setProjectionTransform(projMats[side]); | 561 | batch.setProjectionTransform(projMats[side]); |
| 527 | batch.setViewTransform(viewTransforms[side]); | 562 | batch.setViewTransform(monoViewTransform); |
| 528 | 563 | ||
| 529 | if (!_pointLights.empty()) { | 564 | if (!_pointLights.empty()) { |
| 530 | batch.setPipeline(_pointLight); | 565 | batch.setPipeline(_pointLight); |
| @@ -557,7 +592,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 26 unmodified lines | |||
| 557 | DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); | 592 | DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); |
| 558 | 593 | ||
| 559 | batch.setProjectionTransform(projMats[side]); | 594 | batch.setProjectionTransform(projMats[side]); |
| 560 | batch.setViewTransform(viewTransforms[side]); | 595 | batch.setViewTransform(monoViewTransform); |
| 561 | } else { | 596 | } else { |
| 562 | Transform model; | 597 | Transform model; |
| 563 | model.setTranslation(glm::vec3(light->getPosition().x, light->getPosition().y, light->getPosition().z)); | 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 | DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); | 643 | DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); |
| 609 | 644 | ||
| 610 | batch.setProjectionTransform( projMats[side]); | 645 | batch.setProjectionTransform( projMats[side]); |
| 611 | batch.setViewTransform(viewTransforms[side]); | 646 | batch.setViewTransform(monoViewTransform); |
| 612 | } else { | 647 | } else { |
| 613 | coneParam.w = 1.0f; | 648 | coneParam.w = 1.0f; |
| 614 | batch._glUniform4fv(_spotLightLocations->coneParam, 1, reinterpret_cast< const float* >(&coneParam)); | 649 | batch._glUniform4fv(_spotLightLocations->coneParam, 1, reinterpret_cast< const float* >(&coneParam)); |