Game Development Reference
In-Depth Information
// Return 1 if bit at zero-based index is 1 in the bit field;
// otherwise return 0.
float checkBit( float bitField, float bitIndex)
{
float bitValue = pow(2,bitIndex);
bitField = fmod(bitField,bitValue*2);
return (bitField - bitValue) >= 0.0f ? 1.0f : 0.0f;
}
Listing 3.1. Code for the checkBit() function.
Bit-field check using floating-point mathematics. The damage bit-field value is
stored on the CPU as an integer variable. However, current-generation shader
models do not support useful integer operations, so we have to do the work with
floating-point mathematics. First, store the bit-field value in a vertex shader
constant. We store the value “logically.” That is, if our bit-field is 010110, then
this translates to 22 in decimal, so we set the constant value to 22.0f for the
vertex shader. Then, in the vertex shade,r we can pass this value to the function
checkBit() in Listing 3.1.
Listing 3.2 shows an example of how to use the checkBit() function to detect
whether the vertex belongs to a damaged area or not.
It is important to note that using floating-point mathematics to do the bit
check cannot benefit from all bits available in the floating-point variable. If we
were doing integer mathematics, then a standard 32-bit integer can represent 32
extern float damageBitField;
VS_OUTPUT VS_Main(VS_INPUT In)
{
.
.
.
// Check whether this vertex belongs to a "damaged" area.
// Damage ID is compressed with vertex normal.
float damageID = round(length(In.normal))-1;
if (damageID > 0)
{
float damaged = checkBit(damageBitField , damageID-1);
In.position *= 1.0f-damaged; // Collapse vertex if damaged
}
.
.
.
}
Listing 3.2. Sample code of a vertex shader that supports damage.