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:
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
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue