关于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();
}
}
- 关于pssm的解释
- OcclusionQuery与pssm的共同使用
- 整合OGRE的地形和PSSM+LiSPSM阴影算法
- 整合OGRE的地形和PSSM+LiSPSM阴影算法
- 整合OGRE的地形和PSSM+LiSPSM阴影算法
- 整合OGRE的地形和PSSM+LiSPSM阴影算法
- 关于serialVersionUID的解释
- 关于Session的解释
- 关于serialVersionUID的解释
- 关于serialVersionUID的解释
- 关于serialVersionUID的解释
- 关于serialVersionUID的解释
- 关于"^"号的解释
- 关于innerhtml的解释
- 关于serialVersionUID的解释
- 关于Qname的解释
- 关于__iomem的解释
- 关于MET的解释
- MTK的编译过程
- AutoCAD .NET API基础(一) AutoCAD 对象层次结构(2)
- ioctl函数详解
- Layered-->Variance-->Shadow Map
- AfxMessageBox问题
- 关于pssm的解释
- 逐行分析u-boot
- Axis2调用使用DataHandler传递字节数组
- 读写器IC--POWERBUILD例子代码
- PHP实现URL静态化
- 框架分层
- stagefright + omx小结
- Perl语言简介
- 如何解决Flickr看不到图片的问题