MOre debugging, adding the find the closest fragment 3x3

This commit is contained in:
samcake 2017-08-22 17:44:14 -07:00
parent 1a6dfc7076
commit 4cdbefc440
7 changed files with 129 additions and 44 deletions

View file

@ -182,7 +182,8 @@ const int AntialiasingPass_FrameTransformSlot = 1;
const int AntialiasingPass_HistoryMapSlot = 0; const int AntialiasingPass_HistoryMapSlot = 0;
const int AntialiasingPass_SourceMapSlot = 1; const int AntialiasingPass_SourceMapSlot = 1;
const int AntialiasingPass_VelocityMapSlot = 2; const int AntialiasingPass_VelocityMapSlot = 2;
const int AntialiasingPass_CurrentMapSlot = 3; const int AntialiasingPass_NextMapSlot = 3;
const int AntialiasingPass_DepthMapSlot = 3;
Antialiasing::Antialiasing() { Antialiasing::Antialiasing() {
@ -209,8 +210,10 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() {
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("sourceMap"), AntialiasingPass_SourceMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), AntialiasingPass_DepthMapSlot));
gpu::Shader::makeProgram(*program, slotBindings); gpu::Shader::makeProgram(*program, slotBindings);
@ -232,7 +235,7 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() {
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
gpu::Shader::BindingSet slotBindings; gpu::Shader::BindingSet slotBindings;
slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), AntialiasingPass_CurrentMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), AntialiasingPass_NextMapSlot));
gpu::Shader::makeProgram(*program, slotBindings); gpu::Shader::makeProgram(*program, slotBindings);
@ -256,10 +259,11 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() {
slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("currentMap"), AntialiasingPass_CurrentMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("nextMap"), AntialiasingPass_NextMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("sourceMap"), AntialiasingPass_SourceMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot));
slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), AntialiasingPass_DepthMapSlot));
gpu::Shader::makeProgram(*program, slotBindings); gpu::Shader::makeProgram(*program, slotBindings);
@ -282,9 +286,10 @@ void Antialiasing::configure(const Config& config) {
_params.edit().debugCursor.x = config.showCursorPixel; _params.edit().debugCursor.x = config.showCursorPixel;
auto orbZoom = (_params->pixelInfo.z);
auto cursorPos = glm::vec2(_params->pixelInfo); auto cursorPos = glm::vec2(_params->pixelInfo);
if (cursorPos != config.debugCursorTexcoord) { if (cursorPos != config.debugCursorTexcoord || (orbZoom != config.debugOrbZoom)) {
_params.edit().pixelInfo = glm::vec4(config.debugCursorTexcoord, 0.0f, 0.0f); _params.edit().pixelInfo = glm::vec4(config.debugCursorTexcoord, config.debugOrbZoom, 0.0f);
} }
} }
@ -322,8 +327,8 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const
_antialiasingBuffer[i]->setRenderBuffer(0, _antialiasingTexture[i]); _antialiasingBuffer[i]->setRenderBuffer(0, _antialiasingTexture[i]);
} }
} }
int currentFrame = (_currentFrame++) % 2; int nextFrame = (_currentFrame++) % 2;
int prevFrame = (currentFrame + 1) % 2; int prevFrame = (nextFrame + 1) % 2;
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
batch.enableStereo(false); batch.enableStereo(false);
@ -334,31 +339,34 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const
batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]); batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]);
batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0));
batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture());
batch.setResourceTexture(AntialiasingPass_DepthMapSlot, sourceBuffer->getDepthStencilBuffer());
batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params._buffer); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params._buffer);
batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer());
batch.setFramebuffer(_antialiasingBuffer[currentFrame]); batch.setFramebuffer(_antialiasingBuffer[nextFrame]);
batch.setPipeline(getAntialiasingPipeline()); batch.setPipeline(getAntialiasingPipeline());
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
// Blend step // Blend step
batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr);
batch.setFramebuffer(sourceBuffer); batch.setFramebuffer(sourceBuffer);
if (_params->debugX <= 0.0) { if (_params->debugX <= 0.0) {
batch.setPipeline(getBlendPipeline()); batch.setPipeline(getBlendPipeline());
} else { } else {
batch.setPipeline(getDebugBlendPipeline()); batch.setPipeline(getDebugBlendPipeline());
} }
batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, _antialiasingTexture[currentFrame]); batch.setResourceTexture(AntialiasingPass_NextMapSlot, _antialiasingTexture[nextFrame]);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr);
batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr);
batch.setResourceTexture(AntialiasingPass_DepthMapSlot, nullptr);
batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr);
batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr);
batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, nullptr);
batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_NextMapSlot, nullptr);
}); });
} }

