Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2018-05-24Cycles Denoising: Don't use atomics in the accumulation kernel on CPUsLukas Stockner
The GPU kernel needs to use atomics for accumulation since all offsets are processed in parallel, but on CPUs that's not the case, so we can disable them there for a considerable speedup.
2017-12-21Fix T53567: Negative pixel values causing artifacts with denoisingLukas Stockner
Now negative color values are clamped to zero before the actual denoising.
2017-11-30Cycles: Improve denoising speed on GPUs with small tile sizesLukas Stockner
Previously, the NLM kernels would be launched once per offset with one thread per pixel. However, with the smaller tile sizes that are now feasible, there wasn't enough work to fully occupy GPUs which results in a significant slowdown. Therefore, the kernels are now launched in a single call that handles all offsets at once. This has two downsides: Memory accesses to accumulating buffers are now atomic, and more importantly, the temporary memory now has to be allocated for every shift at once, increasing the required memory. On the other hand, of course, the smaller tiles significantly reduce the size of the memory. The main bottleneck right now is the construction of the transformation - there is nothing to be parallelized there, one thread per pixel is the maximum. I tried to parallelize the SVD implementation by storing the matrix in shared memory and launching one block per pixel, but that wasn't really going anywhere. To make the new code somewhat readable, the handling of rectangular regions was cleaned up a bit and commented, it should be easier to understand what's going on now. Also, some variables have been renamed to make the difference between buffer width and stride more apparent, in addition to some general style cleanup.
2017-10-04Code refactor: use split variance calculation for mega kernels too.Brecht Van Lommel
There is no significant difference in denoised benchmark scenes and denoising ctests, so might as well make it all consistent.
2017-08-25Cycles: Mark pixels with negative values as outliersLukas Stockner
If a pixel has negative components, something already went wrong, so the best option is to just ignore it. Should be good for 2.79.
2017-08-07Cycles: Cleanup, space after keywordSergey Sharybin
2017-08-07Code refactor: use float4 instead of intrinsics for CPU denoise filtering.Brecht Van Lommel
Differential Revision: https://developer.blender.org/D2764
2017-08-07Code refactor: add, remove, optimize various SSE functions.Brecht Van Lommel
* Remove some unnecessary SSE emulation defines. * Use full precision float division so we can enable it. * Add sqrt(), sqr(), fabs(), shuffle variations, mask(). * Optimize reduce_add(), select(). Differential Revision: https://developer.blender.org/D2764
2017-07-23Fix Cycles denoising NaNs with a 1 sample renders.Brecht Van Lommel
This was causing different render results with different compilers. We can't do much useful with 1 sample, but better for debugging.
2017-06-11Cycles Denoising: Add more failsafes for invalid pixelsLukas Stockner
Now, when there is no usable neighboring pixel for denoising, the noisy value is preserved instead of producing a NaN. Also, negative results are clamped to zero. Note that there are just workarounds that don't fix the underlying problems, but these issues are very rare and I'm not sure if it's even possible to fix the underlying problems without introducing a significant slowdown or quality decrease in other situations. Because of that and since 2.79 is happening very soon, I just went for these workarounds for now.
2017-06-09Cleanup Cycles Denoising platform-specific definesLukas Stockner
2017-06-09Cycles Denoising: Speedup reconstruction by skipping near-zero weightsLukas Stockner
2017-06-09Cycles Denoising: Merge outlier heuristic and confidence interval testLukas Stockner
The previous outlier heuristic only checked whether the pixel is more than twice as bright compared to the 75% quantile of the 5x5 neighborhood. While this detected fireflies robustly, it also incorrectly marked a lot of legitimate small highlights as outliers and filtered them away. This commit adds an additional condition for marking a pixel as a firefly: In addition to being above the reference brightness, the lower end of the 3-sigma confidence interval has to be below it. Since the lower end approximates how low the true value of the pixel might be, this test separates pixels that are supposed to be very bright from pixels that are very bright due to random fireflies. Also, since there is now a reliable outlier filter as a preprocessing step, the additional confidence interval test in the reconstruction kernel is no longer needed.
2017-05-21Cycles Denoising: Skip confidence interval test for outlier central pixelsLukas Stockner
If the central pixel is an outlier, the denoiser is supposed to predict its value from the surrounding pixels. However, in some cases the confidence interval test would reject every single surrounding pixel, which leaves the model fitting with no data to work with.
2017-05-20Cycles Denoising: Prevent overfitting when using a very low radiusLukas Stockner
For example, when using a radius of 1, only 9 pixels (due to weighting maybe even less) will be used, but the transform code may still decide to use a 5-dimensional (or even higher) fit. This causes severe overfitting and therefore weird pixel values. To avoid this, this commit limits the amount of dimensions to a third of the pixel number. For a radius of 3 or more, this doesn't change anything, but for 1 and 2 it can prevent fireflies and/or negative values being produced.
2017-05-20Fix T51560: Black pixels on a denoising renderLukas Stockner
Once again, numerical instabilities causing the Cholesky decomposition to fail. However, further increasing the diagonal correction just because of a few pixels in very specific scenes and settings seems unjustified. Therefore, this commit simply falls back to the basic NLM-filtered pixel if the more advanced model fails.
2017-05-19Cycles: Fix compilation error after recent changesSergey Sharybin
Spotted by Steffen Dünner, thanks@
2017-05-19Cycles: Cleanup, variable namesSergey Sharybin
Don't use camel case for variable names. Leave that for the structures.
2017-05-19Cycles: Cleanup, useless new linesSergey Sharybin
2017-05-19\0;115;0cCycles: Cleanup, use ccl_restrict instead of ccl_restrict_ptrSergey Sharybin
There were following issues with ccl_restrict_ptr: - We already had ccl_restrict for all platforms. - It was secretly adding `const` qualifier to the declaration, which is quite weird since non-const pointer can also be declared as restricted. - We never in Blender are using foo_ptr or FooPtr type definitions, so not sure why we should introduce such a thing here. - It is absolutely wrong from semantic point of view to put pointer into the restrict macro -- const is a part of type, not part of hint for compiler that some pointer is never aliased.
2017-05-18Cycles Denoising: Add more robust outlier heuristic to avoid artifactsLukas Stockner
Extremely bright pixels in the rendered image cause the denoising algorithm to produce extremely noticable artifacts. Therefore, a heuristic is needed to exclude these pixels from the filtering process. The new approach calculates the 75% percentile of the 5x5 neighborhood of each pixel and flags the pixel if it is more than twice as bright. During the reconstruction process, flagged pixels are skipped. Therefore, they don't cause any problems for neighboring pixels, and the outlier pixels themselves are replaced by a prediction of their actual value based on their feature pass values and the neighboring pixels. Therefore, the denoiser now also works as a smarter despeckling filter that uses a more accurate prediction of the pixel instead of a simple average. This can be used even if denoising isn't wanted by setting the denoising radius to 1.
2017-05-07Cycles: Fix transform addressing in the denoiser codeLukas Stockner
2017-05-07Cycles: Implement denoising option for reducing noise in the rendered imageLukas Stockner
This commit contains the first part of the new Cycles denoising option, which filters the resulting image using information gathered during rendering to get rid of noise while preserving visual features as well as possible. To use the option, enable it in the render layer options. The default settings fit a wide range of scenes, but the user can tweak individual settings to control the tradeoff between a noise-free image, image details, and calculation time. Note that the denoiser may still change in the future and that some features are not implemented yet. The most important missing feature is animation denoising, which uses information from multiple frames at once to produce a flicker-free and smoother result. These features will be added in the future. Finally, thanks to all the people who supported this project: - Google (through the GSoC) and Theory Studios for sponsoring the development - The authors of the papers I used for implementing the denoiser (more details on them will be included in the technical docs) - The other Cycles devs for feedback on the code, especially Sergey for mentoring the GSoC project and Brecht for the code review! - And of course the users who helped with testing, reported bugs and things that could and/or should work better!