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
308308 float tMin = args->_viewport.y / (float)framebufferSize.height();
309309 float tHeight = args->_viewport.w / (float)framebufferSize.height();
310310
311− bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap());
311+ auto monoViewport = args->_viewport;
312312
313+
314+ // The view furstum is the mono frustum base
313315 auto viewFrustum = args->_viewFrustum;
314316
315317 float left, right, bottom, top, nearVal, farVal;
@@ -322,19 +324,27 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 6 unmodified lines
322324 float depthTexCoordOffsetS = left * nearScale - sMin * depthTexCoordScaleS;
323325 float depthTexCoordOffsetT = bottom * nearScale - tMin * depthTexCoordScaleT;
324326
327+ // Eval the mono projection
325328 mat4 monoProjMat;
326329 viewFrustum->evalProjectionMatrix(monoProjMat);
330+
331+ // The mono view transform
327332 Transform monoViewTransform;
328333 viewFrustum->evalViewTransform(monoViewTransform);
329334
335+ // THe mono view matrix coming from the mono view transform
336+ glm::mat4 monoViewMat;
337+ monoViewTransform.getMatrix(monoViewMat);
338+
330339 bool isStereo = args->_context->isStereo();
331340 int numPasses = 1;
332341
333342 mat4 projMats[2];
334− Transform viewTransforms[2];
335− vec4 viewports[2];
343+ ivec4 viewports[2];
344+ vec4 clipQuad[2];
336345 vec2 screenBottomLeftCorners[2];
337346 vec2 screenTopRightCorners[2];
347+ vec4 fetchTexcoordRects[2];
338348
339349 DeferredTransform deferredTransforms[2];
340350
@@ -345,18 +355,25 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 4 unmodified lines
345355 args->_context->getStereoProjections(projMats);
346356 args->_context->getStereoViews(eyeViews);
347357
348− glm::mat4 monoViewMat;
349− monoViewTransform.getMatrix(monoViewMat);
358+
350359
351360 float halfWidth = 0.5 * sWidth;
352361
353362 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);
354366
355367 auto sideViewMat = eyeViews[i] * monoViewMat;
356368
357− viewTransforms[i].evalFromRawMatrix(sideViewMat);
358369
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+
360377 deferredTransforms[i].nearVal = nearVal;
361378 deferredTransforms[i].depthScale = depthScale;
362379 deferredTransforms[i].isStereo = (i == 0 ? -1.0f : 1.0f);
@@ -364,16 +381,22 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 1 unmodified line
364381 deferredTransforms[i].depthTexCoordScale = glm::vec2(depthTexCoordScaleS, depthTexCoordScaleT);
365382
366383
367− viewports[i] = glm::vec4(sMin + i * halfWidth, tMin, halfWidth, tHeight);
384+ clipQuad[i] = glm::vec4(sMin + i * halfWidth, tMin, halfWidth, tHeight);
368385 screenBottomLeftCorners[i] = glm::vec2(-1.0f + i * 1.0f, -1.0f);
369386 screenTopRightCorners[i] = glm::vec2(i * 1.0f, 1.0f);
387+
388+ fetchTexcoordRects[i] = glm::vec4(sMin + i * halfWidth, tMin, halfWidth, tHeight);
389+
370390 }
371391 } else {
392+
393+ viewports[0] = monoViewport;
394+
372395 projMats[0] = monoProjMat;
373396
374− viewTransforms[0] = monoViewTransform;
397+ deferredTransforms[0]._projection = monoProjMat;
375398
376− viewTransforms[0].getMatrix(deferredTransforms[0]._viewInverse);
399+ deferredTransforms[0]._viewInverse = monoViewMat;
377400
378401 deferredTransforms[0].nearVal = nearVal;
379402 deferredTransforms[0].depthScale = depthScale;
@@ -382,9 +405,11 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 2 unmodified lines
382405 deferredTransforms[0].depthTexCoordScale = glm::vec2(depthTexCoordScaleS, depthTexCoordScaleT);
383406
384407
385− viewports[0] = glm::vec4(sMin, tMin, sWidth, tHeight);
408+ clipQuad[0] = glm::vec4(sMin, tMin, sWidth, tHeight);
386409 screenBottomLeftCorners[0] = glm::vec2(-1.0f, -1.0f);
387410 screenTopRightCorners[0] = glm::vec2(1.0f, 1.0f);
411+
412+ fetchTexcoordRects[0] = glm::vec4(sMin, tMin, sWidth, tHeight);
388413 }
389414
390415 auto eyePoint = viewFrustum->getPosition();
@@ -392,22 +417,30 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 1 unmodified line
392417
393418
394419 for (int side = 0; side < numPasses; side++) {
420+ // Render in this side's viewport
421+ batch.setViewportTransform(viewports[side]);
422+ batch.setStateScissorRect(viewports[side]);
395423
424+ // Sync and Bind the correct DeferredTransform ubo
396425 _deferredTransformBuffer[side]._buffer->setSubData(0, sizeof(DeferredTransform), (const gpu::Byte*) &deferredTransforms[side]);
397−
398426 batch.setUniformBuffer(_directionalLightLocations->deferredTransformBuffer, _deferredTransformBuffer[side]);
399427
400428
401− /* glm::vec2 topLeft(-1.0f, -1.0f);
429+
430+ glm::vec2 topLeft(-1.0f, -1.0f);
402431 glm::vec2 bottomRight(1.0f, 1.0f);
403− glm::vec2 texCoordTopLeft(sMin, tMin);
432+ /* glm::vec2 texCoordTopLeft(sMin, tMin);
404433 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+
409440
410441 // First Global directional light and ambient pass
442+ bool useSkyboxCubemap = (_skybox) && (_skybox->getCubemap());
443+
411444 auto& program = _directionalLight;
412445 LightLocationsPtr locations = _directionalLightLocations;
413446
@@ -485,11 +518,13 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 71 unmodified lines
485518 }
486519
487520 {
488− Transform model;
521+ /* Transform model;
489522 model.setTranslation(glm::vec3(sMin, tMin, 0.0));
490523 model.setScale(glm::vec3(sWidth, tHeight, 1.0));
491524 batch.setModelTransform(model);
525+ */
492526
527+ batch.setModelTransform(Transform());
493528 batch.setProjectionTransform(glm::mat4());
494529 batch.setViewTransform(Transform());
495530
@@ -510,11 +545,11 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 14 unmodified lines
510545 batch.setResourceTexture(4, nullptr);
511546 }*/
512547
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);
515548 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);
517550 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);
518553 texcoordMat[2] = glm::vec4(0.0f, 0.0f, 1.0f, 0.0f);
519554 texcoordMat[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
520555
@@ -524,7 +559,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 3 unmodified lines
524559 auto geometryCache = DependencyManager::get<GeometryCache>();
525560
526561 batch.setProjectionTransform(projMats[side]);
527− batch.setViewTransform(viewTransforms[side]);
562+ batch.setViewTransform(monoViewTransform);
528563
529564 if (!_pointLights.empty()) {
530565 batch.setPipeline(_pointLight);
@@ -557,7 +592,7 @@ void DeferredLightingEffect::render(RenderArgs* args) { · 26 unmodified lines
557592 DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color);
558593
559594 batch.setProjectionTransform(projMats[side]);
560− batch.setViewTransform(viewTransforms[side]);
595+ batch.setViewTransform(monoViewTransform);
561596 } else {
562597 Transform model;
563598 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
608643 DependencyManager::get<GeometryCache>()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color);
609644
610645 batch.setProjectionTransform( projMats[side]);
611− batch.setViewTransform(viewTransforms[side]);
646+ batch.setViewTransform(monoViewTransform);
612647 } else {
613648 coneParam.w = 1.0f;
614649 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