View file

@ -26,6 +26,7 @@ class AntialiasingConfig : public render::Job::Config {
Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty)
Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty) Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty)
Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty) Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty)
Q_PROPERTY(float debugOrbZoom MEMBER debugOrbZoom NOTIFY dirty)
public: public:
AntialiasingConfig() : render::Job::Config(true) {} AntialiasingConfig() : render::Job::Config(true) {}
@ -36,6 +37,7 @@ public:
bool showCursorPixel{ false }; bool showCursorPixel{ false };
glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f };
float debugOrbZoom{ 2.0f };
signals: signals:
void dirty(); void dirty();
@ -49,7 +51,7 @@ struct TAAParams {
float debugShowVelocityThreshold{ 1.0f }; float debugShowVelocityThreshold{ 1.0f };
glm::vec4 debugCursor{ 0.0f }; glm::vec4 debugCursor{ 0.0f };
glm::vec4 pixelInfo{ 0.5f, 0.5f, 0.0f, 0.0f }; glm::vec4 pixelInfo{ 0.5f, 0.5f, 2.0f, 0.0f };
}; };
using TAAParamsBuffer = gpu::StructBuffer<TAAParams>; using TAAParamsBuffer = gpu::StructBuffer<TAAParams>;

View file

@ -19,19 +19,21 @@ in vec2 varTexCoord0;
layout(location = 0) out vec4 outFragColor; layout(location = 0) out vec4 outFragColor;
void main() { void main() {
vec3 currentColor = texture(colorMap, varTexCoord0).xyz;
vec2 pixVelocity = texture(velocityMap, varTexCoord0).xy; vec2 fragUV = find_closest_fragment_3x3(varTexCoord0);
vec3 sourceColor = texture(sourceMap, fragUV).xyz;
vec2 pixVelocity = texture(velocityMap, fragUV).xy;
vec2 velocity = params.motionScale * pixVelocity;// *getInvWidthHeight(); vec2 velocity = params.motionScale * pixVelocity;// *getInvWidthHeight();
vec2 prevTexCoord = varTexCoord0 - velocity; vec2 prevTexCoord = varTexCoord0 - velocity;
vec3 prevColor = currentColor; vec3 historyColor = sourceColor;
if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) {
prevColor = texture(historyMap, prevTexCoord).xyz; historyColor = texture(historyMap, prevTexCoord).xyz;
} }
vec3 newColor = mix(prevColor, currentColor, params.blend); vec3 nextColor = mix(historyColor, sourceColor, params.blend);
outFragColor = vec4(newColor, 1.0); outFragColor = vec4(nextColor, 1.0);
} }

View file

