History

Some cleanup, still trying to solve the problem

Olivier Prat committed 8 years ago

Commit c27f3dc1 parent 0f467ce7 files · +43 −63Browse files

Unified · Split

7 files
  1. libraries/render-utils/src/AmbientOcclusionEffect.cpp +1 −1
  2. libraries/render-utils/src/DebugDeferredBuffer.cpp +1 −1
  3. libraries/render-utils/src/DebugDeferredBuffer.h +2 −2
  4. libraries/render-utils/src/ssao.slh +22 −48
  5. libraries/render-utils/src/ssao_makeOcclusion.slf +5 −2
  6. libraries/render-utils/src/ssao_mip_depth.slf +9 −4
  7. scripts/developer/utilities/render/luci.js +3 −5
libraries/render-utils/src/AmbientOcclusionEffect.cpp+1−1
@@ -375,7 +375,7 @@ const gpu::PipelinePointer& AmbientOcclusionEffect::getVBlurPipeline() { · 374 unmodified lines
375 375
376const gpu::PipelinePointer& AmbientOcclusionEffect::getMipCreationPipeline() {376const gpu::PipelinePointer& AmbientOcclusionEffect::getMipCreationPipeline() {
377 if (!_mipCreationPipeline) {377 if (!_mipCreationPipeline) {
378 _mipCreationPipeline = gpu::Context::createMipGenerationPipeline(gpu::Shader::createPixel(shader::render_utils::fragment::mip_depth_median));378 _mipCreationPipeline = gpu::Context::createMipGenerationPipeline(gpu::Shader::createPixel(shader::render_utils::fragment::ssao_mip_depth));
379 }379 }
380 return _mipCreationPipeline;380 return _mipCreationPipeline;
381}381}
libraries/render-utils/src/DebugDeferredBuffer.cpp+1−1
@@ -384,7 +384,7 @@ void DebugDeferredBuffer::configure(const Config& config) { · 383 unmodified lines
384 auto& parameters = _parameters.edit();384 auto& parameters = _parameters.edit();
385 385
386 _mode = (Mode)config.mode;386 _mode = (Mode)config.mode;
387 _size = config.size;387 _size = glm::vec4{config.debugCursorTexcoord.x*2.0f - 1.0f, -1.0f, 1.0f, 1.0f};
388 parameters._shadowCascadeIndex = glm::clamp(_mode - Mode::ShadowCascade0Mode, 0, (int)SHADOW_CASCADE_MAX_COUNT - 1);388 parameters._shadowCascadeIndex = glm::clamp(_mode - Mode::ShadowCascade0Mode, 0, (int)SHADOW_CASCADE_MAX_COUNT - 1);
389}389}
390 390
libraries/render-utils/src/DebugDeferredBuffer.h+2−2
@@ -25,14 +25,14 @@ class DebugDeferredBufferConfig : public render::Job::Config { · 24 unmodified lines
25 Q_OBJECT25 Q_OBJECT
26 Q_PROPERTY(bool enabled MEMBER enabled)26 Q_PROPERTY(bool enabled MEMBER enabled)
27 Q_PROPERTY(int mode MEMBER mode WRITE setMode)27 Q_PROPERTY(int mode MEMBER mode WRITE setMode)
28 Q_PROPERTY(glm::vec4 size MEMBER size NOTIFY dirty)28 Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty)
29public:29public:
30 DebugDeferredBufferConfig() : render::Job::Config(false) {}30 DebugDeferredBufferConfig() : render::Job::Config(false) {}
31 31
32 void setMode(int newMode);32 void setMode(int newMode);
33 33
34 int mode{ 0 };34 int mode{ 0 };
35 glm::vec4 size{ 0.0f, -1.0f, 1.0f, 1.0f };35 glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f };
36signals:36signals:
37 void dirty();37 void dirty();
38};38};
libraries/render-utils/src/ssao.slh+22−48
@@ -249,14 +249,12 @@ vec3 fetchTapUnfiltered(ivec4 side, ivec2 ssC, vec3 tap, vec2 sideImageSize) { · 248 unmodified lines
249 return P;249 return P;
250}250}
251 251
252vec4 fetchTap(ivec4 side, ivec2 ssC, vec3 tap, vec2 sideImageSize) {252vec4 fetchTap(ivec4 side, vec2 tapPixelPos, float tapRadius, vec2 sideImageSize) {
253 int mipLevel = evalMipFromRadius(tap.z * float(doFetchMips()));253 int mipLevel = evalMipFromRadius(tapRadius * float(doFetchMips()));
254
255 vec2 ssP = tap.xy + vec2(ssC);
256 254
257 // We need to divide by 2^mipLevel to read the appropriately scaled coordinate from a MIP-map.255 // We need to divide by 2^mipLevel to read the appropriately scaled coordinate from a MIP-map.
258 // Manually clamp to the texture size because texelFetch bypasses the texture unit256 // Manually clamp to the texture size because texelFetch bypasses the texture unit
259 vec2 tapUV = (vec2(ssP) + vec2(0.5)) / sideImageSize;257 vec2 tapUV = (tapPixelPos + vec2(0.5)) / sideImageSize;
260 vec2 fetchUV = vec2(tapUV.x + side.w * 0.5 * (side.x - tapUV.x), tapUV.y);258 vec2 fetchUV = vec2(tapUV.x + side.w * 0.5 * (side.x - tapUV.x), tapUV.y);
261 259
262 vec4 P;260 vec4 P;
@@ -293,44 +291,21 @@ float evalVisibilitySSAO(in vec3 centerPosition, in vec3 centerNormal, in vec3 t · 30 unmodified lines
293float computeHorizonFromTap(vec3 tapPositionES, vec3 fragPositionES, vec3 fragNormalES) {291float computeHorizonFromTap(vec3 tapPositionES, vec3 fragPositionES, vec3 fragNormalES) {
294 vec3 deltaVec = tapPositionES - fragPositionES;292 vec3 deltaVec = tapPositionES - fragPositionES;
295 float distanceSquared = dot(deltaVec, deltaVec);293 float distanceSquared = dot(deltaVec, deltaVec);
296 float horizon = dot(normalize(deltaVec), fragNormalES);294 float cosHorizonAngle = dot(normalize(deltaVec), fragNormalES);
297 float radiusFalloff = max(0.0, 1.0 - (distanceSquared / getRadius2()));295 float radiusFalloff = max(0.0, 1.0 - (distanceSquared / getRadius2()));
298 296
299 horizon = max(0.0, (horizon - getFalloffAngle()) / (1.0 - getFalloffAngle()));297 cosHorizonAngle = max(0.0, (cosHorizonAngle - getFalloffAngle()) / (1.0 - getFalloffAngle()));
300 horizon *= radiusFalloff;298 cosHorizonAngle *= radiusFalloff;
301
302 return horizon;
303}
304
305vec2 clampSearchVector(vec2 sideImageSize, vec2 shadedPixelPos, vec2 searchVec) {
306 vec2 clampedSearchVec = searchVec;
307 vec2 endPixel = shadedPixelPos + clampedSearchVec;
308 299
309 if (endPixel.x < 0) {300 return cosHorizonAngle;
310 clampedSearchVec *= ((0-shadedPixelPos.x) / clampedSearchVec.x);
311 endPixel = shadedPixelPos + clampedSearchVec;
312 }
313 if (endPixel.x > (sideImageSize.x-1)) {
314 clampedSearchVec *= ((sideImageSize.x-1-shadedPixelPos.x) / clampedSearchVec.x);
315 endPixel = shadedPixelPos + clampedSearchVec;
316 }
317 if (endPixel.y < 0) {
318 clampedSearchVec *= ((0-shadedPixelPos.y) / clampedSearchVec.y);
319 endPixel = shadedPixelPos + clampedSearchVec;
320 }
321 if (endPixel.y > (sideImageSize.y-1)) {
322 clampedSearchVec *= ((sideImageSize.y-1-shadedPixelPos.y) / clampedSearchVec.y);
323 }
324
325 return clampedSearchVec;
326}301}
327 302
328<@func computeHorizon()@>303<@func computeHorizon()@>
329 if (tapPixelPos.x>=0 && tapPixelPos.y>=0 && tapPixelPos.x<sideImageSize.x && tapPixelPos.y<sideImageSize.y) {304 vec2 tapPixelPos = tapPixelOffset + shadedPixelPos;
305 if (tapPixelPos.x<0 && tapPixelPos.y<0 && tapPixelPos.x>=sideImageSize.x && tapPixelPos.y>=sideImageSize.y) {
330 break;306 break;
331 }307 }
332 vec3 tap = vec3(tapPixelPos, radius);308 vec4 tapUVZ_mip = fetchTap(side, tapPixelPos, radius, sideImageSize);
333 vec4 tapUVZ_mip = fetchTap(side, shadedPixelPos, tap, sideImageSize);
334 vec3 tapPositionES = evalEyePositionFromZeye(side.x, tapUVZ_mip.z, tapUVZ_mip.xy);309 vec3 tapPositionES = evalEyePositionFromZeye(side.x, tapUVZ_mip.z, tapUVZ_mip.xy);
335 float tapCosHorizonAngle = computeHorizonFromTap(tapPositionES, fragPositionES, fragNormalES);310 float tapCosHorizonAngle = computeHorizonFromTap(tapPositionES, fragPositionES, fragNormalES);
336 311
@@ -338,26 +313,25 @@ vec2 clampSearchVector(vec2 sideImageSize, vec2 shadedPixelPos, vec2 searchVec) · 1 unmodified line
338 313
339<@endfunc@>314<@endfunc@>
340 315
341#define SSAO_LINEAR_SAMPLING 1316#define SSAO_LINEAR_SEARCH_HORIZON 1
342 317
343float computeHorizon(ivec4 side, ivec2 shadedPixelPos, vec2 sideImageSize, vec2 deltaTap, 318float computeHorizon(ivec4 side, vec2 shadedPixelPos, vec2 sideImageSize, vec2 deltaTap,
344 vec3 fragPositionES, vec3 fragNormalES, vec2 searchVec) {319 vec3 fragPositionES, vec3 fragNormalES, vec2 searchVec, float searchRadius) {
345 vec2 absSearchVec = abs(searchVec);320 vec2 absSearchVec = abs(searchVec);
346 int stepCount = int(max(absSearchVec.x, absSearchVec.y));321 int stepCount = int(ceil(max(absSearchVec.x, absSearchVec.y)));
347 float cosHorizonAngle = 0.0;322 float cosHorizonAngle = 0.0;
348 323
349 if (stepCount>0) {324 if (stepCount>0) {
350 vec2 deltaPixelTap = searchVec / float(stepCount);325 vec2 deltaPixelTap = searchVec / float(stepCount);
351 float searchRadius = length(searchVec);
352 float deltaRadius = searchRadius / float(stepCount);326 float deltaRadius = searchRadius / float(stepCount);
353 vec2 tapPixelPos = vec2(0);327 vec2 tapPixelOffset = vec2(0);
354 328
355#if SSAO_LINEAR_SAMPLING329#if SSAO_LINEAR_SEARCH_HORIZON
356 float radius = 0.0;330 float radius = 0.0;
357 int stepIndex;331 int stepIndex;
358 332
359 for (stepIndex=0 ; stepIndex<stepCount ; stepIndex++) {333 for (stepIndex=0 ; stepIndex<stepCount ; stepIndex++) {
360 tapPixelPos += deltaPixelTap;334 tapPixelOffset += deltaPixelTap;
361 radius += deltaRadius;335 radius += deltaRadius;
362 336
363 <$computeHorizon()$>337 <$computeHorizon()$>
@@ -366,8 +340,8 @@ float computeHorizon(ivec4 side, ivec2 shadedPixelPos, vec2 sideImageSize, vec2 · 2 unmodified lines
366 float radius = deltaRadius;340 float radius = deltaRadius;
367 float mipLevel = evalMipFromRadius(radius * float(doFetchMips()));341 float mipLevel = evalMipFromRadius(radius * float(doFetchMips()));
368 342
369 while (radius<searchRadius) {343 while (radius<=searchRadius) {
370 tapPixelPos += deltaPixelTap;344 tapPixelOffset += deltaPixelTap;
371 345
372 <$computeHorizon()$>346 <$computeHorizon()$>
373 347
@@ -384,16 +358,16 @@ float computeHorizon(ivec4 side, ivec2 shadedPixelPos, vec2 sideImageSize, vec2 · 10 unmodified lines
384 return cosHorizonAngle;358 return cosHorizonAngle;
385}359}
386 360
387float evalVisibilityHBAO(ivec4 side, ivec2 shadedPixelPos, vec2 sideImageSize, vec2 deltaTap, float diskPixelRadius, 361float evalVisibilityHBAO(ivec4 side, vec2 shadedPixelPos, vec2 sideImageSize, vec2 deltaTap, float diskPixelRadius,
388 vec3 fragPositionES, vec3 fragNormalES) {362 vec3 fragPositionES, vec3 fragNormalES) {
389 vec2 searchVec = deltaTap * diskPixelRadius;363 vec2 searchVec = deltaTap * diskPixelRadius;
390 float obscurance;364 float obscurance;
391 365
392 // Forward search for h1366 // Forward search for h1
393 obscurance = computeHorizon(side, shadedPixelPos, sideImageSize, deltaTap, fragPositionES, fragNormalES, searchVec);367 obscurance = computeHorizon(side, shadedPixelPos, sideImageSize, deltaTap, fragPositionES, fragNormalES, searchVec, diskPixelRadius);
394 368
395 // Backward search for h2369 // Backward search for h2
396 obscurance += computeHorizon(side, shadedPixelPos, sideImageSize, deltaTap, fragPositionES, fragNormalES, -searchVec);370 obscurance += computeHorizon(side, shadedPixelPos, sideImageSize, deltaTap, fragPositionES, fragNormalES, -searchVec, diskPixelRadius);
397 371
398 return obscurance * 0.5 / PI;372 return obscurance * 0.5 / PI;
399}373}
libraries/render-utils/src/ssao_makeOcclusion.slf+5−2
@@ -60,10 +60,13 @@ void main(void) { · 59 unmodified lines
60 for (int i = 0; i < numSamples; ++i) {60 for (int i = 0; i < numSamples; ++i) {
61#if SSAO_USE_HORIZON_BASED61#if SSAO_USE_HORIZON_BASED
62 vec3 deltaTap = getUnitTapLocation(i, 1.0, randomPatternRotationAngle, PI);62 vec3 deltaTap = getUnitTapLocation(i, 1.0, randomPatternRotationAngle, PI);
63 obscuranceSum += evalVisibilityHBAO(side, shadedPixelPos, sideImageSize, deltaTap.xy, diskPixelRadius, fragPositionES, fragNormalES);63 // TEMPO OP
64 deltaTap.xy = vec2(1,0);
65 obscuranceSum += evalVisibilityHBAO(side, vec2(shadedPixelPos), sideImageSize, deltaTap.xy, diskPixelRadius, fragPositionES, fragNormalES);
64#else66#else
65 vec3 tap = getTapLocationClampedSSAO(i, randomPatternRotationAngle, diskPixelRadius, shadedPixelPos, sideImageSize);67 vec3 tap = getTapLocationClampedSSAO(i, randomPatternRotationAngle, diskPixelRadius, shadedPixelPos, sideImageSize);
66 vec3 tapUVZ = fetchTap(side, shadedPixelPos, tap, sideImageSize);68 vec2 tapPixelPos = vec2(shadedPixelPos) + tap.xy;
69 vec3 tapUVZ = fetchTap(side, tapPixelPos, tap.z, sideImageSize);
67 vec3 tapPositionES = evalEyePositionFromZeye(side.x, tapUVZ.z, tapUVZ.xy);70 vec3 tapPositionES = evalEyePositionFromZeye(side.x, tapUVZ.z, tapUVZ.xy);
68 obscuranceSum += float(tap.z > 0.0) * evalVisibilitySSAO(fragPositionES, fragNormalES, tapPositionES);71 obscuranceSum += float(tap.z > 0.0) * evalVisibilitySSAO(fragPositionES, fragNormalES, tapPositionES);
69#endif72#endif
libraries/render-utils/src/ssao_mip_depth.slfrenamed from libraries/render-utils/src/mip_depth_median.slf+9−4
@@ -2,7 +2,7 @@ · 1 unmodified line
2<$VERSION_HEADER$>2<$VERSION_HEADER$>
3// Generated on <$_SCRIBE_DATE$>3// Generated on <$_SCRIBE_DATE$>
4//4//
5// mip_depth_median.frag5// ssao_mip_depth.frag
6// fragment shader6// fragment shader
7//7//
8// Created by Olivier Prat on 4/18/18.8// Created by Olivier Prat on 4/18/18.
@@ -22,7 +22,7 @@ void main(void) { · 13 unmodified lines
22 vec4 depths = textureGather(depthTexture, varTexCoord0);22 vec4 depths = textureGather(depthTexture, varTexCoord0);
23 23
24 // Order the depths from minimum to maximum24 // Order the depths from minimum to maximum
25 depths.xy = depths.x > depths.y ? depths.yx : depths.xy;25/* depths.xy = depths.x > depths.y ? depths.yx : depths.xy;
26 depths.xz = depths.x > depths.z ? depths.zx : depths.xz;26 depths.xz = depths.x > depths.z ? depths.zx : depths.xz;
27 depths.xw = depths.x > depths.w ? depths.wx : depths.xw;27 depths.xw = depths.x > depths.w ? depths.wx : depths.xw;
28 28
@@ -31,6 +31,11 @@ void main(void) { · 2 unmodified lines
31 31
32 depths.zw = depths.z > depths.w ? depths.wz : depths.zw;32 depths.zw = depths.z > depths.w ? depths.wz : depths.zw;
33 33
34 float median = (depths.y + depths.z) / 2.0;34 float outZ = (depths.y + depths.z) / 2.0;*/
35 outFragColor = vec4(vec3(median), 1.0);35
36 float outZ = min(depths.x, depths.y);
37 outZ = min(outZ, depths.z);
38 outZ = min(outZ, depths.w);
39
40 outFragColor = vec4(vec3(outZ), 1.0);
36}41}
scripts/developer/utilities/render/luci.js+3−5
@@ -78,13 +78,11 @@ · 77 unmodified lines
78 Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; });78 Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; });
79 Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); });79 Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); });
80 80
81
82
83 function setDebugCursor(x, y) {81 function setDebugCursor(x, y) {
84 nx = (x / Window.innerWidth);82 nx = ((x + 0.5) / Window.innerWidth);
85 ny = 1.0 - ((y) / (Window.innerHeight - 32));83 ny = 1.0 - ((y + 0.5) / (Window.innerHeight));
86 84
87 Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny };85 Render.getConfig("RenderMainView").getConfig("DebugDeferredBuffer").debugCursorTexcoord = { x: nx, y: ny };
88 }86 }
89 87
90 88