Fix T47180: Cycles deform motion blur + displacement behaves weirdly

Displacement shader was not updating motion vertex positions.

Current solution is not totally correct because it applies same offset
for all time steps. Ideally we'll need to evaluate displacement shader
for every time offset separately, but currently we don't have subframe
image access.

For the time being will consider this a TODO.
This commit is contained in:
Sergey Sharybin 2016-01-16 15:36:42 +05:00
parent ddc75d7e8a
commit 36aa7e659e
Notes: blender-bot 2023-02-14 08:47:25 +01:00
Referenced by issue #47180, cycles deform motion blur + displacement behaves weirdly
1 changed files with 11 additions and 3 deletions

View File

@ -54,9 +54,10 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
}
/* setup input for device task */
vector<bool> done(mesh->verts.size(), false);
const size_t num_verts = mesh->verts.size();
vector<bool> done(num_verts, false);
device_vector<uint4> d_input;
uint4 *d_input_data = d_input.resize(mesh->verts.size());
uint4 *d_input_data = d_input.resize(num_verts);
size_t d_input_size = 0;
for(size_t i = 0; i < mesh->triangles.size(); i++) {
@ -137,11 +138,12 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
/* read result */
done.clear();
done.resize(mesh->verts.size(), false);
done.resize(num_verts, false);
int k = 0;
float4 *offset = (float4*)d_output.data_pointer;
Attribute *attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
for(size_t i = 0; i < mesh->triangles.size(); i++) {
Mesh::Triangle t = mesh->triangles[i];
Shader *shader = scene->shaders[mesh->shader[i]];
@ -154,6 +156,12 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
done[t.v[j]] = true;
float3 off = float4_to_float3(offset[k++]);
mesh->verts[t.v[j]] += off;
if(attr_mP != NULL) {
for(int step = 0; step < mesh->motion_steps - 1; step++) {
float3 *mP = attr_mP->data_float3() + step*num_verts;
mP[t.v[j]] += off;
}
}
}
}
}