@ -13,10 +13,11 @@
<@include DeferredTransform.slh@> <@include DeferredTransform.slh@>
<$declareDeferredFrameTransform()$> <$declareDeferredFrameTransform()$>
uniform sampler2D currentMap; uniform sampler2D depthMap;
uniform sampler2D colorMap; uniform sampler2D sourceMap;
uniform sampler2D historyMap; uniform sampler2D historyMap;
uniform sampler2D velocityMap; uniform sampler2D velocityMap;
uniform sampler2D nextMap;
struct TAAParams struct TAAParams
{ {
@ -25,7 +26,7 @@ struct TAAParams
float motionScale; float motionScale;
float debugShowVelocityThreshold; float debugShowVelocityThreshold;
vec4 debugCursor; vec4 debugCursor;
vec4 pixelInfo; vec4 pixelInfo_orbZoom;
}; };
layout(std140) uniform taaParamsBuffer { layout(std140) uniform taaParamsBuffer {
@ -33,9 +34,57 @@ layout(std140) uniform taaParamsBuffer {
}; };
vec2 getDebugCursorTexcoord() { vec2 getDebugCursorTexcoord() {
return params.pixelInfo.xy; return params.pixelInfo_orbZoom.xy;
} }
float getOrbZoom() {
return params.pixelInfo_orbZoom.z;
}
float fetchDepth(vec2 uv) {
return texture(depthMap, vec2(uv), 0).x;
}
float resolveDepthLinear(float depth) {
return Zeye = -evalZeyeFromZdb(Zdb);
}
#define ZCMP_GT(a, b) (a < b)
vec3 find_closest_fragment_3x3(vec2 uv)
{
vec2 dd = abs(getInvWidthHeight());
vec2 du = vec2(dd.x, 0.0);
vec2 dv = vec2(0.0, dd.y);
vec3 dtl = vec3(-1, -1, fetchDepth(uv - dv - du);
vec3 dtc = vec3( 0, -1, fetchDepth(uv - dv).x);
vec3 dtr = vec3( 1, -1, fetchDepth(uv - dv + du);
vec3 dml = vec3(-1, 0, fetchDepth(CameraDepthTexture, uv - du);
vec3 dmc = vec3( 0, 0, fetchDepth(CameraDepthTexture, uv);
vec3 dmr = vec3( 1, 0, fetchDepth(CameraDepthTexture, uv + du);
vec3 dbl = vec3(-1, 1, fetchDepth(CameraDepthTexture, uv + dv - du);
vec3 dbc = vec3( 0, 1, fetchDepth(CameraDepthTexture, uv + dv);
vec3 dbr = vec3( 1, 1, fetchDepth(CameraDepthTexture, uv + dv + du);
vec3 dmin = dtl;
if (ZCMP_GT(dmin.z, dtc.z)) dmin = dtc;
if (ZCMP_GT(dmin.z, dtr.z)) dmin = dtr;
if (ZCMP_GT(dmin.z, dml.z)) dmin = dml;
if (ZCMP_GT(dmin.z, dmc.z)) dmin = dmc;
if (ZCMP_GT(dmin.z, dmr.z)) dmin = dmr;
if (ZCMP_GT(dmin.z, dbl.z)) dmin = dbl;
if (ZCMP_GT(dmin.z, dbc.z)) dmin = dbc;
if (ZCMP_GT(dmin.z, dbr.z)) dmin = dbr;
return vec3(uv + dd.xy * dmin.xy, dmin.z);
}
<@include gpu/Color.slh@> <@include gpu/Color.slh@>
<$declareColorWheel()$> <$declareColorWheel()$>

View file

@ -18,11 +18,11 @@ in vec2 varTexCoord0;
layout(location = 0) out vec4 outFragColor; layout(location = 0) out vec4 outFragColor;
void main(void) { void main(void) {
vec3 newColor = texture(currentMap, varTexCoord0).xyz; vec3 nextColor = texture(nextMap, varTexCoord0).xyz;
outFragColor = vec4(newColor, 1.0); outFragColor = vec4(nextColor, 1.0);
// Pixel being shaded // Pixel being shaded
vec3 sourceColor = texture(colorMap, varTexCoord0).xyz; vec3 sourceColor = texture(sourceMap, varTexCoord0).xyz;
vec2 imageSize = getWidthHeight(0); vec2 imageSize = getWidthHeight(0);
@ -34,12 +34,14 @@ void main(void) {
vec2 prevPix = prevTexCoord * imageSize; vec2 prevPix = prevTexCoord * imageSize;
// Pixel Debugged // Pixel Debugged
vec2 cursorUV = getDebugCursorTexcoord(); vec3 cursorFrag = find_closest_fragment_3x3(getDebugCursorTexcoord());
vec2 cursorUV = cursorFrag.xy;
vec2 cursorPixelPos = cursorUV * imageSize; vec2 cursorPixelPos = cursorUV * imageSize;
vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy;
vec2 cursorPrevUV = cursorUV - cursorVelocity; vec2 cursorPrevUV = cursorUV - cursorVelocity;
cursorVelocity *= imageSize; cursorVelocity *= imageSize;
float cursorVelocityLength = length(cursorVelocity); float cursorVelocityLength = length(cursorVelocity);
vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength;
vec2 cursorToFragVec = pixPos - cursorPixelPos; vec2 cursorToFragVec = pixPos - cursorPixelPos;
float cursorToFragLength = length(cursorToFragVec); float cursorToFragLength = length(cursorToFragVec);
@ -60,25 +62,44 @@ void main(void) {
float tenPercentHeight = 0.1 * imageSize.y; float tenPercentHeight = 0.1 * imageSize.y;
float centerWidth = imageSize.x * 0.5; float centerWidth = imageSize.x * 0.5;
vec2 prevOrbPos = vec2(centerWidth - tenPercentHeight, imageSize.y - tenPercentHeight); vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight);
vec2 nextOrbPosToPix = pixPos - nextOrbPos;
vec2 prevOrbPos = nextOrbPos + cursorVelocityDir * 2.0 * tenPercentHeight;
vec2 prevOrbPosToPix = pixPos - prevOrbPos; vec2 prevOrbPosToPix = pixPos - prevOrbPos;
if (dot(prevOrbPosToPix, prevOrbPosToPix) < tenPercentHeight * tenPercentHeight) { if (dot(prevOrbPosToPix, prevOrbPosToPix) < tenPercentHeight * tenPercentHeight) {
vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() * 0.5; vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() / getOrbZoom();
vec3 preOrbColor = vec3(0.0); vec3 preOrbColor = vec3(0.0);
if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) {
preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz;
} }
float distanceToPrev = length(prevOrbPosToPix);
if (distanceToPrev < 2.0) {
preOrbColor = vec3(1.0, 0.0, 1.0);
}
float distanceToNext = length(imageSize * (cursorUV - prevOrbPosToPix_uv));
if (distanceToNext < 2.0) {
preOrbColor = vec3(1.0, 0.5, 0.0);
}
outFragColor = vec4(preOrbColor, 1.0); outFragColor = vec4(preOrbColor, 1.0);
return; return;
} }
vec2 nextOrbPos = vec2(centerWidth + tenPercentHeight, imageSize.y - tenPercentHeight);
vec2 nextOrbPosToPix = pixPos - nextOrbPos;
if (dot(nextOrbPosToPix, nextOrbPosToPix) < tenPercentHeight * tenPercentHeight) { if (dot(nextOrbPosToPix, nextOrbPosToPix) < tenPercentHeight * tenPercentHeight) {
vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() * 0.5; vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() / getOrbZoom();
vec3 nextOrbColor = vec3(0.0); vec3 nextOrbColor = vec3(0.0);
if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) { if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) {
nextOrbColor = texture(colorMap, nextOrbPosToPix_uv).xyz; nextOrbColor = texture(nextMap, nextOrbPosToPix_uv).xyz;
} }
float distanceToPrev = length(imageSize * (cursorPrevUV - nextOrbPosToPix_uv));
if (distanceToPrev < 2.0) {
nextOrbColor = vec3(1.0, 0.0, 1.0);
}
float distanceToNext = length(nextOrbPosToPix);
if (distanceToNext < 2.0) {
nextOrbColor = vec3(1.0, 0.5, 0.0);
}
outFragColor = vec4(nextOrbColor, 1.0); outFragColor = vec4(nextOrbColor, 1.0);
return; return;
} }
@ -94,9 +115,9 @@ void main(void) {
return; return;
} }
outFragColor = vec4(sourceColor, 1.0); outFragColor = vec4(nextColor, 1.0);
vec3 prevColor = sourceColor; vec3 prevColor = nextColor;
if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) {
prevColor = texture(historyMap, prevTexCoord).xyz; prevColor = texture(historyMap, prevTexCoord).xyz;

View file

@ -40,6 +40,7 @@ void main(void) {
vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0));
vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5);
vec2 imageSize = vec2(1.0, 1.0); // getWidthHeight(0); //vec2 imageSize = getWidthHeight(0);
vec2 imageSize = vec2(1.0, 1.0);
outFragColor = vec4( ((texcoordPos - prevUV) * imageSize), 0.0, 0.0); outFragColor = vec4( ((texcoordPos - prevUV) * imageSize), 0.0, 0.0);
} }

View file

@ -56,12 +56,14 @@ Column {
max: 50 max: 50
min: 0.0 min: 0.0
} }
CheckBox { ConfigSlider {
text: "Freeze " label: qsTr("Debug Orb Zoom")
checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] integral: false
onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } config: Render.getConfig("RenderMainView.Antialiasing")
} property: "debugOrbZoom"
max: 8.0
min: 0.0
}
} }
} }
} }