DX10 Shadow Volumn Sample Code的Bug修正
DX10 Shadow Volumn Sample Code的Bug修正在DX10 Shadow Volumn Sample中的DetectAndProcessSilhouette这个函数意思是说边缘检测,但实际啥都没做,只是沿伸了顶点生成shadow vloumn。为了证明存在的BUG,换了个简单的模型来看一下shadow volumn的样子:
http://pic002.cnblogs.com/images/2012/411346/2012060713322270.png
在这幅图中,很明显,反向面的顶点也做了不必要的沿伸。
下图是修正过的效果图:
http://pic002.cnblogs.com/images/2012/411346/2012060713335432.png
明显shadow volumn 要更干净些了,而且结果完全正确。
再换回到原先的模型看一下效果。
以下两幅图是原来的代码结果:
http://pic002.cnblogs.com/images/2012/411346/2012060713352915.png
http://pic002.cnblogs.com/images/2012/411346/2012060713355656.png
以下是修正的结果:
http://pic002.cnblogs.com/images/2012/411346/2012060713362810.png
http://pic002.cnblogs.com/images/2012/411346/2012060713364663.png
可以看出,结果是没问题的。
下面分析代码是如何修改,修改过的代码段如下:
//// 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,1), g_mViewProj ); ShadowTriangleStream.Append( Out ); } ShadowTriangleStream.RestartStrip(); }}
页:
[1]