SImple first steps to apply jittering correctly in stereo

This commit is contained in:
samcake 2017-09-20 10:18:25 -07:00
parent 0fe4022609
commit 89682a2e2c
4 changed files with 57 additions and 15 deletions

View file

@ -510,20 +510,43 @@ void JitterSample::run(const render::RenderContextPointer& renderContext, Jitter
auto viewFrustum = renderContext->args->getViewFrustum();
auto projMat = viewFrustum.getProjection();
auto theNear = viewFrustum.getNearClip();
auto jit = jitterBuffer.get().offsets[(current < 0 ? SampleSequence::SEQUENCE_LENGTH : current)];
auto width = (float) renderContext->args->_viewport.z;
auto height = (float) renderContext->args->_viewport.w;
auto width = (float)renderContext->args->_viewport.z;
auto height = (float)renderContext->args->_viewport.w;
auto jx = 2.0 * jit.x / width;
auto jy = 2.0 * jit.y / height;
projMat[2][0] += jx;
projMat[2][1] += jy;
bool isStereo = renderContext->args->isStereo();
if (!isStereo) {
projMat[2][0] += jx;
projMat[2][1] += jy;
viewFrustum.setProjection(projMat);
renderContext->args->pushViewFrustum(viewFrustum);
}
else {
mat4 projMats[2];
renderContext->args->_context->getStereoProjections(projMats);
auto sjx = jx * 2.0f;
for (int i = 0; i < 2; i++) {
projMats[i][2][0] += sjx;
projMats[i][2][1] += jy;
}
renderContext->args->_context->setStereoProjections(projMats);
}
viewFrustum.setProjection(projMat);
renderContext->args->pushViewFrustum(viewFrustum);
jitterBuffer = _jitterBuffer;
}

View file

@ -78,11 +78,12 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren
fadeEffect->build(task, opaques);
const auto jitterBuffer = task.addJob<JitterSample>("JitterCam");
// Prepare deferred, generate the shared Deferred Frame Transform
const auto deferredFrameTransform = task.addJob<GenerateDeferredFrameTransform>("DeferredFrameTransform");
const auto lightingModel = task.addJob<MakeLightingModel>("LightingModel");
const auto jitterBuffer = task.addJob<JitterSample>("JitterCam");
// GPU jobs: Start preparing the primary, deferred and lighting buffer
const auto primaryFramebuffer = task.addJob<PreparePrimaryFramebuffer>("PreparePrimaryBuffer");

View file

@ -23,7 +23,8 @@ void main() {
vec2 texelSize = getInvWidthHeight();
vec2 texelSize = taa_getTexelSize();
vec2 fragJitterPix = taa_getCurrentJitterSample();
if (taa_unjitter()) {
fragUV -= fragJitterPix * texelSize;

View file

@ -164,9 +164,25 @@ float taa_fetchDepth(vec2 uv) {
#define ZCMP_GT(a, b) (a > b)
vec2 taa_getImageSize() {
vec2 imageSize = getWidthHeight(0);
if (isStereo()) {
imageSize.x *= 2.0;
}
return imageSize;
}
vec2 taa_getTexelSize() {
vec2 texelSize = getInvWidthHeight();
if (isStereo()) {
texelSize.x *= 0.5;
}
return texelSize;
}
vec3 taa_findClosestFragment3x3(vec2 uv)
{
vec2 dd = abs(getInvWidthHeight());
vec2 dd = abs(taa_getTexelSize());
vec2 du = vec2(dd.x, 0.0);
vec2 dv = vec2(0.0, dd.y);
@ -215,7 +231,7 @@ float Luminance(vec3 rgb) {
#define MINMAX_3X3_ROUNDED 1
mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) {
vec2 texelSize = getInvWidthHeight();
vec2 texelSize = taa_getTexelSize();
vec2 du = vec2(texelSize.x, 0.0);
@ -269,8 +285,8 @@ mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelo
}
mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) {
vec2 imageSize = getWidthHeight(0);
vec2 texelSize = getInvWidthHeight();
vec2 imageSize = taa_getImageSize();
vec2 texelSize = taa_getTexelSize();
vec3 cmin, cmax, cavg;
#if MINMAX_3X3_ROUNDED
@ -453,7 +469,8 @@ vec3 taa_getVelocityColorAboveThreshold(float velocityPixLength) {
vec3 taa_evalFXAA(vec2 fragUV) {
vec2 texelSize = getInvWidthHeight();
// vec2 texelSize = getInvWidthHeight();
vec2 texelSize = taa_getTexelSize();
// filter width limit for dependent "two-tap" texture samples
float FXAA_SPAN_MAX = 8.0;