Damage Shaders (NvBlastExtShaders)
The Blast damage shader extension provides basic implementations of programs generating fracture commands, the first step in breaking a Blast Actor, see Damage and Fracturing. These programs come as two shader functions (callbacks): one for Actors with a support graph, and one for Actors with just one chunk, respectively. The NvBlastDamageProgram containing both shaders can be used for low-level directly (NvBlastActorGenerateFracture) or for TkActor’s damage and fracture functions.
For example, one may construct a damage program using the “shear” damage shaders declared in NvBlastExtDamageShaders.h:
NvBlastDamageProgram damageProgram = { NvBlastExtShearGraphShader, NvBlastExtShearSubgraphShader };
The appropriate shader (“graph” or “subgraph”) will be called for an Actor being processed, along with the Actor’s necessary geometry and program parameters. The parameters (NvBlastProgramParams) are set to contain
Material, something that describes an Actor properties (e.g. mass, stiffness, fragility) which are not expected to be changed often.
Damage description, something that describes a particular damage event (e.g. position, radius and force of explosion).
For example:
NvBlastExtMaterial material = { health, minDamageThreshold, maxDamageThreshold };
NvBlastExtRadialDamageDesc damageDesc = { compressive, posX, posY, posZ, minR, maxR };
When used with TkActor::damage() functions, TkActor will cache the necessary data for deferred processing through TkGroup. This includes accumulating damage requests for the same material and program parameter combination. A default material can be set for a TkFamily that all its Actors uses.
A Tk layer example follows.
tkGroup->addActor(*tkActor);
tkActor->damage(damageProgram, damageDesc0, sizeof(NvBlastExtRadialDamageDesc), &material);
tkActor->damage(damageProgram, damageDesc1, sizeof(NvBlastExtRadialDamageDesc), &material);
tkGroup->process();
In contrast, the user is responsible for providing all the damage descriptions persisting through the low-level NvBlastActorGenerateFracture call when not using the Tk layer:
NvBlastProgramParams programParams = { damageDescs, 2, &material };
NvBlastActorGenerateFracture(commandBuffers, actor, damageProgram, &programParams, nullptr, nullptr);