|
|

楼主 |
发表于 2007-1-30 00:35:00
|
显示全部楼层
Re:pencil sketch shading
你是?要用projective texture的技?去??D??
?是我目前的Shader Code
float4x4 matWorldViewProj;
float4x4 matWorld;
float4x4 ProjTextureMatrix;
float4 vecLightDir;
float4 vecEye;
float4 vecProjDir;
texture ProjTexMap;
sampler ProjTexMapSampler = sampler_state
{
Texture = < rojTexMap>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = clamp;
AddressV = clamp;
AddressW = clamp;
};
// -------------------------------------------------------------
// Output channels
// -------------------------------------------------------------
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 Light : TEXCOORD0;
float3 Norm : TEXCOORD1;
float3 View : TEXCOORD2;
};
// -------------------------------------------------------------
// Output channels
// -------------------------------------------------------------
struct VS_OUTPUTPROJTEX
{
float4 Pos : POSITION;
float4 Norm : TEXCOORD0;
float4 Tex : TEXCOORD1;
float4 Proj : TEXCOORD2;
};
// -------------------------------------------------------------
// vertex shader function (input channels)
// -------------------------------------------------------------
VS_OUTPUT VS(float4 Pos : POSITION, float3 Normal : NORMAL)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
Out.Pos = mul(Pos, matWorldViewProj); // transform Position
Out.Light = vecLightDir; // L
float3 PosWorld = normalize(mul(Pos, matWorld));
Out.View = vecEye - PosWorld; // V
Out.Norm = mul(Normal, matWorld); // N
return Out;
}
// -------------------------------------------------------------
// vertex shader function (input channels)
// -------------------------------------------------------------
VS_OUTPUTPROJTEX VSProjTexture(float4 Pos : POSITION, float3 Normal : NORMAL)
{
VS_OUTPUTPROJTEX Out = (VS_OUTPUTPROJTEX)0;
Out.Pos = mul(Pos, matWorldViewProj); // transform Position
Out.Tex = mul(Pos, ProjTextureMatrix); // project texture coordinates
float4 PosWorld = normalize(mul(Pos, matWorld)); // vertex in world space
Out.Norm = normalize(mul(Normal, matWorld)); // normal in world space
Out.Proj = PosWorld - normalize(vecProjDir); // projection vector in world space
return Out;
}
// -------------------------------------------------------------
// Pixel Shader (input channels) utput channel
// -------------------------------------------------------------
float4 PS(float3 Light: TEXCOORD0, float3 Norm : TEXCOORD1, float3 View : TEXCOORD2) : COLOR
{
float4 diffuse = { 1.0f, 0.0f, 0.0f, 1.0f};
float4 ambient = {0.1, 0.0, 0.0, 1.0};
float3 Normal = normalize(Norm);
float3 LightDir = normalize(Light);
float3 ViewDir = normalize(View);
float4 diff = saturate(dot(Normal, LightDir)); // diffuse component
// compute self-shadowing term
float shadow = saturate(4* diff);
float3 Reflect = normalize(2 * diff * Normal - LightDir); // R
float4 specular = pow(saturate(dot(Reflect, ViewDir)), 8); // R.V^n
// I = ambient + shadow * (Dcolor * N.L + (R.V)n)
return ambient + shadow * (diffuse * diff + specular);
}
// -------------------------------------------------------------
// Pixel Shader (input channels):output channel
// -------------------------------------------------------------
float4 PSProjTexture(float4 Norm : TEXCOORD0, float4 Tex: TEXCOORD1, float4 Proj : TEXCOORD2) : COLOR
{
float3 Normal = {Norm.x,Norm.y,Norm.z};
float LdotN = dot(Normal, normalize(vecLightDir)); // diffuse component
float factor;
if (LdotN<0.25f)
factor=0.75f;
else if (LdotN<0.50f)
factor=0.5f;
else if (LdotN<0.75f)
factor=0.25f;
else
factor=0.0f;
Tex.y=Tex.y/4+factor;
if (dot(Proj, Norm) <= 0.1)
return Tex.w < 0.0 ? 0.0 : tex2Dproj(ProjTexMapSampler, Tex);
else
return 1.0;
}
// -------------------------------------------------------------
//
// -------------------------------------------------------------
technique TShader
{
pass P0
{
// compile shaders
VertexShader = compile vs_1_1 VS();
PixelShader = compile ps_2_0 PS();
}
pass P1
{
Sampler[0] = (ProjTexMapSampler);
// enable alpha blending
AlphaBlendEnable = TRUE;
SrcBlend = ZERO;
DestBlend = SRCCOLOR;
// compile shaders
VertexShader = compile vs_1_1 VSProjTexture();
PixelShader = compile ps_2_0 PSProjTexture();
}
} |
|