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
diff options
context:
space:
mode:
authorPatrick Mours <pmours@nvidia.com>2020-11-04 17:09:06 +0300
committerPatrick Mours <pmours@nvidia.com>2020-11-04 17:09:06 +0300
commitfd9124ed6b35fc3701ec3a4a9980c6eda5324fac (patch)
tree342a5b7542a017f1b9888cb333a16dc2e097d7a4 /intern/cycles/kernel/kernels
parent43ceb0f0475e7d9a4095ae0675dd976d03a83cfe (diff)
Fix Cycles volume render differences with NanoVDB when using linear sampling
The NanoVDB sampling implementation behaves different from dense texture sampling, so this adds a small offset to the voxel indices to correct for that. Also removes the need to modify the sampling coordinates by moving all the necessary transformations into the image transform. See also T81454.
Diffstat (limited to 'intern/cycles/kernel/kernels')
-rw-r--r--intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h12
-rw-r--r--intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h12
-rw-r--r--intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h27
3 files changed, 16 insertions, 35 deletions
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
index 347d0fec7f5..b466b41f456 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
@@ -490,21 +490,17 @@ template<typename T> struct NanoVDBInterpolator {
static ccl_always_inline float4
interp_3d(const TextureInfo &info, float x, float y, float z, InterpolationType interp)
{
+ const nanovdb::Vec3f xyz(x, y, z);
nanovdb::NanoGrid<T> *const grid = (nanovdb::NanoGrid<T> *)info.data;
const nanovdb::NanoRoot<T> &root = grid->tree().root();
- const nanovdb::Coord off(root.bbox().min());
- const nanovdb::Coord dim(root.bbox().dim());
- const nanovdb::Vec3f xyz(off[0] + x * dim[0], off[1] + y * dim[1], off[2] + z * dim[2]);
-
typedef nanovdb::ReadAccessor<nanovdb::NanoRoot<T>> ReadAccessorT;
switch ((interp == INTERPOLATION_NONE) ? info.interpolation : interp) {
- default:
- case INTERPOLATION_LINEAR:
- return read(nanovdb::SampleFromVoxels<ReadAccessorT, 1, false>(root)(xyz));
case INTERPOLATION_CLOSEST:
return read(nanovdb::SampleFromVoxels<ReadAccessorT, 0, false>(root)(xyz));
- case INTERPOLATION_CUBIC:
+ case INTERPOLATION_LINEAR:
+ return read(nanovdb::SampleFromVoxels<ReadAccessorT, 1, false>(root)(xyz));
+ default:
return read(nanovdb::SampleFromVoxels<ReadAccessorT, 3, false>(root)(xyz));
}
}
diff --git a/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h b/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
index 5a005a3f65b..c2a0ee06dbc 100644
--- a/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
+++ b/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
@@ -130,21 +130,17 @@ template<typename T>
ccl_device_inline T kernel_tex_image_interp_nanovdb(
const TextureInfo &info, float x, float y, float z, uint interpolation)
{
+ const nanovdb::Vec3f xyz(x, y, z);
nanovdb::NanoGrid<T> *const grid = (nanovdb::NanoGrid<T> *)info.data;
const nanovdb::NanoRoot<T> &root = grid->tree().root();
- const nanovdb::Coord off(root.bbox().min());
- const nanovdb::Coord dim(root.bbox().dim());
- const nanovdb::Vec3f xyz(off[0] + x * dim[0], off[1] + y * dim[1], off[2] + z * dim[2]);
-
typedef nanovdb::ReadAccessor<nanovdb::NanoRoot<T>> ReadAccessorT;
switch (interpolation) {
- default:
- case INTERPOLATION_LINEAR:
- return nanovdb::SampleFromVoxels<ReadAccessorT, 1, false>(root)(xyz);
case INTERPOLATION_CLOSEST:
return nanovdb::SampleFromVoxels<ReadAccessorT, 0, false>(root)(xyz);
- case INTERPOLATION_CUBIC:
+ case INTERPOLATION_LINEAR:
+ return nanovdb::SampleFromVoxels<ReadAccessorT, 1, false>(root)(xyz);
+ default:
return nanovdb::SampleFromVoxels<ReadAccessorT, 3, false>(root)(xyz);
}
}
diff --git a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
index 2f44f249c5f..cbf9a208112 100644
--- a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
+++ b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
@@ -229,32 +229,29 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg, int id, float3 P
uint interpolation = (interp == INTERPOLATION_NONE) ? info->interpolation : interp;
#ifdef WITH_NANOVDB
+ cnanovdb_Vec3F xyz;
+ xyz.mVec[0] = x;
+ xyz.mVec[1] = y;
+ xyz.mVec[2] = z;
+
if (info->data_type == IMAGE_DATA_TYPE_NANOVDB_FLOAT) {
ccl_global cnanovdb_griddata *grid =
(ccl_global cnanovdb_griddata *)(kg->buffers[info->cl_buffer] + info->data);
const ccl_global cnanovdb_rootdataF *root = cnanovdb_treedata_rootF(
cnanovdb_griddata_tree(grid));
- cnanovdb_Vec3F xyz;
- xyz.mVec[0] = root->mBBox_min.mVec[0] +
- x * (root->mBBox_max.mVec[0] - root->mBBox_min.mVec[0]);
- xyz.mVec[1] = root->mBBox_min.mVec[1] +
- y * (root->mBBox_max.mVec[1] - root->mBBox_min.mVec[1]);
- xyz.mVec[2] = root->mBBox_min.mVec[2] +
- z * (root->mBBox_max.mVec[2] - root->mBBox_min.mVec[2]);
-
cnanovdb_readaccessor acc;
cnanovdb_readaccessor_init(&acc, root);
float value;
switch (interpolation) {
+ case INTERPOLATION_CLOSEST:
+ value = cnanovdb_sampleF_nearest(&acc, &xyz);
+ break;
default:
case INTERPOLATION_LINEAR:
value = cnanovdb_sampleF_trilinear(&acc, &xyz);
break;
- case INTERPOLATION_CLOSEST:
- value = cnanovdb_sampleF_nearest(&acc, &xyz);
- break;
}
return make_float4(value, value, value, 1.0f);
}
@@ -264,14 +261,6 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg, int id, float3 P
const ccl_global cnanovdb_rootdataF3 *root = cnanovdb_treedata_rootF3(
cnanovdb_griddata_tree(grid));
- cnanovdb_Vec3F xyz;
- xyz.mVec[0] = root->mBBox_min.mVec[0] +
- x * (root->mBBox_max.mVec[0] - root->mBBox_min.mVec[0]);
- xyz.mVec[1] = root->mBBox_min.mVec[1] +
- y * (root->mBBox_max.mVec[1] - root->mBBox_min.mVec[1]);
- xyz.mVec[2] = root->mBBox_min.mVec[2] +
- z * (root->mBBox_max.mVec[2] - root->mBBox_min.mVec[2]);
-
cnanovdb_readaccessor acc;
cnanovdb_readaccessor_init(&acc, root);