| Microsoft DirectX 8.1 (vertex shader versions 1.0, 1.1) |
Provides log2(x) support with full float precision of at least 1/220.
log dest, src
To learn more about registers, see Registers.
The following code fragment shows the operations performed.
float v = ABSF(src.w);
if (v != 0)
{
dest.x = dest.y = dest.z = dest.w =
(float)(log(v)/log(2));
}
else
{
dest.x = dest.y = dest.z = dest.w = MINUS_MAX();
}
This instruction accepts a scalar source (src.w) of which the sign bit is ignored. The result is replicated to all four channels.
The input exponent must be in the range �128 to 128. The approximation error must be less than 1/220 in absolute error, and over the range (1.0 <= dest.y < 2.0).
A zero source generates (-infinity, -infinity, -infinity, -infinity).
// This example changes the vertex color. // shader file vs.1.0 m4x4 oPos, v0, c0 ; transform vertices by view/projection matrix mov r0.w, c4.w ; load constant color log r0, r0.w ; take the log and copy it to all four components mov oD0, r0 ; output color // The constant color loaded in r0 is (0, 0, 0, 1.5). The log of 1.5 is // approx. 0.4 which yields a shade of gray since it is copied to all // four components(x, y, z, w). The resulting color is shown below.
// Additional code is used to initialize the constant registers.
D3DXMATRIX mat, matView, matProj;
D3DXMatrixMultiply(&mat, &matView, &matProj);
D3DXMatrixTranspose(&mat, &mat);
// set C0 with the view and projection matrix
m_pd3dDevice->SetVertexShaderConstant(0, &mat, 4);
// set register c4
float log[] = {0, 0, 0, 1.5f};
m_pd3dDevice->SetVertexShaderConstant(4, &log, 1);
// The first SetVertexShaderConstant method binds the C0 register
// with the first row of the view/projection matrix (rows 2, 3, 4 are
// bound to registers C2, C3, c4 also). The m4x4 instruction (in the
// shader file) loads the data.
// The second SetVertexShaderConstant method binds the C4 register
// with the data in the log array. Notice that only the w component is used.