У меня есть кусок кода HLSL, который выглядит следующим образом:Проблема с HLSL Контурные/выборки
float4 GetIndirection(float2 TexCoord)
{
float4 indirection = tex2D(IndirectionSampler, TexCoord);
for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip--)
{
indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip));
}
return indirection;
}
Результаты я получаю согласуются с этим цикл только выполнение один раз. Я проверил шейдер в PIX, и все стало еще более странным: желтая стрелка, указывающая, что позиция в коде попадает в цикл, проходит один раз и возвращается к началу, в этот момент желтая стрелка никогда не перемещается, а курсор перемещается по коду и возвращает результат (ошибка в PIX, или я просто неправильно ее использую?)
У меня есть подозрение, что это может быть проблемой, связанной с чтением текстуры, перемещаемой вне цикла компилятором, однако я думал, что не случилось с tex2Dlod, так как я вручную настройки LOD:/
Итак:
1) в чем проблема?
2) Любые предлагаемые решения?
Вы компилируете данные для SM3 или SM4? ЕСЛИ это directx 10, вы можете установить флаги D3D10_SHADER_DEBUG и D3D10_SHADER_SKIP_OPTIMIZATION при компиляции вашего шейдера, поскольку это может помочь вам выявить проблему в PIX. – Tchami
Компиляция в SM3 с использованием DirectX9, которая является самой высокой, которую я могу использовать, поскольку это XNA – Martin
Хорошо, это было не сразу очевидно, так как вы отметили ее как DirectX, так и XNA;) – Tchami