2013-04-26 41 views
1

我想複製BasicEffect的fog方法以在我自己的着色器中使用,所以我不必聲明basiceffect着色器和我自己的。基本效果的HLSL代碼剛剛在XNA Creators Club上的一個可下載樣本中發佈,我認爲所需的方法可以在該HLSL文件中找到。但是,我所看到的只是一個被調用的函數,但沒有針對該函數的實際定義。被調用的函數是:BasicEffect霧,使用的代碼

ApplyFog(color, pin.PositionWS.w); 

有沒有人知道定義在哪裏以及它是否可以自由接受。否則,關於如何複製效果的任何幫助都會很好。

我從here下載了樣本。

enter image description here

謝謝。

編輯:斯蒂爾有問題。認爲這是與深度有關:

VertexToPixel InstancedCelShadeVSNmVc(VSInputNmVc VSInput, in VSInstanceVc VSInstance) 
{ 
    VertexToPixel Output = (VertexToPixel)0; 
    Output.Position = mul(mul(mul(mul(VSInput.Position, transpose(VSInstance.World)), xWorld), xView), xProjection); 
    Output.ViewSpaceZ = -VSInput.Position.z/xCameraClipFar; 

這是正確的嗎?遠處的相機剪輯作爲常量傳入。

+0

你可以發佈什麼效果的圖像? – 2013-04-26 15:21:42

+0

BasicEffect的霧是你的意思嗎? – Bushes 2013-04-26 15:22:42

+0

是的,或者任何能夠說明您正在嘗試完成的效果的東西,我不熟悉BasicEffect的Fog。 – 2013-04-26 15:23:21

回答

0

繼承人如何實現類似的效果

在你的Vertex Shader功能相關的例子,你通過viewspace Z位置,你farplane的距離劃分,讓你一個不錯的0..1映射你的深度值。

比,在你pixelshader,使用線性插值功能,您原來的顏色值之間進行混合,並fogcolor,繼承人一些(僞)代碼:

cbuffer Input //Im used to DX10+ remove the cbuffer for DX9 
{ 
    float FarPlane; 
    float4 FogColor; 
} 

struct VS_Output 
{ 
    //...Whatever else you need 
    float ViewSpaceZ : TEXCOORD0; //or whatever semantic you'd like to use 
} 


VS_Output VertexShader(/*Your Input Here */) 
{ 
    VS_Output output; 
    //...Transform to viewspace 
    VS_Output.ViewSpaceZ = -vsPosition.Z/FarPlane; 

    return output; 
} 

float4 PixelShader(VS_Output input) : SV_Target0 // or COLOR0 depending on DX version 
{ 
    const float FOG_MIN = 0.9; 
    const float FOG_MAX = 0.99; 
    //...Calculate Color 
    return lerp(yourCalculatedColor, FogColor, lerp(FOG_MIN, FOG_MAX, input.ViewSpaceZ)); 
} 

我從頂部開始寫這我的頭,希望它有幫助。 我選擇的常量會給你一個相當「陡峭」的霧,爲FOG_MIN選擇一個較小的值以獲得更平滑的霧。

+0

對,我會放棄,謝謝。 – Bushes 2013-04-26 16:36:18

+0

讓我知道它是否工作;) – 2013-04-26 16:43:11

+0

好吧,試圖用我現有的着色器代碼實現這一點後,我似乎仍然有問題。基本上,一切似乎都在繪製霧的顏色。我認爲這架遠機是爲了成爲相機的剪裁平面? – Bushes 2013-04-26 17:30:36