游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3086|回复: 7

tonykee的能穿透alphatest纹理的shadowmap 出现些问题

[复制链接]

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
发表于 2010-8-16 10:40:00 | 显示全部楼层 |阅读模式
透明的地方,出来阴影,阴影的地方反而没有

文件和图
float4x4 g_mViewProj;
float4x4 g_mWorld;


struct Mtrl
{
        float4 ambient;
        float4 diffuse;
        float4 spec;
        float  specPower;
};
float4 pack(float fDist)
{
const float4 bitSh = float4(   256*256*256, 256*256,   256,         1);
const float4 bitMsk = float4(   0,      1.0/256.0,    1.0/256.0,    1.0/256.0);
float4 comp;
comp = fDist * bitSh;
comp = frac(comp);
comp -= comp.xxyz * bitMsk;
return float4(comp.x, comp.y, comp.z, comp.w);
}


float unpack(sampler2D ShadowMapS, float2 texcood)
{
       const float4 bitShifts = float4(1.f/(256.f*256.f*256.f), 1.f/(256.f * 256.f), 1.f/256.f, 1.f);
        float4 vec = tex2D(ShadowMapS, texcood);
        return dot(vec.xyzw , bitShifts);
}


inline float texFloat(sampler2D tex, float2 texCood)
{
  return unpack(tex, texCood);

}

//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////

float3 g_vLightDir;
float3 g_vLightColor;
float3 g_vAmbient;
float g_fShadowMapSize;
float g_fShadowMapTexelSize;
static const int g_iNumSplits = 4;
float4x4 g_mTextureMatrix[g_iNumSplits];
float4x4 g_mView;
float g_fSplitPlane[g_iNumSplits];

sampler2D g_samShadowMap[g_iNumSplits];

uniform extern texture  skinTex;
uniform extern Mtrl      gMtrl;
uniform extern texture shadowTexture;
sampler2D skinSampler = sampler_state
{
        Texture   = <skinTex>;
        MinFilter =Linear;
        MagFilter =Linear;
        MipFilter = Point;
        AddressU  = WRAP;
        AddressV  = WRAP;

};



void VS_RenderShadowMap(
  float2 tex0    : TEXCOORD0,
  in float4 vPos : POSITION,
  out float4 vPosOut : POSITION,
  out float4 vPixelOut : TEXCOORD1,
  out float2 tex1 : TEXCOORD0
  )
{
  // transform vertex
  vPosOut = mul(vPos, g_mWorld);
  vPosOut = mul(vPosOut, g_mViewProj);
  // output position to pixel shader
  vPixelOut = vPosOut;
  tex1=tex0;
}

float4 PS_RenderShadowMap(float4 vPixelPos : TEXCOORD1,float2 tex1 : TEXCOORD0): COLOR
{
   float a = tex2D(skinSampler, tex1).a;
   float f =  clamp(vPixelPos.z / vPixelPos.w , 0.f, 1.f);
     float4 val=pack(f);
     if(a < 0.5)
     val.a = 0.0f;
      else
     val.a = 1.0f;
     return val;
}


// This technique is used when rendering meshes to the shadowmap
//
technique RenderShadowMap
{
  pass p0
  {
   // CullMode = CW;
    VertexShader = compile vs_2_0 VS_RenderShadowMap();
    PixelShader = compile ps_2_0 PS_RenderShadowMap();
  }
}



//////////////////////////////////////////////////////////////////
// Helper functions:

float SamplePCF(sampler2D sam, float4 vTexCoord)
{
  // project texture coordinates
  vTexCoord.xyz /= vTexCoord.w;

  // 2x2 PCF Filtering
  //
  float fShadow[4];
//tex2D
  fShadow[0] = (vTexCoord.z < texFloat(sam, vTexCoord + float2(                    0,                     0)));
  fShadow[1] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(g_fShadowMapTexelSize,                     0)));
  fShadow[2] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(                    0, g_fShadowMapTexelSize)));
  fShadow[3] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(g_fShadowMapTexelSize, g_fShadowMapTexelSize)));

  float2 vLerpFactor = frac(g_fShadowMapSize * vTexCoord.xy);

  return lerp( lerp(fShadow[0], fShadow[1], vLerpFactor.x),
               lerp(fShadow[2], fShadow[3], vLerpFactor.x),
                    vLerpFactor.y);
}

float3 GouradShading(float3 vNormal)
{
  return g_vLightColor * saturate(dot(-g_vLightDir, normalize(mul(vNormal, (float3x3)g_mWorld))));
}



//////////////////////////////////////////////////////////////////
//
// Multi-pass

