六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 231|回复: 0

DX10 Shadow Volumn Sample Code的Bug修正

[复制链接]

升级  7.33%

72

主题

72

主题

72

主题

举人

Rank: 3Rank: 3

积分
222
 楼主| 发表于 2012-12-30 11:51:29 | 显示全部楼层 |阅读模式
DX10 Shadow Volumn Sample Code的Bug修正

<div id="cnblogs_post_body">在DX10 Shadow Volumn Sample中的DetectAndProcessSilhouette这个函数意思是说边缘检测,但实际啥都没做,只是沿伸了顶点生成shadow vloumn。为了证明存在的BUG,换了个简单的模型来看一下shadow volumn的样子:

在这幅图中,很明显,反向面的顶点也做了不必要的沿伸。
下图是修正过的效果图:

明显shadow volumn 要更干净些了,而且结果完全正确。
再换回到原先的模型看一下效果。
以下两幅图是原来的代码结果:


以下是修正的结果:


可以看出,结果是没问题的。
下面分析代码是如何修改,修改过的代码段如下:
<div class="cnblogs_code">//// Helper to detect a silhouette edge and extrude a volume from it//void DetectAndProcessSilhouette( float3 N,         // Un-normalized triangle normal                                 GSShadowIn v1,    // Shared vertex                                 GSShadowIn v2,    // Shared vertex                                 GSShadowIn vAdj,  // Adjacent triangle vertex                                 inout TriangleStream<PSShadowIn> ShadowTriangleStream // triangle stream                                 ){        float3 NAdj = cross( v2.pos - vAdj.pos, v1.pos - vAdj.pos );        float3 AdjDir = normalize(g_vLightPos - vAdj.pos);    if(dot(AdjDir, NAdj) < 0.0f)     {        float3 outpos[4];        float3 extrude1 = normalize(v1.pos - g_vLightPos);        float3 extrude2 = normalize(v2.pos - g_vLightPos);                outpos[0] = v1.pos + g_fExtrudeBias*extrude1;        outpos[1] = v1.pos + g_fExtrudeAmt*extrude1;        outpos[2] = v2.pos + g_fExtrudeBias*extrude2;        outpos[3] = v2.pos + g_fExtrudeAmt*extrude2;                // Extrude silhouette to create two new triangles        PSShadowIn Out;        for(int v=0; v<4; v++)        {            Out.pos = mul( float4(outpos[v],1), g_mViewProj );            ShadowTriangleStream.Append( Out );        }        ShadowTriangleStream.RestartStrip();    }}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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