关于pssm的解释

1407 篇文章 2 订阅
1277 篇文章 12 订阅

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();
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值