ランプシェーディングまたはライティングとは何ですか?


14

ランプシェーディングまたはランプとは何ですか?トゥーンシェーディングとは違うのですか、それとも同じコンセプトですか?ランプシェーディングとブリンフォンまたはランバートのスペキュラリティの計算方法はどのように異なりますか?

回答:


21

従来のブリン/フォンシェーディングでは、表面の法線と光の方向との間の角度の余弦を測定することにより、ピクセルの拡散項を計算します。したがって、この場合、単純なシェーダーは次のようになります。

float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
    float3 lightDir = lightPos - pos;
    lightDir.normalize();

    return max(0.0, Dot(lightDir, normal));
}

ランプシェーディングの考え方は、1Dルックアップテクスチャによって拡散係数を変調することです。このテクスチャに何を入れるかによって、さまざまな効果を生成できます。したがって、拡散係数を計算するシェーダー関数は次のようになります。

texture1D rampTex;
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
    float3 lightDir = lightPos - pos;
    lightDir.normalize();

    // Map value from [-1, 1] to [0, 1]
    float rampCoord = Dot(lightDir, normal) * 0.5 + 0.5;
    return tex1D(rampTex, rampCoord);
}

たとえば、セルシェーダーを実装する場合、ステップ関数をエミュレートするランプテクスチャを生成できます。

ここに画像の説明を入力してください

同じアイデアを使用して、鏡面照明用に異なる効果を生成することもできます。「ランプ」シェーディングは、実際には、テクスチャによってシェーディング値を変調するという考えのみを指します。

編集:Team Fortress 2は、レンダリングにランプシェーダーを使用します。このペーパーの詳細を確認できます。

http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf

セクション5の「拡散ワーピング機能」というタイトルのサブセクションをご覧ください。


1
素晴らしい答えです!拡散照明とランプ照明の照明の違いの説明は、まさに私が探していたものです。ランプシェーディングの概念が一般的にどのようなものであるかについてのコメントも歓迎します。余談ですが、このコンセプトを使用したゲームのサンプル画像を投稿できますか?
StampyTurtle

@Stampyturtle例で私の答えを更新しました。
モコシャ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.