Code Snippet : Fog Shader


In this code snippet we are going to show some simple ways to create a fog like effect in 3D games.
The fog effect is a post process (operates on a full screen quad) that recieves the framebuffer texture (the one with the game rendered content) and a depth texture as main parameters.
The depth texture (used normally in deferred shading) contains the post projected Z/W coordinate of all objects (the Z buffer content actually =P).


To generate it, you can use the following shader in all objects of your scene (prefer rendering it to a single 32 bits texture for better precision)

float4x4 WVP;

struct VertexToPixel
{
	half4 Position		: POSITION;
	half2 ScreenPos			: TEXCOORD0;
};
struct PixelToFrame
{
	half4 Color 			: COLOR0;
};

VertexToPixel MyVertexShader(half4 inPos: POSITION0)
{
	VertexToPixel Output = (VertexToPixel)0;
	Output.Position = mul(inPos, WVP);
	Output.ScreenPos = Output.Position .zw;
	return Output;	

}

PixelToFrame MyPixelShader(VertexToPixel PSIn) : COLOR0
{
	PixelToFrame Output = (PixelToFrame)0;
	Output.Color = PSIn.ScreenPos.x/PSIn.ScreenPos.y;
	return Output;
}

technique Depth
{
	pass Pass0
    {
    	VertexShader = compile vs_2_0 MyVertexShader();
        PixelShader  = compile ps_2_0 MyPixelShader();
    }
}

It just output the z/w of each rendered “pixel”. The post process shader that creates the fog effect is:

float2 halfPixel;
float dz;
float4x4 InvertViewProjection;
float3 cameraPosition;
float far;
float near;
float3 fcolor = {0.5, 0.5, 0.5};

texture cena;
sampler cenaSampler = sampler_state
{
   Texture = ;
   AddressU  = Clamp;
   AddressV  = Clamp;
};

texture depth;
sampler depthSampler = sampler_state
{
   Texture = ;
   MinFilter = POINT;
   MagFilter = POINT;
   MipFilter = POINT;
   AddressU  = Clamp;
   AddressV  = Clamp;
};
struct VertexShaderOutput
{
    float4 Position : POSITION0;
    float2 TexCoord : TEXCOORD0;
};
VertexShaderOutput VShader( float4 Pos: POSITION, float2 Tex : TEXCOORD)
{
	VertexShaderOutput output;
	Pos.x =  Pos.x - 2*halfPixel.x;
	Pos.y =  Pos.y + 2*halfPixel.y;
    output.Position = float4(Pos);
    output.TexCoord = Tex;
    return output;
}

float4 Pshader(VertexShaderOutput input) : COLOR
{
    float depthVal = tex2D(depthSampler,input.TexCoord).r;
    float3 cen = tex2D(cenaSampler ,input.TexCoord );

    //compute screen-space position
    float4 position;
    position.x = input.TexCoord.x * 2.0f - 1.0f;
    position.y = -(input.TexCoord.x * 2.0f - 1.0f);
    position.z = depthVal;
    position.w = 1.0f;
    //transform to world space
    position = mul(position, InvertViewProjection);
    position /= position.w;

	float d = length(position - cameraPosition);
	float l = saturate((d-near)/(far-near));
    return float4(lerp(cen,fcolor, l),1);
}

float4 PixelShaderExponencial(VertexShaderOutput input) : COLOR
{
    float depthVal = tex2D(depthSampler,input.TexCoord).r;
    float3 cen = tex2D(cenaSampler ,input.TexCoord );

    //compute screen-space position
    float4 position;
    position.x = input.TexCoord.x * 2.0f - 1.0f;
    position.y = -(input.TexCoord.y * 2.0f - 1.0f);
    position.z = depthVal;
    position.w = 1.0f;
    //transform to world space
    position = mul(position, InvertViewProjection);
    position /= position.w;

	float d = length(position - cameraPosition);
	float l = exp(-d * dz);
	l = saturate(1 - l);

    return float4(lerp(cen,fcolor, l),1);
}

