Проблема с зацикливанием / выборкой HLSL - PullRequest
2 голосов
/ 01 сентября 2009

У меня есть фрагмент кода 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) Какие-либо предлагаемые решения?

1 Ответ

2 голосов
/ 01 сентября 2009

Проблема была решена, это была простая ошибка кодирования, мне нужно было увеличивать уровень mip на каждой итерации, а не уменьшать его.

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;
}
...