Slide 65
Slide 65 text
エイリアシング誤差の可視化
• 実装例
float3 VisualizeError( float2 shadowCoord, float2 shadowMapSize )
{
const float3 values[] = {
float3( 0.0f, 1.0/7.75, 1.0f/7.75f ),
float3( 1.0f/7.75f, 1.0f/3.25f, 1.0f/3.25f - 1.0f/7.75f ),
float3( 1.0f/3.25f, 1.0f, 1.0f - 1.0f/3.25f ),
float3( 1.0f, 3.25f, 2.25f ),
float3( 3.25f, 7.75f, 4.5f ),
float3( 7.75f, 10.0f, 7.75f ),
};
const float3 colors[] = {
float3( 0.2f, 0.0f, 0.0f ),
float3( 1.0f, 0.2f, 0.0f ),
float3( 1.0f, 1.0f, 0.0f ),
float3( 0.0f, 1.0f, 0.0f ),
float3( 0.3f, 0.8f, 1.0f ),
float3( 0.0f, 0.0f, 1.0f ),
float3( 0.0f, 0.0f, 0.2f )
};
float2 ds = shadowMapSize.x * ddx( shadowCoord );
float2 dt = shadowMapSize.y * ddy( shadowCoord );
float error = max( length( ds + dt ), length( ds - dt ) );
float3 result = (float3)1.0f;
[unroll] for( int i=0; i<6; ++i )
{
if ( error >= values[i].x && error < values[i].y )
{
result = lerp( colors[i], colors[i+1], (error - values[i].x) / values[i].z );
break;
}
else
{ result = colors[6]; }
}
return result;
}
1次元テクスチャ化可能
1回のテクスチャフェッチに変更可能
誤差を求める計算