`
yellowcxx
  • 浏览: 2557 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

HLSL Shading for 3dsMax 03 - Specular Lighting

阅读更多
Purpose:
Create a Shader to Implement the Phong and Blinn-Phong Specular Lighting.

Solution:
1.Study of the Phong Specular Lighting from <<Introduction to 3D Game Programming with DirectX 10>>



2.the Blinn Modification to Phong



the major different between Phong and Blinn is the H(Half) vector, Phong calculate reflectance between R and V, the Blinn calculate with H and N(Normal).

3.Shader Source


float4x4 wvp : WorldViewProjection <string UIWidget="None" ;>;
float4x4 w : World <string UIWidget="None";>;
float4x4 vi: ViewInverse <string UIWidget="None";>;

float4 LightPosition : POSITION
<
	string UIName="Light Position";
	string Object="PointLight";
	string Space="World";
	int refID=0;
	
> =float4(100,100,100,0);

float4 LightColor: LIGHTCOLOR
<
	int LightRef=0;
> =float4(1,1,1,0);

float Glossiness
<
	string UIName="Glossiness";
	int UIMin=1;
	int UIMax=99;
	int UIStep=1;
> = 0;

float SpecularLevel
<
	string UIName="Specular Level";
	int UIMin=0;
	int UIMax=99;
	int UIStep=1;
> = 0;

bool EnableSpecular
<
	string UIName="Enable Specular Lighting";
> = true;

struct VS_INPUT
{
	float4 Pos: POSITION;
	float4 Normal: NORMAL;
};

struct VS_OUTPUT
{
	float4 Pos : POSITION0;
	float3 L: TEXCOORD0;
	float3 N: TEXCOORD1;
	float3 V: TEXCOORD2;
};

VS_OUTPUT vs_main(VS_INPUT Input)
{
	VS_OUTPUT Result;
	Result.Pos = mul(Input.Pos,wvp);
	
	float3 worldPos=mul(Input.Pos,w);
	Result.L=LightPosition-worldPos;
	Result.N=mul(Input.Normal,w);
	Result.V=vi[3]-worldPos;
	
	return Result;
}

float4 ps_main(VS_OUTPUT Input):COLOR
{
	float3 N=normalize(Input.N);
	float3 L=normalize(Input.L);
	float3 V=normalize(Input.V);
	float3 H=normalize(L+V);
	
	float NdotL=max(0.0f,dot(N,L));
	float NdotH=max(0.0f,dot(H,N));
	
	float3 Diffuse=LightColor*NdotL;
	float3 Specular=EnableSpecular?Glossiness*pow(NdotH,SpecularLevel):0;
	
	return float4(Diffuse+Specular,1);
}

float4 ps_phong_main(VS_OUTPUT Input):COLOR
{
	float3 N=normalize(Input.N);
	float3 L=normalize(Input.L);
	float3 V=normalize(Input.V);
	float3 R=-reflect(L,N);
	
	float NdotL=max(0,dot(N,L));
	float RdotV=max(0,dot(R,V));
	
	float3 Diffuse=LightColor*NdotL;
	float3 Specular=EnableSpecular?Glossiness*pow(RdotV,SpecularLevel):0;
	return float4(Diffuse+Specular,1);
}

technique BlinnSpecular
{
	pass Blinn
	{
		VertexShader = compile vs_2_0 vs_main();
		PixelShader  = compile ps_2_0 ps_main();
	}
};

technique PhongSpecular
{
	pass Phong
	{
		VertexShader = compile vs_2_0 vs_main();
		PixelShader  = compile ps_2_0 ps_phong_main();
	}
};


4.Preview
Specular lighting disabled


Phong and Blinn compares
Phong


Blinn


Phong


Blinn


Phong


Blinn

  • 大小: 167.1 KB
  • 大小: 21.8 KB
  • 大小: 91 KB
  • 大小: 183.5 KB
  • 大小: 197.8 KB
  • 大小: 165.2 KB
  • 大小: 176 KB
  • 大小: 192.4 KB
  • 大小: 162.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics