游戏开发论坛

 找回密码
 立即注册
搜索
楼主: tonykee

shadowmap怎么才能透射alpha透明贴图?

[复制链接]

1

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2008-5-24 23:21:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

我现在用的办法也许不是好的办法,但可以参考参考。
深度图抛弃现在的R32F格式,使用A8R8G8B8格式,绘制到深度图的时候,要读取纹理,输出的时候,
需要输出该纹素的alpha。return float4(a,b,c,alpha),把depth压缩到a、b、c,读取的时候再解压.
至于如何压缩,解压,可参考GPU GEM1。其实GG1是建议使用A8R8G8B8格式的深度图的,因为该格式
比R32F更加通用,有些显卡还不支持R32F呢,而且整数纹理的渲染是比较快速的。
这办法不是很好,因为精度只有24位了。
如果大家有好的办法,请告诉我哦。。。呵呵

测试结果如下:(场景素材来自FARCRY)

http://www.sixwater.com.cn/article.asp?id=31

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2008-5-24 23:59:00 | 显示全部楼层

Re: shadowmap怎么才能透射alpha透明贴图?

刚改了一下
void BuildShadowMapVS(float3 posL : POSITION0,
                      float3 normalL : NORMAL0,
                      float2 tex0    : TEXCOORD0,
                      out float4 posH : POSITION0,
                      out float2 depth : TEXCOORD0,
                      out float2 tex1 : TEXCOORD1
                      )
{
        // Render from light's perspective.
        posH = mul(float4(posL, 1.0f), gLightWVP);       
        // Propagate z- and w-coordinates.
        depth = posH.zw;
        tex1 = tex0;
}



float4 BuildShadowMapPS(float2 depth : TEXCOORD0, float2 tex1 : TEXCOORD1) : COLOR
{
        // Each pixel in the shadow map stores the pixel depth from the
        // light source in normalized device coordinates.
       
        float a = tex2D(TexS, tex1).a;
       
        if(a < 0.5f)
          return 1.0f;
        else
          return depth.x / depth.y; // z / w
       
}
六水兄,感谢你的帖子,我稍微改了改,结果,出现了和你说的一样的遮挡问题,树干明显不正确,人的影子竟然被树遮了,出现了错误的影子,我想知道,渲染出的ps怎么知道前一次的结果是那个象素,如果是当前的值比它浅就不改变这个值了,这样一来问题才能解决,我就不清楚怎么才能知道前一次渲染的象素值?
至于压缩问题,思路很清楚,怎么知道之前的象素alpha值啊?
能否把你的这段shader发上来看看?

我在考虑是否把当前的PosH投影到 light的view平面上,得到其坐标,然后找到成像贴图上的象素值,对这个问题我很模糊
sf_200852423592.jpg

1

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2008-5-25 00:13:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

if(a < 0.5f)
  return 1.0f;
我现在抛弃这那种做法了。
至于“怎么知道之前的象素alpha值”,这个没法知道,
所以我才使用了alpha通道输出,让硬件的alpha test帮忙完成。
if(a<alphaRef)
   return float4(....,0);
else
   return float4(....,1);
可以使用0.5等作为alphaRef

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2008-5-25 00:18:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

感觉硬件的alphatest方式还是存在覆盖的问题啊

1

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2008-5-25 00:20:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

我现在就用这方法做项目的,暂时还没遇到这问题。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2008-5-25 00:22:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

对了,那个压缩和解压算法是什么样的?也就是24位的float

1

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2008-5-25 00:24:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

就类似C++的位运算啊,把一个数字,8位8位地存在r,g,b通道里去~

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2008-5-25 00:26:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

GPU GEM1第几章啊,我回头去看看去。这本书我还没来得及看呢。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2008-5-25 00:28:00 | 显示全部楼层

Re:shadowmap怎么才能透射alpha透明贴图?

六水,再次感谢你,我总算是有了头绪了

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2008-5-25 00:30:00 | 显示全部楼层

Re: shadowmap怎么才能透射alpha透明贴图?

和普通渲染里的alpha test一样,对于需要透明的影子把alpha test打开,然后读取物体原本的纹理
//set render state here
device.RenderState.AlphaTestEnable = true;
device.RenderState.AlphaFunction = CompareFunction.Greater;
device.RenderState.ReferenceAlpha = 0;

//shader code
const bool enableAlphaTest;
float4 ShadowMapPS(VertexShaderOutput IN) : COLOR0
{
   float alpha = 1.0;
   if(enableAlphaTest)
       alpha = tex2D(ColorSampler,IN.texCoord).a;
    return float4(IN.depth, IN.depth, IN.depth, alpha);
}
至于shadow map的格式,可以A8R8G8B8,也可以用浮点纹理

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

本版积分规则

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

GMT+8, 2026-1-22 09:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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