//==================================================== // Parallax occlusion mapping //==================================================== // By EVOLVED // www.evolved-software.com //==================================================== //-------------- // un-tweaks //-------------- matrix WorldVP:WorldViewProjection; matrix World:World; matrix ViewInv:ViewInverse; //-------------- // tweaks //-------------- float3 Ambient={0.1f,0.1f,0.1f}; float3 LightPosition={150.0f,150.0f,0.0f}; float3 LightColor={1.0f,1.0f,1.0f}; float LightRange=1000.0f; float SpecularPow=16.0f; float Heightvec=0.01; float Biasheight=0.25; float4 FogColor={0.8f,0.8f,0.8f,1.0f}; float FogRange=52500.0f; float Alpha=1.0f; //-------------- // Textures //-------------- texture BaseTX ; sampler2D Base = sampler_state { texture = ; }; texture NormalTX ; sampler2D Normal = sampler_state { texture = ; }; texture HeightTX ; sampler2D Height = sampler_state { texture = ; }; //-------------- // structs //-------------- struct input { float4 Pos:POSITION; float2 UV:TEXCOORD; float3 Normal:NORMAL; float3 Tangent:TANGENT; float3 Binormal:BINORMAL; }; struct output { float4 OPos:POSITION; float2 Tex:TEXCOORD0; float3 LightVec:TEXCOORD1; float3 Attenuation:TEXCOORD2; float3 ViewVec:TEXCOORD3; float Fog:FOG; }; //-------------- // vertex shader //-------------- output VS(input IN) { output OUT; OUT.OPos=mul(IN.Pos,WorldVP); OUT.Tex=IN.UV; float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal}; TBN=transpose(mul(TBN,World)); float3 WPos=mul(IN.Pos,World); float3 LightPos=LightPosition-WPos; float3 ViewPos=ViewInv[3].xyz-WPos; OUT.LightVec=mul(LightPos,TBN); OUT.Attenuation=-LightPos/LightRange; OUT.ViewVec=mul(ViewPos,TBN); OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange)); return OUT; } //-------------- // pixel shader //-------------- float4 PS(output IN) : COLOR { float3 View=normalize(IN.ViewVec); float2 NewUv=IN.Tex; for(int i=0;i<8;i++) { float HeightTex=tex2D(Height,NewUv).x+Biasheight; NewUv +=(Heightvec*HeightTex-Heightvec)*View; } float4 Texture=tex2D(Base,NewUv); float3 NormalMap=tex2D(Normal,NewUv)*2-1; NormalMap=normalize(NormalMap); float3 LightV=normalize(IN.LightVec); float Normal=saturate(dot(reflect(-View,NormalMap),LightV)); Normal=pow(Normal,SpecularPow)+saturate(dot(NormalMap,LightV)); float PixelLight=1-saturate(dot(IN.Attenuation,IN.Attenuation)); float3 Light=PixelLight*LightColor; return float4(Texture*((Normal*Light)+Ambient),Texture.w*Alpha); } //-------------- // techniques //-------------- technique Parallax { pass p1 { vertexShader = compile vs_2_0 VS(); pixelShader = compile ps_2_a PS(); FOGCOLOR=(FogColor); FOGENABLE=FALSE; } }