سؤال

هل هناك شيء غير عادي حول كيفية التعامل مع مكون ألفا في شادر بكسل؟ لدي تطبيق WPF الذي يعطيني فنانتي صورا رماديا لاستخدامه كخلفيات، والتطبيق يلوين هذه الصور وفقا للحالة الحالية. لذلك كتبت ظلال بكسل (باستخدام البنية التحتية لمكتبة مكتبة Hader WPF Pixel Shader) لاستخدامها كأداة على عنصر الصورة. يأخذ Shader لونا كمعلمة، والتي تتحول إلى HSL حتى تتمكن من التعامل مع السطوع. ثم لكل بكسل رمادي، يقوم بحساسية اللون الذي يتم محكوم سطوعه بين المعلمة اللون والأبيض بما يتناسب مع سطوع بكسل المصدر.

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);

    // ...Do messy computation involving src brightness and color parameter...

    float4 dst;
    dst.r = ...
    dst.g = ...
    dst.b = ...
    dst.a = src.a;
    return dst;
}

يعمل هذا على ما يرام على بكسل حيث alpha = 1. ولكن حيث alpha = 0، فإن بكسل الناتجة عنها تظهر باللون الأبيض، بدلا من إظهار خلفية النافذة. لذلك قمت بتغيير صغير:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);
    if (src.a == 0) 
        return src;
    ...

والآن الأجزاء الشفافة شفافة حقا. لماذا ا؟ لماذا لم dst.a = src.a بيان في الإصدار الأول ينجز ذلك؟ لسوء الحظ، حتى هذا مجرد إصلاح جزئي، لأنه يبدو لي مثل بكسل مع 0 <Alpha <1 يخرج الأبيض.

هل يعرف أحد ما لا أفهمه حول ألفا؟

هل كانت مفيدة؟

المحلول

بعد إجراء المزيد من البحث على شبكة الإنترنت، اكتشفت القطعة التي كنت في عداد المفقودين.

وفق مقال عن MSDN: "يستخدم WPF ألفا مضروبة مسبقا في كل مكان داخليا لعدد من أسباب الأداء، لذلك هذه هي الطريقة التي نفسرها أيضا القيم الملونة في ظلال البكسل المخصص".

لذلك يتحول الإصلاح إلى أن يرمي في الضرب بواسطة ألفا:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    ...
    dst.rgb *= src.a;
    return dst;
}

والآن يبدو خرجي كما أتوقع ذلك.

نصائح أخرى

0 <ألفا <1 تبدأ بيضاء

ما النطاقات التي تتوقعها هنا؟

ستكون جميع القيم في النطاق 0.0 و 1.0 ... Pixel Shaders لا يعمل في نطاقات اللون المنفصلة 256، فهي نقطة عائمة حيث 1.0 هو الحد الأقصى لشدة.

إذا انتهى العمليات الحسابية في إعداد قيم R / G / B إلى> 1.0 ستحصل على ...

http://www.facewound.com/tutorials/shader1/

المتأنق أعمل على لعبة XNA، واضطررت إلى استخدام مظل البكسل الرمادي وحصلت على نفس المشكلة التي تواجهها. أنا لا أعرف إذا كنت على دراية بيئة XNA أم لا، لكنني حل المشكلة عن طريق تغيير Spritebatch. رسم spriteblendmode. من spriteblendmode.none. ل spriteblendmode.alphablend., آمل أن يساعدك هذا في معرفة السبب.

مع تحياتي،

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top