より複雑な照明の章VIII(3)

@

ユニティ光の減衰

上記では、我々は、ルックアップテーブルは、フラグメントシェーダによって計算されるようにユニティテクセル光減衰を使用して言及しました。これは、数式の複雑さに依存しない減衰量を計算するという利点があり、私たちはすることができテクスチャサンプリングにパラメータ値を使用します。しかし、減衰量を計算するテクスチャルックアップを使用した場合も、いくつかの欠点を有しています。
●必要性は、テクスチャ、テクスチャを事前にサンプリング取得するには、大きさも減衰精度に影響します
、●直感的なデータは、ルックアップテーブルに格納されると、容易ではないながら、そう、私たちは減衰量を計算するために、他の数式を使用することはできません
が、これ以降方法はある程度の性能を向上させるため、これは点光源とスポットライトの減衰を計算するためにデフォルトユニティテクスチャルック・バイ・ピクセルの方法を使用することであるので、得られる効果は、ほとんどの場合に良好です。

光減衰テクスチャのための1.1

ユニティの質感は、減衰光と呼ばれる_LightTexture0を計算するために内部で使用されます。私たちは、光源にクッキーを使用する場合、なお、その後、減衰テクスチャルックアップは_LightTextureB0はあるが、ここではこのケースを議論することではありません。我々は通常のみテクスチャ色値_LightTexture0の対角に集中、これらの値は、空間内の異なる位置における点光源の減衰値を示します。例えば、(0,0)点光源の位置と減衰値の一致を示し、(1,1)、関心の空間における光の減衰点最遠点を示します。
_LightTexture0テクスチャサンプルの減衰値に点光源を得るためには、まず変換行列_LightMatrix0により得られる空間内の点光源の位置を取得する必要があります。我々はすでに_LightMatrix0は、光空間にワールド空間から頂点を変換することができます知っています。したがって、我々は唯一の光空間に対応する位置を乗じて得られる_LightMatrix0の頂点座標とワールド空間にする必要があります。

float3 lightCoord=mul(_LightMatrix0,float4(i.worldPosition,1)).xyz;

その後、我々は減衰値を得るために、この乗座標モード減衰テクスチャサンプリングを使用することができます。

fixed atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;

上記のコードで見つけることができ、我々は(ドット関数によって得られた)光源頂点距離二乗空間テクスチャサンプリングを用い、動作を規定するこの方法回避するので、サンプリング間隔値を使用する理由はありません。最後に、我々は、最終的な減衰値を得るために、成分の減衰減衰値が配置されているテクスチャを取得するには、マクロUNITY_ATTEN_CHANNELを使用しています。

1.2計算する数式を使用し

減衰量を計算する際に、テクスチャの複雑さを減衰させる方法を低減することができるが、時には我々が望む光、ソースコードの減衰の式を用いて計算することができます。例えば、次のコードでは、光源の線形減衰を計算することができます。

float distance = length(_WorldSpaceLightPos.xyz-i.worldPosition.xyz);
atten=1.0/distance;//linear attenuation

残念ながら、Unityが与えられていない命令が内蔵された文書の減衰量を計算します。時々シェーダ、開度情報に向かってスポットライトを取得し、したがって得られる効果ではない我々はまだフラグメントシェーダの減衰を計算するために、いくつかの数式を使用することができるが、しかし、我々は、内蔵光源の可変範囲を通過することができないので人々は、特に、突然変異が(オブジェクトが光源の照射範囲内にない場合、ユニティオブジェクトは追加のパスを実行していない、ためである)離れた被写体からの光源のとき照明範囲を発生し、作ることを意図しています。もちろん、私たちは、シェーダのための情報源を渡すために、スクリプトを使用することができますが、この柔軟性は非常に低いです。私たちは、ユニティの将来のバージョンのドキュメントを改善し、開発者へのより多くのパラメータを開発することができますことを楽しみにすることができます。

おすすめ

転載: www.cnblogs.com/xiegaosen/p/12004777.html