Microsoft DirectX 8.0 (Visual Basic) |
ライティングの部分サポートを提供する。
lit vDest, vSrc0
次のコードは、lit 命令によって実行される処理とデスティネーションへの結果の書き込みを示している。
SetDestReg(); SetSrcReg(0); m_TmpReg.x = 1; m_TmpReg.y = 0; m_TmpReg.z = 0; m_TmpReg.w = 1; float power = m_Source[0].w; const float MAXPOWER = 127.9961f; if (power < -MAXPOWER) power = -MAXPOWER; // 8.8 固定小数点フォーマットに適合。 else if (power > MAXPOWER) power = -MAXPOWER; // 8.8 固定小数点フォーマットに適合。 if (m_Source[0].x > 0) { m_TmpReg.y = m_Source[0].x; if (m_Source[0].y > 0) { // 許容される近似は EXP(power * LOG(m_Source[0].y)) である。 m_TmpReg.z = (float)(pow(m_Source[0].y, power)); } } WriteResult();
指数に負の数を指定した場合、lit 命令は不定の結果を生成する。
この命令は、2 つの内積と 1 つの累乗からライティング係数を計算する。ソースのベクトルには、次の疑似コードに示すような値が含まれているものと想定される。
vSrc0.x = N*L ; 法線とライト ベクトルとの内積 vSrc0.y = N*H ; 法線と半ベクトルとの内積 vSrc0.z = ignored ; この値は無視される vSrc0.w = power ; 累乗、この値は -128.0 から 128.0 の範囲でなければならない
vDest.z の評価には低精度計算が使用できる。実装では、累乗引数で少なくとも 8 つの小数ビットをサポートする必要がある。内積は正規化されたベクトルで計算されて、クランプの制限は -128 から 128 である。
エラーは logp と expp の組み合わせに対応していなければならず、つまり 8 ビットの色成分に対して最下位ビット (LSB) 約 1 つである。
次の例は、lit 命令の使い方を示している。
lit r0, r1