Microsoft DirectX 8.0 (C++)

lit

ライティングの部分サポートを提供する。

lit   vDest, vSrc0

レジスタ

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 である。

エラーは logpexpp の組み合わせに対応していなければならず、つまり 8 ビットの色成分に対して最下位ビット (LSB) 約 1 つである。

次の例は、lit 命令の使い方を示している。

lit r0, r1