关于pssm的解释

来源:互联网 发布:武汉有编程学 编辑:程序博客网 时间:2024/06/04 08:40

this is pssm code

// Shader global data

float4x4 viewProjection;
float4x4 world;
float3 lightDirection;
float3 lightColor;
float3 ambientColor;
float shadowMapSize;
float4x4 shadowMapMatrix;

texture shadowTexture;

sampler2D shadowMapSampler = sampler_state
{
Texture = <shadowTexture>;
MinFilter = Point;
MagFilter = Point;
MipFilter = None;
AddressU = Border;
AddressV = Border;
BorderColor = 0xFFFFFFFF;
};

texture objectTexture;

sampler2D objectTextureSampler = sampler_state
{
    Texture = <objectTexture>;
    MinFilter = Anisotropic;
    MagFilter = Anisotropic;
    MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};


// --- Render Shadow Map Technique ---


void VS_RenderShadowMap(float4 pos : POSITION, out float4 outPos : POSITION, out float3 outPixelPos : TEXCOORD0)
{
float4 posWorld;

posWorld = mul(pos, world);           
outPos = mul(posWorld, viewProjection);

outPixelPos = outPos.xyz;
}


float4 PS_RenderShadowMap(float3 pixelPos : TEXCOORD0): COLOR
{
// write z coordinate to texture
return pixelPos.z;
}


technique RenderShadowMap
{
pass p0
{
CullMode = CW; 
VertexShader = compile vs_2_0 VS_RenderShadowMap();
PixelShader = compile ps_2_0 PS_RenderShadowMap();
}
}


// --- Render Shadowed Geometry Technique ---


void VS_Shadowed(in float4 pos : POSITION, in float3 normal : NORMAL,
float2 texCoord : TEXCOORD0,
out float4 outPos : POSITION,
out float2 outTexCoord : TEXCOORD0,
out float4 outShadowTexCoord : TEXCOORD1,
out float3 outDiffuse : COLOR0)
{
float4 posWorld;
 
posWorld = mul(pos, world);         
outPos = mul(posWorld, viewProjection);
 
outDiffuse = lightColor * saturate(dot(-lightDirection, normal));

outShadowTexCoord = mul(posWorld, shadowMapMatrix);
 
outTexCoord = texCoord;
}


float4 PS_Shadowed(float2 texCoord : TEXCOORD0, float4 shadowTexCoord : TEXCOORD1,
float4 diffuse : COLOR0) : COLOR
{
float texelSize = 1.0f / shadowMapSize;

shadowTexCoord.xy /= shadowTexCoord.w;
 
float4 shadow;

shadow[0] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord).r);
shadow[1] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord + float2(texelSize, 0)).r);
shadow[2] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord + float2(0, texelSize)).r);
shadow[3] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord + float2(texelSize, texelSize)).r);

float2 lerpFactor = frac(shadowMapSize * shadowTexCoord);

float lightingFactor = lerp(lerp(shadow[0], shadow[1], lerpFactor.x),
                                lerp(shadow[2], shadow[3], lerpFactor.x),
                                lerpFactor.y);

diffuse *= lightingFactor;

float4 outColor = 1;

outColor.rgb = tex2D(objectTextureSampler, texCoord) * saturate(ambientColor + diffuse).rgb;

return outColor;
}


technique Shadowed
{
pass p0
{
CullMode = CCW;
VertexShader = compile vs_2_0 VS_Shadowed();
PixelShader = compile ps_2_0 PS_Shadowed();
}
}
 
PSSM (Parallel Split Shadow Maps) is a method to split the shadow area into subshadow maps so the resolution of the shadow maps is used more effectively.

VSM (Variance Shadow Map) is a method for calculating shadows based on probability equations. The benefit of this method is that a shadow map can be filtered and blurred before the shadow comparison takes place. This is great for soft shadow but unfortunately it suffers from 'shadow leakage' which means that in certain areas artifacts apear. These artifacts are caused by the underlying probablity calculations. 
 
转自(http://forum.quest3d.com/index.php?topic=65966.0
参与计算的光线方向是,实际lightdir的反方向,从物体指向灯光——outDiffuse = lightColor * saturate(dot(-lightDirection, normal));
 
outShadowTexCoord = mul(posWorld, shadowMapMatrix); 这几是错的?没见到传入Marix参数  !全局的!
shadowTexCoord 是float4的
 
float4 PS_Shadowed(float2 texCoord : TEXCOORD0, float4 shadowTexCoord : TEXCOORD1,
float4 diffuse : COLOR0) : COLOR
{
float texelSize = 1.0f / shadowMapSize;     

shadowTexCoord.xy /= shadowTexCoord.w;
 
float4 shadow;//float4的定义方式

用Z和取样后的红色对比如果小于则存储在shadow[0] 
float2 shadowTexCoord 和float4 做加法????分别是 x   y  xy 三种偏移上一种是无偏移
这一段才是关键——————————————————————————————————————————
shadow[0] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord).r);
shadow[1] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord + float2(texelSize, 0)).r);
shadow[2] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord + float2(0, texelSize)).r);
shadow[3] = (shadowTexCoord.z < tex2D(shadowMapSampler, shadowTexCoord + float2(texelSize, texelSize)).r);
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
float2 lerpFactor = frac(shadowMapSize * shadowTexCoord);
//FRAC(A) Calculates the values after the decimal point. Example: FRAC(1.2112) 取小数部分

float lightingFactor = lerp(lerp(shadow[0], shadow[1], lerpFactor.x),
                                lerp(shadow[2], shadow[3], lerpFactor.x),
                                lerpFactor.y);
//好长的lerp;lerpFactor = frac(shadowMapSize * shadowTexCoord);
diffuse *= lightingFactor;

float4 outColor = 1;
//初始为白色
outColor.rgb = tex2D(objectTextureSampler, texCoord) * saturate(ambientColor + diffuse).rgb;

return outColor;
}


technique Shadowed
{
pass p0
{
CullMode = CCW;
VertexShader = compile vs_2_0 VS_Shadowed();
PixelShader = compile ps_2_0 PS_Shadowed();
}
}


原创粉丝点击