void VS_RenderShadows_MP(
in float2 texCoord : TEXCOORD0,
  in float4 vPos : POSITION,
  in float3 vNormal : NORMAL,
  in float3 vColorIn : COLOR0,
  out float4 vPosOut : POSITION,
  out float4 vTexCoord : TEXCOORD4,
  out float3 vLighting : COLOR0,
  out float2 outTexCoord : TEXCOORD0,
  out float3 vColorOut : COLOR1)
{
  // calculate world position
  float4 vPosWorld = mul(vPos, g_mWorld);
  // transform vertex
  vPosOut = mul(vPosWorld, g_mViewProj);

  // coordinates for shadow map
  vTexCoord = mul(vPosWorld, g_mTextureMatrix[0]);

  // calculate per vertex lighting
  vLighting = GouradShading(vNormal);
  vColorOut = vColorIn;
  outTexCoord = texCoord;
}

float4 PS_RenderShadows_MP(
float2 texCoord : TEXCOORD0,
  float4 vTexCoord : TEXCOORD4,
  float3 vLighting : COLOR0,
  float3 vColorIn : COLOR1) : COLOR
{
  float fLightingFactor = SamplePCF(g_samShadowMap[0], vTexCoord);
  // float fLightingFactor =SamplePCF(shadowSampler, vTexCoord);
float4 texColor = tex2D(skinSampler,texCoord);
  // final color
  float4 vColor=1;
  

  vColor.rgb = ( texColor) * saturate( g_vAmbient.xyz*gMtrl.ambient +vLighting.xyz*gMtrl.diffuse*(fLightingFactor)).rgb;

  return float4(vColor.rgb,gMtrl.ambient.a*gMtrl.diffuse.a*texColor.a);

}


float4 PS_RenderShadows_MP2(
  float4 vTexCoord : TEXCOORD4,
  float3 vLighting : COLOR0,
  float3 vColorIn : COLOR1) : COLOR
{
  return SamplePCF(g_samShadowMap[0], vTexCoord);
}


// This technique is used to render the final shadowed meshes
//
technique RenderShadows_MP
{
  pass p0
  {
    CullMode = CCW;
     AlphaFunc = GreaterEqual;
        AlphaTestEnable = true;
      
   AlphaRef = 150;
          VertexShader = compile vs_2_0 VS_RenderShadows_MP();
          PixelShader = compile ps_2_0 PS_RenderShadows_MP();
  }
}

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2010-8-16 10:42:00 | 显示全部楼层

Re: tonykee的能穿透alphatest纹理的shadowmap 出现些问题

photo

227

主题

1794

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2010-8-16 14:34:00 | 显示全部楼层

Re:tonykee的能穿透alphatest纹理的shadowmap 出现些问题

//tex2D
  fShadow[0] = (vTexCoord.z < texFloat(sam, vTexCoord + float2(                    0,                     0)));
  fShadow[1] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(g_fShadowMapTexelSize,                     0)));
  fShadow[2] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(                    0, g_fShadowMapTexelSize)));
  fShadow[3] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(g_fShadowMapTexelSize, g_fShadowMapTexelSize)));

你这比较都反了吧?

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2010-8-16 14:45:00 | 显示全部楼层

Re: Re:tonykee的能穿透alphatest纹理的shadowmap 出现些问题

oz01: Re:tonykee的能穿透alphatest纹理的shadowmap 出现些问题

//tex2D
  fShadow[0] = (vTexCoord.z < texFloat(sam, vTexCoord + float2(                    0,   ...



没反啊,反了屏幕全黑了!

现在问题是本该没阴影透明的地方出阴影,原来的阴影却没了.

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2010-8-16 15:27:00 | 显示全部楼层

Re: tonykee的能穿透alphatest纹理的shadowmap 出现些问题

问题解决了
AlphaFunc = GreaterEqual;
        AlphaTestEnable = true;

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2010-8-16 18:39:00 | 显示全部楼层

Re: tonykee的能穿透alphatest纹理的shadowmap 出现些问题

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-8-17 13:26:00 | 显示全部楼层

Re:tonykee的能穿透alphatest纹理的shadowmap 出现些问题

在ps里面用clip指令吧,原来的做法太折腾了,而且损失了浮点数的精度,其实不是很好

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2010-8-17 18:23:00 | 显示全部楼层

Re: Re:tonykee的能穿透alphatest纹理的shadowmap 出现些问题

tonykee: Re:tonykee的能穿透alphatest纹理的shadowmap 出现些问题

在ps里面用clip指令吧,原来的做法太折腾了,而且损失了浮点数的精度,其实不是很好


试试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-7 19:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表