Hi,dhart. Thank you for replying to my questions.
Now I have changed my code. I keep my GAS’s gas_buffer_size, d_temp buffer and d_gas_output in my mesh struct, and initialize these variables in my first building GAS process. In my updating process, I re-use these variables. I do this because there are only 2 or 3 meshes in my scene, so it doesn’t cost too much memory. And for my IAS, I do the same change as my GAS.
But after doing that, the mesh does not moving anyway.
Below is my code of updateMeshAccels and updateInstanceAccels.
void Scene::updateMeshAccels()
{
uint32_t triangle_input_flags = OPTIX_GEOMETRY_FLAG_DISABLE_ANYHIT;
OptixAccelBuildOptions accel_options = {};
accel_options.buildFlags = OPTIX_BUILD_FLAG_ALLOW_UPDATE;
accel_options.operation = OPTIX_BUILD_OPERATION_UPDATE;
for (size_t i = 0; i < m_meshes.size(); ++i)
{
auto& mesh = m_meshes[i];
OptixBuildInput triangle_input;
memset(&triangle_input, 0, sizeof(OptixBuildInput));
triangle_input.type = OPTIX_BUILD_INPUT_TYPE_TRIANGLES;
triangle_input.triangleArray.vertexFormat = OPTIX_VERTEX_FORMAT_FLOAT3;
triangle_input.triangleArray.vertexStrideInBytes = sizeof(float3);
triangle_input.triangleArray.numVertices = mesh->positions_size;
triangle_input.triangleArray.vertexBuffers = &(mesh->positions_data);
triangle_input.triangleArray.indexFormat = OPTIX_INDICES_FORMAT_UNSIGNED_INT3;
triangle_input.triangleArray.indexStrideInBytes = sizeof(uint32_t) * 3;
triangle_input.triangleArray.numIndexTriplets = mesh->v_indices_size/* / 3*/;
triangle_input.triangleArray.indexBuffer = mesh->v_indices_data;
triangle_input.triangleArray.flags = &triangle_input_flags;
triangle_input.triangleArray.numSbtRecords = 1;
OPTIX_CHECK(optixAccelBuild(
m_context,
0, // CUDA stream
&accel_options,
&triangle_input,
1, // num build inputs
mesh->d_temp,
mesh->gas_buffer_size.tempUpdateSizeInBytes,
mesh->d_gas_output,
mesh->gas_buffer_size.outputSizeInBytes,
&mesh->gas_handle,
nullptr, // emitted property list
0 // num emitted properties
));
}
}
void Scene::updateInstanceAccel(int rayTypeCount /*= whitted::RAY_TYPE_COUNT*/)
{
const size_t num_instances = m_meshes.size();
m_instance_input.type = OPTIX_BUILD_INPUT_TYPE_INSTANCES;
m_instance_input.instanceArray.instances = m_d_instances.get();
m_accel_options.operation = OPTIX_BUILD_OPERATION_UPDATE;
OPTIX_CHECK(optixAccelBuild(
m_context,
nullptr, // CUDA stream
&m_accel_options,
&m_instance_input,
1, // num build inputs
m_ias_d_temp_buffer,
m_ias_buffer_sizes.tempSizeInBytes,
m_d_ias_output_buffer,
m_ias_buffer_sizes.outputSizeInBytes,
&m_ias_handle,
nullptr, // emitted property list
0 // num emitted properties
));
}