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