Я работаю над графическим движком, использующим Direct3D 11 и Visual Studio 2015. В шейдерах HLSL для основных вызовов отрисовки я пробую карты теней для направленного и точечного источников света с процентной фильтрацией ближе, т.е. квадратную область вокруг целевой карты теней texel и усредните результаты, чтобы получить мягкие тени. Теперь каждый вызов shadowMap_.Sample (...) создает предупреждение: "инструкция градиента, используемая в цикле с изменяющейся итерацией, заставляющая цикл развернуться" (X3570) . Я хочу исправить это или, если это невозможно, скрыть предупреждение, поскольку оно полностью заполняет мой вывод предупреждения.
Я попытался найти сообщение об ошибке в Интернете и не смог найти дальнейших описаний. Я даже не смог найти объяснения, что такое инструкция по градиенту. Я проверил документацию Microsoft на наличие другого сэмплера или функции сэмплирования, которая позволяет мне заменить цикл на встроенную функцию сэмплирования, но ничего подобного также не нашел. Вот функция, которую я использую для выборки моих карт теневого куба для точечных источников света:
float getPointShadowValue(in uint index, in float3 worldPosition)
{
// (Half-)Radius for percentage closer filtering
int hFilterRadius = 2;
// Calculate the vector inside the cube that points to the fragment
float3 fragToLight = worldPosition.xyz - pointEmitters_[index].position.xyz;
// Calculate the depth of the current fragment
float currentDepth = length(fragToLight);
float sum = 0.0;
for (float z = -hFilterRadius; z <= hFilterRadius; z++)
{
for (float y = -hFilterRadius; y <= hFilterRadius; y++)
{
for (float x = -hFilterRadius; x <= hFilterRadius; x++)
{
// Offset the currently targeted cube map texel and sample at that position
float3 off = float3(x, y, z) * 0.05;
float closestDepth = pointShadowMaps_.Sample(sampler_, float4(fragToLight + off, index)).x * farPlane_;
sum += (currentDepth - 0.1 > closestDepth ? 1.0 : 0.0);
}
}
}
// Calculate the average and return the shadow value clamped to [0, 1]
float shadow = sum / (pow(hFilterRadius * 2 + 1, 3));
return min(shadow, 1.0);
}
Код все еще работает нормально, но я получаю огромное количество этих предупреждений и не знаю, вызывает ли это соответствующее снижение производительности. Будем весьма благодарны за любую дополнительную информацию о предупреждении и о том, что с ним можно сделать.
Заранее спасибо.