www.pudn.com > packmk2.rar > v2_normalmapgen.fx


	// oi oi 
 
float	inv_mapsize_x,inv_mapsize_y; 
float4	corner00, corner01, corner10, corner11; 
float	amplitude; 
 
struct VS_INPUT 
{ 
    float3  Pos     : POSITION; 
    float2  tc     : TEXCOORD0; 
}; 
 
struct VS_OUTPUT 
{ 
	float4  Pos			: POSITION; 
	float2	tc			: TEXCOORD0; 
	float3  tc_p_dx		: TEXCOORD1; 
	float3  tc_p_dy		: TEXCOORD2; 
	float3  tc_m_dx		: TEXCOORD3; 
	float3  tc_m_dy		: TEXCOORD4; 
}; 
 
texture hmap; 
 
// samplers 
sampler hsampler = sampler_state  
{ 
	texture = ; 
	AddressU  = WRAP;		 
	AddressV  = WRAP; 
	MIPFILTER = NONE; 
	MINFILTER = LINEAR; 
	MAGFILTER = LINEAR; 
}; 
 
/*float4 calc_worldpos(float2 uv) 
{	 
	float4	origin = float4(uv.xy,-1,1); 
    float4	direction = float4(uv.xy,1,1); 
     
    origin	  = mul(origin, mProjector); 
    direction = mul(direction, mProjector) - origin;  
     
    float	l = -origin.y / direction.y; 
     
    float4 worldPos = origin + direction*l; 
    worldPos /= worldPos.w; 
	return worldPos; 
}*/ 
 
 
VS_OUTPUT VShader(VS_INPUT i) 
{ 
	VS_OUTPUT o; 
	o.Pos = float4( i.tc.x*2-1,1-i.tc.y*2, 0, 1 ); 
	float scale = 1; 
	float2 tc = i.tc + float2(-inv_mapsize_x*scale,0); 
	float4 meh = lerp(lerp(corner00,corner01,tc.x),lerp(corner10,corner11,tc.x),tc.y); 
	o.tc_m_dx = meh.xyz/meh.w; 
	 
	tc = i.tc + float2(+inv_mapsize_x*scale,0); 
	meh = lerp(lerp(corner00,corner01,tc.x),lerp(corner10,corner11,tc.x),tc.y); 
	o.tc_p_dx = meh.xyz/meh.w; 
	 
	tc = i.tc + float2(0,-inv_mapsize_y*scale); 
	meh = lerp(lerp(corner00,corner01,tc.x),lerp(corner10,corner11,tc.x),tc.y); 
	o.tc_m_dy = meh.xyz/meh.w; 
	 
	tc = i.tc + float2(0,inv_mapsize_y*scale); 
	//meh = (1-tc.y)*(corner00*(1-tc.x) + corner01*tc.x) + tc.y*(corner10*(1-tc.x) + corner11*tc.x); 
	meh = lerp(lerp(corner00,corner01,tc.x),lerp(corner10,corner11,tc.x),tc.y); 
	o.tc_p_dy = meh.xyz/meh.w; 
 
	o.tc = i.tc; 
	 
	return o; 
} 
 
 
float4 PShader(VS_OUTPUT i) : COLOR 
{	 
	float2	dx = {inv_mapsize_x,0}, 
			dy = {0,inv_mapsize_y}; 
	i.tc_p_dx.y = amplitude*tex2D(hsampler, i.tc+dx); 
	i.tc_m_dx.y = amplitude*tex2D(hsampler, i.tc-dx); 
	i.tc_p_dy.y = amplitude*tex2D(hsampler, i.tc+dy); 
	i.tc_m_dy.y = amplitude*tex2D(hsampler, i.tc-dy); 
	//return float4(0.5+0.5*i.tc_p_dx,1); 
	float3 normal = normalize(-cross(i.tc_p_dx-i.tc_m_dx, i.tc_p_dy-i.tc_m_dy)); 
	return float4(0.5+0.5*normal,1); 
} 
 
technique T0 
{ 
	pass P0 
	{ 
		vertexshader = compile vs_2_0 VShader(); 
		pixelshader = compile ps_2_0 PShader();   
	} 
}