float4 PixelShaderExponencialSquared(VertexShaderOutput input) : COLOR
{
    float depthVal = tex2D(depthSampler,input.TexCoord).r;
    float3 cen = tex2D(cenaSampler ,input.TexCoord );

    //compute screen-space position
    float4 position;
    position.x = input.TexCoord.x * 2.0f - 1.0f;
    position.y = -(input.TexCoord.y * 2.0f - 1.0f);
    position.z = depthVal;
    position.w = 1.0f;
    //transform to world space
    position = mul(position, InvertViewProjection);
    position /= position.w;

	float d = length(position - cameraPosition);
	float l = exp( - pow( d * dz , 2 ) );
	l = saturate(1 - l);

    return float4(lerp(cen,fcolor, l),1);
}

technique FogShader
{
	pass P0
	{
		VertexShader = compile vs_3_0 VShader();
		PixelShader = compile ps_3_0 Pshader();
	}
}

technique FogExponencialSquaredShader
{
	pass P0
	{
		VertexShader = compile vs_3_0 VShader();
		PixelShader = compile ps_3_0 PixelShaderExponencialSquared();
	}
}

technique FogExponencialShader
{
	pass P0
	{
		VertexShader = compile vs_3_0 VShader();
		PixelShader = compile ps_3_0 PixelShaderExponencial();
	}
}

The idea is very simple and naive, we just blend the scene color with the fog color using the scene distance (from depth texture) as a control parameter.
All the parameter used in the shaders are self explanatory (camera position, near plane, far plane …..). The only strange one is the dz (density) that we normally set to 0.001f.
The halfpixel is a directx 9c stuff (correction needed because of the directx rasterizer algorithm, in directx > 9c, this is not needed) and can be calculated in the following way (in XNA):

 Vector2 halfPixel = new Vector2()
            {
                X = 0.5f / (float)game.GraphicsDevice.PresentationParameters.BackBufferWidth,
                Y = 0.5f / (float)game.GraphicsDevice.PresentationParameters.BackBufferHeight
            };
           

We showed three ways of doing this (normal, exponencial and exponencial squared), you can choose each of then according with you quality/speed trade off.

