mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 17:01:18 +02:00
FIxing the jittering projection modification
This commit is contained in:
parent
37f440031f
commit
16fbe00ef5
6 changed files with 26 additions and 26 deletions
|
@ -411,12 +411,11 @@ int JitterSampleConfig::play() {
|
||||||
|
|
||||||
template <int B> class Halton {
|
template <int B> class Halton {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
float eval(int index) {
|
float eval(int index) {
|
||||||
float f = 1.0f;
|
float f = 1.0f;
|
||||||
float r = 0.0f;
|
float r = 0.0f;
|
||||||
float invB = 1.0f / (float)B;
|
float invB = 1.0f / (float)B;
|
||||||
index++;
|
index++; // Indices start at 1, not 0
|
||||||
|
|
||||||
while (index > 0) {
|
while (index > 0) {
|
||||||
f = f * invB;
|
f = f * invB;
|
||||||
|
@ -431,19 +430,9 @@ public:
|
||||||
|
|
||||||
JitterSample::SampleSequence::SampleSequence(){
|
JitterSample::SampleSequence::SampleSequence(){
|
||||||
// Halton sequence (2,3)
|
// Halton sequence (2,3)
|
||||||
|
|
||||||
Halton<2> genX;
|
Halton<2> genX;
|
||||||
Halton<3> genY;
|
Halton<3> genY;
|
||||||
|
|
||||||
offsets[0] = { 1.0f / 2.0f, 1.0f / 3.0f };
|
|
||||||
offsets[1] = { 1.0f / 4.0f, 2.0f / 3.0f };
|
|
||||||
offsets[2] = { 3.0f / 4.0f, 1.0f / 9.0f };
|
|
||||||
offsets[3] = { 1.0f / 8.0f, 4.0f / 9.0f };
|
|
||||||
offsets[4] = { 5.0f / 8.0f, 7.0f / 9.0f };
|
|
||||||
offsets[5] = { 3.0f / 8.0f, 2.0f / 9.0f };
|
|
||||||
offsets[6] = { 7.0f / 8.0f, 5.0f / 9.0f };
|
|
||||||
offsets[7] = { 1.0f / 16.0f, 8.0f / 9.0f };
|
|
||||||
|
|
||||||
for (int i = 0; i < SEQUENCE_LENGTH; i++) {
|
for (int i = 0; i < SEQUENCE_LENGTH; i++) {
|
||||||
offsets[i] = glm::vec2(genX.eval(i), genY.eval(i));
|
offsets[i] = glm::vec2(genX.eval(i), genY.eval(i));
|
||||||
}
|
}
|
||||||
|
@ -451,6 +440,7 @@ JitterSample::SampleSequence::SampleSequence(){
|
||||||
for (int i = 0; i < SEQUENCE_LENGTH; i++) {
|
for (int i = 0; i < SEQUENCE_LENGTH; i++) {
|
||||||
offsets[i] -= vec2(0.5f);
|
offsets[i] -= vec2(0.5f);
|
||||||
}
|
}
|
||||||
|
offsets[SEQUENCE_LENGTH] = glm::vec2(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitterSample::configure(const Config& config) {
|
void JitterSample::configure(const Config& config) {
|
||||||
|
@ -472,17 +462,17 @@ void JitterSample::run(const render::RenderContextPointer& renderContext, Jitter
|
||||||
auto projMat = viewFrustum.getProjection();
|
auto projMat = viewFrustum.getProjection();
|
||||||
auto theNear = viewFrustum.getNearClip();
|
auto theNear = viewFrustum.getNearClip();
|
||||||
|
|
||||||
auto jit = _scale * jitterBuffer.get().offsets[current];
|
auto jit = jitterBuffer.get().offsets[current];
|
||||||
auto width = (float) renderContext->args->_viewport.z;
|
auto width = (float) renderContext->args->_viewport.z;
|
||||||
auto height = (float) renderContext->args->_viewport.w;
|
auto height = (float) renderContext->args->_viewport.w;
|
||||||
|
|
||||||
// auto jx = -4.0 * jit.x / width;
|
// auto jx = -4.0 * jit.x / width;
|
||||||
// auto jy = -4.0 * jit.y / height;
|
// auto jy = -4.0 * jit.y / height;
|
||||||
auto jx = -2.0 * jit.x / width;
|
auto jx = 2.0 * jit.x / width;
|
||||||
auto jy = -2.0 * jit.y / height;
|
auto jy = 2.0 * jit.y / height;
|
||||||
|
|
||||||
projMat[2][0] += jx * projMat[0][0];
|
projMat[2][0] += jx;
|
||||||
projMat[2][1] += jy * projMat[1][1];
|
projMat[2][1] += jy;
|
||||||
|
|
||||||
viewFrustum.setProjection(projMat);
|
viewFrustum.setProjection(projMat);
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
struct SampleSequence {
|
struct SampleSequence {
|
||||||
SampleSequence();
|
SampleSequence();
|
||||||
static const int SEQUENCE_LENGTH{ 16 };
|
static const int SEQUENCE_LENGTH{ 16 };
|
||||||
glm::vec2 offsets[SEQUENCE_LENGTH];
|
glm::vec2 offsets[SEQUENCE_LENGTH + 1];
|
||||||
int sequenceLength{ SEQUENCE_LENGTH };
|
int sequenceLength{ SEQUENCE_LENGTH };
|
||||||
int currentIndex{ 0 };
|
int currentIndex{ 0 };
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ void main() {
|
||||||
vec2 fragUV = varTexCoord0;
|
vec2 fragUV = varTexCoord0;
|
||||||
|
|
||||||
vec2 texelSize = getInvWidthHeight();
|
vec2 texelSize = getInvWidthHeight();
|
||||||
vec2 fragJitterPix = taa_getJitterSample(sequence.currentIndex);
|
vec2 fragJitterPix = taa_getCurrentJitterSample();
|
||||||
if (taa_unjitter()) {
|
if (taa_unjitter()) {
|
||||||
fragUV -= fragJitterPix * texelSize;
|
fragUV -= fragJitterPix * texelSize;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,9 +15,7 @@
|
||||||
|
|
||||||
const int SEQUENCE_LENGTH = 16;
|
const int SEQUENCE_LENGTH = 16;
|
||||||
struct JitterSequence {
|
struct JitterSequence {
|
||||||
vec4 offsets[SEQUENCE_LENGTH / 2];
|
vec4 offsets[(SEQUENCE_LENGTH / 2) + 1];
|
||||||
int sequenceLength;
|
|
||||||
int currentIndex;
|
|
||||||
};
|
};
|
||||||
layout(std140) uniform taaJitterBuffer {
|
layout(std140) uniform taaJitterBuffer {
|
||||||
JitterSequence sequence;
|
JitterSequence sequence;
|
||||||
|
@ -27,6 +25,18 @@ vec2 taa_getJitterSample(int index) {
|
||||||
return vec2((bool(index & 0x01) ? sequence.offsets[index >> 1].zw : sequence.offsets[index >> 1].xy));
|
return vec2((bool(index & 0x01) ? sequence.offsets[index >> 1].zw : sequence.offsets[index >> 1].xy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int taa_getJitterSequenceLength() {
|
||||||
|
return int(sequence.offsets[(SEQUENCE_LENGTH / 2)].z);
|
||||||
|
}
|
||||||
|
|
||||||
|
int taa_getCurrentJitterIndex() {
|
||||||
|
return int(sequence.offsets[(SEQUENCE_LENGTH / 2)].w);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 taa_getCurrentJitterSample() {
|
||||||
|
return taa_getJitterSample(taa_getCurrentJitterIndex());
|
||||||
|
}
|
||||||
|
|
||||||
<@include gpu/Color.slh@>
|
<@include gpu/Color.slh@>
|
||||||
|
|
||||||
uniform sampler2D depthMap;
|
uniform sampler2D depthMap;
|
||||||
|
|
|
@ -28,7 +28,7 @@ void main(void) {
|
||||||
vec2 imageSize = getWidthHeight(0);
|
vec2 imageSize = getWidthHeight(0);
|
||||||
vec2 texelSize = getInvWidthHeight();
|
vec2 texelSize = getInvWidthHeight();
|
||||||
|
|
||||||
vec2 fragJitterPix = taa_getJitterSample(sequence.currentIndex);
|
vec2 fragJitterPix = taa_getCurrentJitterSample();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ void main(void) {
|
||||||
vec2 cursorUVRaw = taa_getDebugCursorTexcoord();
|
vec2 cursorUVRaw = taa_getDebugCursorTexcoord();
|
||||||
vec2 cursorPosRaw = floor(cursorUVRaw * imageSize) + vec2(0.5);
|
vec2 cursorPosRaw = floor(cursorUVRaw * imageSize) + vec2(0.5);
|
||||||
vec3 cursorFrag = taa_findClosestFragment3x3(cursorUVRaw);
|
vec3 cursorFrag = taa_findClosestFragment3x3(cursorUVRaw);
|
||||||
vec2 cursorUV = cursorFrag.xy - fragJitterPix * texelSize;
|
vec2 cursorUV = cursorUVRaw - fragJitterPix * texelSize;
|
||||||
vec2 cursorPos = cursorUV * imageSize;
|
vec2 cursorPos = cursorUV * imageSize;
|
||||||
vec2 cursorVelocity = texture(velocityMap, cursorUV).xy;
|
vec2 cursorVelocity = texture(velocityMap, cursorUV).xy;
|
||||||
vec2 cursorPrevUV = cursorUV - cursorVelocity;
|
vec2 cursorPrevUV = cursorUV - cursorVelocity;
|
||||||
|
@ -125,10 +125,10 @@ void main(void) {
|
||||||
|
|
||||||
float niceDotR2 = 4.0;
|
float niceDotR2 = 4.0;
|
||||||
|
|
||||||
int sequenceLength = sequence.sequenceLength;
|
int sequenceLength = taa_getJitterSequenceLength();
|
||||||
for (int s = 0; s < sequenceLength; s++) {
|
for (int s = 0; s < sequenceLength; s++) {
|
||||||
vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize;
|
vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize;
|
||||||
float radius2 = (s == sequence.currentIndex ? 4.0 * niceDotR2 : niceDotR2);
|
float radius2 = (s == taa_getCurrentJitterIndex() ? 4.0 * niceDotR2 : niceDotR2);
|
||||||
float distToSample2 = dot(pixToSampleVec, pixToSampleVec);
|
float distToSample2 = dot(pixToSampleVec, pixToSampleVec);
|
||||||
if (distToSample2 < radius2) {
|
if (distToSample2 < radius2) {
|
||||||
outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(sequenceLength)), 1.0 - distToSample2 / radius2), 1.0);
|
outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(sequenceLength)), 1.0 - distToSample2 / radius2), 1.0);
|
||||||
|
|
Binary file not shown.
Loading…
Reference in a new issue