History

Need to pull master, just updated all the deferred shaders to use scribe func declare blocks to avoid long shaders... didn;t validate the current clip to eye position evaluation

Sam Gateau committed 11 years ago

Commit dc8756e1 parent 9f8d6a716 files · +149 −32Browse files

Showing the changes to libraries/render-utils/src/DeferredLightingEffect.cpp (1 of 16 files). Show all

Unified · Split

libraries/render-utils/src/DeferredLightingEffect.cpp+60−25
@@ -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 pass441 // 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));

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t