, , ,

  1. #1 by supersmashflash4 on 16 de janeiro de 2017 - 6:01 pm

    Whoah this blog is wonderful i love reading your articles. Keep up the good paintings! You realize, lots of individuals are searching around for this information, you can help them greatly.

    http://www.journalhome.com/supersmash4flash

  2. #2 by MarciaErurl on 16 de janeiro de 2017 - 6:02 pm

    free homework questions
    fresher resume for lecturer post in engineering college

    http://www.heshevideos.com/cgi-bin/atx/out.cgi?id=117&tag=top&trade=http://uchopia.xyz

  3. #3 by Car Insurance Quotes Online on 16 de janeiro de 2017 - 6:05 pm

    well my friend produced a blog page and this individual won’t let me see what his blog can be until he finishes every thing with it. So i was wondering if there was a method to find someone else’s blogger with their email address. Anybody could show me how. thatd be great thanks!.

  4. #4 by insurance RATINGs on 16 de janeiro de 2017 - 8:57 pm

    I have been exploring for a little bit for any high quality articles or blog posts on this sort of area . Exploring in Yahoo I at last stumbled upon this web site. Reading this information So i’m happy to convey that I have an incredibly good uncanny feeling I discovered exactly what I needed. I most certainly will make sure to do not forget this website and give it a look on a constant basis.

  5. #5 by guexhdh on 16 de janeiro de 2017 - 9:14 pm

    Windowsで快適に読めるようになりました。 評判のレビューが多い「中古ノートパソコン」の一覧パソコン工房で購入したノートパソコンパソコン工房で購入したノートパソコン《最低限おさえておきたいスペック》最低限これぐらいはおさえておきたいというのはこのようなところでしょうか。 [url=http://casamira.be/xxio7/irons_1/index.html]xxio 7 ドライバー 口コミ[/url]
    1年ごと契約のOffice 365だと、最新版のOfficeと1TBのクラウドストレージがWindowsとMacの両方で使えるので、これにしようか?(安くはないが、メリットが大きそう。 ***【事務系のお仕事一覧】マーケティング商品企画営業企画販売事業支援アフターサービスプロジェクトマネジメント海外事業体支援(他には、海外事業推進、海外事業支援という名称も)渉外経理財務人事企業法務物流企画生産企画資材・部品調達原価企画下は、一部の職種の業務内容を書いてみました。
    [url=http://neuralvitalitynetworks.com/regular/ap2_1/index.html]タイトリスト ニュー アイアン[/url] 万一、Windows 8.1 の操作に迷った時でも「ソフト&サポートナビゲーター」を起動し、目的に合ったアプリを探してすぐに使えるので安心です。 この頃はアイアンがMP-68&MP-64とJPXを使い分けてたけど、MP-64の#3のロフトが21°、JPXの#4が22°で、この時期はFWを#3だけにしてたので、その#3が15°であるわけで、そのつなぎとするには18°とか19°が必要。
    [url=http://csuniformes.com.br/csunigolf/csunigolf_1/index.html]golfoffjp.com[/url]
    そしたら昨日、突然、ワードとパワーポイントの動作が停止するトラブルが発生しました。 SurfaceRTの代替として購入した台湾ASUS 社のTransBook T100TAF不満なく使い始めましたが、Microsoft社のOffice2013のソフトが入っていなくてその代替でKINGSOFT社のOffice30日間体験版が入っていました。 [url=http://shop.maremmavignamia.com/shopgolf/shopgolf_1/index.html]golfoffjp.com[/url]
    太陽光で発電した電力を使って、水を電気分解して水素を製造するシステムである。  燃料電池車(FCV)は車に充填した水素と空気中の酸素を化学反応させて発電した電気で走る車で、走行中に二酸化炭素を排出しない。
    [url=http://twilightexpress.moe2.org/ping/g25_1/index.html]ピン ラプチャー ドライバー[/url] (金丸信 元副総理、望月幸明 元知事が誘致、発明者 ノーベル藤本(大衆ノーベル賞など受賞)、Y系(イットリウム、バリウム、銅酸化物 組成1、2、3)・(ランタン、バリウム、銅酸化物の超伝導も同時発明)・鉄系高温超伝導などの世界で最初の発明者。 でもどうせ、またそちらに向かうのだしと思い、溜息と共に、すぐ行きますと伝え、電話を切った。
    [url=http://toastthecoast.com.au/plann/taylo_1/index.html]テーラーメイド rbz2[/url]

  6. #6 by Jasonfuh on 16 de janeiro de 2017 - 10:56 pm

    [url=http://fun-bikes.ru/g5902913-kvadrotsikly-detskie]купить детский квадроцикл[/url] – купить квадроцикл

  7. #7 by RichardEMECY on 16 de janeiro de 2017 - 11:05 pm

    Предлагаем полностью готовое решение/We offer cracked ENGGEO 4.4 ВСЕ МОДУЛИ (CRACK – Dongle emulator/Custom license/Patch). Полная поддержка наших решений. Тестирование перед оплатой/Full support for our solutions. Testing before payment. Контакты/Contacts: nodongle24 /@/ gmail.com (remove spaces and /)

    Guardant Stealth II Dongle Emulator, Marx CrypToken Dongle Emulator, Usb Massstorade Dongle Emulator, Actikey Dongle Emulator, ROCKEY 5 Dongle Emulator, Sentinel C Plus Dongle Emulator, Sentinel Scout Dongle Emulator, Wi3p Dongle Emulator, ROCKEY 5 Dongle Emulator, Sentinel C Plus Dongle Emulator, Smartkey Eutron Usbdl Dongle Emulator, Guardant Code Time Dongle Emulator, P-Sea Aka Unikey Dongle Emulator, Enky Sl Hid Dongle Emulator, download.

  8. #8 by best g spot toy on 16 de janeiro de 2017 - 11:07 pm

    Here are some of the web pages we suggest for our visitors

  9. #9 by car insurance quotes online compare on 16 de janeiro de 2017 - 11:23 pm

    This is really interesting, You’re a very skilled blogger. I have joined your feed and look forward to seeking more of your excellent post. Also, I’ve shared your site in my social networks!

  10. #10 by coreybt on 16 de janeiro de 2017 - 11:27 pm

    嬉しいことに、El Capitanのベータ版を使ってみると、かなり改善したような気がする。 「あんた、何の仕事してるのよ!」って言われて初めて気が付いたの。 [url=http://karnij.com/smf/index.php/topic,270815.0.html]office2016 プロダクト キー[/url]
    OS XとLinuxでWindowsプログラムを実行する 一部のMacやLinuxシステムでWindowsアプリケーションを実行したい企業には、無料のオープンソースプログラム「Wine」が役に立つだろう。 撮影初日は4月9日 下記の画像は撮影開始5枚目です(1枚目~4枚目は試し撮りの室内やピンぼけロジェなどでした)。
    [url=http://fmcorner.com/forum/viewtopic.php?f=5&t=690816&sid=775a5e1e3cd7df9d90735de7f391cb5c]office2013 プロダクト キー[/url] 9回にも内川の適時打で日本ハムに6-4で勝ちました。    「オプション」または「重要」をクリックし、   「Windows 10 Home、バージョン1511、10586にアップグレード」   または「Windows 10 Pro、バージョン 1511、10586にアップグレード」   のチェックを外します。
    [url=http://202.143.141.248/nayear/index.php?topic=477583.0]windows 7 アップデート[/url]
    デスクトップ型PCとノート型PC、いずれも業者の方にOS再セットアップ作業、Windows10へ移行、ドライバー設定等々の作業をして頂き、2台とも気持ちよく作動するようになりました。 Windows環境でMacやLinux端末を管理できるよう、CentrifyやBeyondTrustなどサードパーティー各社が、Active Directoryとの連係が可能な製品を提供している。 [url=http://namazu.twiple.jp/forum/viewtopic.php?pid=114430#p114430]microsoft excel 価格[/url]
    最後は2セルだったのですが、本当に良い感じ。  ワードとエクセルのMOS検定には合格したけれど、就職に有利になるかどうかは微妙なところ。
    [url=http://s1.zetaboards.com/BCA_UK/topic/8046572/1/]office personal 2010 ダウンロード 版[/url] 共有フォルダが使用できないことを発見し、 パスワードが間違っていることを示すエラーメッセージを受け取ります。 実店舗からOfficeをダウンロードや購入して良いし、オンラインからoffice 2016プロフェッショナルを購入して良いです。
    [url=http://s1.zetaboards.com/BCA_UK/topic/8046572/1/]produkey office 2010[/url]

  11. #11 by android games for pc download on 17 de janeiro de 2017 - 12:28 am

    Hello there! This is my first comment here so I just wanted to give a quick shout out and tell you I genuinely enjoy reading through your blog posts. Can you suggest any other blogs/websites/forums that cover the same subjects? Thanks!

  12. #12 by Jarrednut on 17 de janeiro de 2017 - 12:40 am

    [url=http://crazy-girl-hd.com/porn-foto/2852-pornuha-v-fotografiyah-minet-ot-devochek.html]замечательное с девушками[/url]

  13. #13 by SarahHeisp on 17 de janeiro de 2017 - 1:01 am

    free essay rational emotive behavior therapy
    free emily dickinson research paper

    http://www.accessup-club.com/cgi-bin/yomi-search/rank.cgi?mode=link&id=3015&url=http://fivepath.us

  14. #14 by android games free download on 17 de janeiro de 2017 - 1:04 am

    Good blog! I really love how it is simple on my eyes and the data are well written. I’m wondering how I might be notified whenever a new post has been made. I’ve subscribed to your feed which must do the trick! Have a nice day!

  15. #15 by how to anal on 17 de janeiro de 2017 - 2:21 am

    here are some links to web pages that we link to mainly because we feel they’re worth visiting

  16. #16 by самолетни билети мюнхен софия on 17 de janeiro de 2017 - 4:42 am

    The next time I read a blog, I hope that it doesnt disappoint me as much as this one. I mean, I know it was my choice to read, but I actually thought youd have something interesting to say. All I hear is a bunch of whining about something that you could fix if you werent too busy looking for attention.

1 151 152 153
(não será publicado)