|
DirectX9 ShadowMap中是用纹理图中的4个相邻点做过滤,代码为:
sourcevals[0] = (tex2D( g_samShadow, ShadowTexC ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
sourcevals[1] = (tex2D( g_samShadow, ShadowTexC + float2(1.0/SMAP_SIZE, 0) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
sourcevals[2] = (tex2D( g_samShadow, ShadowTexC + float2(0, 1.0/SMAP_SIZE) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
sourcevals[3] = (tex2D( g_samShadow, ShadowTexC + float2(1.0/SMAP_SIZE, 1.0/SMAP_SIZE) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
而PCF一般是用8个相邻点过滤:float2(1.0/SMAP_SIZE, 0),float2(1.0/SMAP_SIZE, 1.0/SMAP_SIZE),
float2(1.0/SMAP_SIZE, -1.0/SMAP_SIZE),float2(0,1.0/SMAP_SIZE),float2(0, -1.0/SMAP_SIZE),
float2(-1.0/SMAP_SIZE, -1.0/SMAP_SIZE),float2(-1.0/SMAP_SIZE, 1.0/SMAP_SIZE),float2(-1.0/SMAP_SIZE, 0)
这样改也是可以运行的。
然后我就想用25个相邻点试试,但总报HLSL出错,没法编译。
1 2 3 4 5
6 7 8 9 10
11 12 0 13 14
15 16 17 18 19
20 21 22 23 24
float2(1.0/SMAP_SIZE, 0),float2(1.0/SMAP_SIZE, 1.0/SMAP_SIZE),
float2(1.0/SMAP_SIZE, -1.0/SMAP_SIZE),float2(0,1.0/SMAP_SIZE),float2(0, -1.0/SMAP_SIZE),
float2(-1.0/SMAP_SIZE, -1.0/SMAP_SIZE),float2(-1.0/SMAP_SIZE, 1.0/SMAP_SIZE),float2(-1.0/SMAP_SIZE, 0)
上面这些点的可以运行,但是增加下面的像素偏移就会出错(哪怕只增加一个)。我在想是不是2位的偏移量不是2.0/SMAP_SIZE这种形式,不知道应该如何设置上面排列中的外围位置点的偏移,还是由其他问题导致,谢谢。
float2(2.0/SMAP_SIZE, 0),float2(2.0/SMAP_SIZE, 1.0/SMAP_SIZE),float2(2.0/SMAP_SIZE, -1.0/SMAP_SIZE),float2(2.0/SMAP_SIZE, 2.0/SMAP_SIZE),float2(2.0/SMAP_SIZE, -2.0/SMAP_SIZE),
float2(-2.0/SMAP_SIZE, 0),float2(-2.0/SMAP_SIZE, 1.0/SMAP_SIZE),float2(-2.0/SMAP_SIZE, -1.0/SMAP_SIZE),float2(-2.0/SMAP_SIZE, 2.0/SMAP_SIZE),float2(-2.0/SMAP_SIZE, -2.0/SMAP_SIZE),
......
|
|