2017-09-22 16 views
0

こんにちは私は3つの距離の間でフェードしようとしています。たとえば、私はすべて同じシェーダと3種類のLODを使用する芝生システムを持っているので、3つの異なる距離をクロスフェードして、ポップインしないようにする必要があります。これが私のやり方です。HLSLシェーディングディスタンスフェードx3

float dist_near1 = 60; //farthest away from camera 
float dist_far1 = 110; //farthest away from camera 

float dist_near2 = 30; 
float dist_far2 = 70; 

float dist_near3 = 0 ; //Closest to camera 
float dist_far3 = 50 ; //Closest to camera 

float4 fading1 = 1-saturate((distance(Input.wpos,Input.cpos)-dist_near1)/(dist_far1-dist_near1)); 
float4 fading2 = fading1-saturate((distance(Input.wpos,Input.cpos)-dist_near2)/(dist_far2-dist_near2)); 
float4 fading3 = fading2-saturate((distance(Input.wpos,Input.cpos)-dist_near3)/(dist_far3-dist_near3)); 
float4 baseColour=tex2D(baseMap,Input.Texcoord); 


color = lerp(fading2,fading3,fading1); 

wpos = world position 

cpos = camera position. 

このコードは動作し、ちょうどそのはそれらを無視したり、上書きされたりなどの休息のためにカウントされませんdist_far3dist_near3からフェードインしていません。私は他の方法でもうまくいきませんでした。

+0

あなたが提供したコードで得られた結果を含めるようにしてください。 – sissy

+1

ああ、申し訳ありません、それはうまくいかず、dist_near3からdist_far3にフェードアウトするだけで、残りの部分は無視されたり上書きされたりしません。 – RattlerCreed

答えて

0
float3 ComputeWeights(float vMin, float vMid, float vMax, float val) 
{ 
    float wMinMid = (val - vMin)/(vMid - vMin); 
    float wMidMax = (val - vMid)/(vMax - vMid); 

    float kMinMid = 1 - step(1.0f, wMinMid); 
    float kMidMax = step(0.0f, wMidMax); 

    wMinMid = saturate(wMinMid); 
    wMidMax = saturate(wMidMax); 

    return float3 
    (
     (1 - wMinMid) * kMinMid, 
     wMinMid * kMinMid + (1 - wMidMax) * kMidMax, 
     wMidMax * kMidMax 
    ); 
} 

// ... 

float dist_near = distance(Input.wpos,Input.cpos); 

float3 weights = ComputeWeights(dist_near3, dist_near2, dist_near1, dist_near); 

float dist_far = dist_far3 * weights.x + dist_far2 * weights.y + dist_far1 * weights.z; 

なぜ私はこのような複雑なアプローチが必要なのかわかりませんが、上のコードは私にとってうまくいきます。

+0

乾杯しますが、私はこれをベーステクスチャにどのように追加しますか?申し訳ありませんが、私はちょっとシェイダー全体に新しいです。 – RattlerCreed