سؤال

لدي قطعة من رمز 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 وأصبحت الأمور أكثر غرابة ، فإن السهم الأصفر الذي يشير إلى أن الموضع في الكود يصل إلى الحلقة ، ويمر مرة واحدة ، ويعود إلى البداية ، في تلك المرحلة لا يتحرك السهم الأصفر أبدًا مرة أخرى ولكن المؤشر يتحرك عبر الكود ويعيد نتيجة (خطأ في بيكسل ، أو هل أنا فقط أستخدمه خطأ؟)

لدي شك في أن هذه قد تكون مشكلة تتعلق بقراءات الملمس التي يتم نقلها خارج الحلقة من قبل المترجم ، لكنني اعتقدت أن هذا لم يحدث مع Tex2Dlod منذ أن قمت بإعداد LOD يدويًا:/

لذا:

1) ما هي المشكلة؟

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top