2009-08-31 6 views
2

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

+0

Вы компилируете данные для SM3 или SM4? ЕСЛИ это directx 10, вы можете установить флаги D3D10_SHADER_DEBUG и D3D10_SHADER_SKIP_OPTIMIZATION при компиляции вашего шейдера, поскольку это может помочь вам выявить проблему в PIX. – Tchami

+0

Компиляция в SM3 с использованием DirectX9, которая является самой высокой, которую я могу использовать, поскольку это XNA – Martin

+0

Хорошо, это было не сразу очевидно, так как вы отметили ее как DirectX, так и XNA;) – Tchami

ответ

2

Проблема была решена, это была простая ошибка кодирования, мне нужно было увеличить уровень 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; 
} 
Смежные вопросы