Я пытаюсь внедрить фильтрацию PCF в свои теневые карты и поэтому изменил статью о GPU Gems ( http://http.developer.nvidia.com/GPUGems/gpugems_ch11.html ), чтобы его можно было запускать на текущих шейдерах. Модификация включает замену функции tex2Dproj на функцию Texture2D.Sample(), поэтому она принимает состояния семплера, созданные в DirectX11. Затем я сравнил значения смещения с обычным сравнением карты теней:
float2 ShTex;
ShTex.x = PSIn.ShadowMapSamplingPos.x/PSIn.ShadowMapSamplingPos.w/2.0f +0.5f;
ShTex.y = -PSIn.ShadowMapSamplingPos.y/PSIn.ShadowMapSamplingPos.w/2.0f +0.5f;
float realDistance = PSIn.ShadowMapSamplingPos.z/PSIn.ShadowMapSamplingPos.w;
(realDistance - xShBias) <= offset_lookup(xTextureSh, texSampler, ShTex, float2(x, y), scale); //Blocker-receiver comparison (the usual stuff, only that it gets 4*4 samples from near offsets then divides the final value with 16)
Теперь я получаю взамен следующее:
Где в статье сказано и показано, что железо должно волшебным образом интерполировать результаты. Я предполагаю, что tex2Dproj может это сделать, но не может заставить его работать.
Недавно я наткнулся на функцию SampleCmpLevelZero, которую я опробовал с этим состоянием сэмплера:
SamplerComparisonState cmpSampler
{
Filter = COMPARISON_MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
ComparisonFunc = LESS;
};
Когда я заставляю его работать, вся сцена случайным образом мерцает от затененной до незатененной и частично затененной (что казалось правильными тенями).
xTextureSh.SampleCmpLevelZero( cmpSampler, ShTex.xy, realDistance - xShBias );
К сожалению, я нашел кого-то с такой же проблемой, но ему удалось исправить ее, переписав фильтр в режим, который я уже применил.
Моя текстура глубины имеет следующий формат: DXGI_FORMAT_R24_UNORM_X8_TYPELESS.
Я сейчас в большом замешательстве из-за этой тайны относительно правильной фильтрации PCF, есть ли кто-нибудь, кто может что-нибудь подсказать? Спасибо заранее и за то, что дочитали до конца.