ランプシェーディングまたはランプとは何ですか?トゥーンシェーディングとは違うのですか、それとも同じコンセプトですか?ランプシェーディングとブリンフォンまたはランバートのスペキュラリティの計算方法はどのように異なりますか?
ランプシェーディングまたはランプとは何ですか?トゥーンシェーディングとは違うのですか、それとも同じコンセプトですか?ランプシェーディングとブリンフォンまたはランバートのスペキュラリティの計算方法はどのように異なりますか?
回答:
従来のブリン/フォンシェーディングでは、表面の法線と光の方向との間の角度の余弦を測定することにより、ピクセルの拡散項を計算します。したがって、この場合、単純なシェーダーは次のようになります。
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の「拡散ワーピング機能」というタイトルのサブセクションをご覧ください。