هل من الممكن استخدام Shader للعثور على "الفرق" بين اثنين من القوام؟ (XNA / HLSL)

StackOverflow https://stackoverflow.com/questions/1182158

  •  19-09-2019
  •  | 
  •  

سؤال

لقد قدمت تطبيقا بسيطا في كاميرا الويب بسيطة يكتشف "حواف الحركة"، لذلك يقوم بتصفيق نسيج يدل على المكان الذي تختلف فيه بكسلات الإطار الحالي بشكل كبير إلى الإطار السابق. هذا هو رمزي:

// LastTexture is a Texture2D of the previous frame.
// CurrentTexture is a Texture2D of the current frame.
// DifferenceTexture is another Texture2D.
// Variance is an int, default 100;

Color[] differenceData = new Color[CurrentTexture.Width * CurrentTexture.Height];
Color[] currentData = new Color[CurrentTexture.Width * CurrentTexture.Height];
Color[] lastData = new Color[LastTexture.Width * LastTexture.Height];

CurrentTexture.GetData<Color>(currentData);
LastTexture.GetData<Color>(lastData);

for (int i = 0; i < currentData.Length; i++)
{
    int sumCD = ColorSum(currentData[i]); // ColorSum is the same as c.R + c.B + c.G where c is a Color.
    int sumLD = ColorSum(lastData[i]);
    if ((sumCD > sumLD - Variance) && (sumCD < sumLD + Variance))
        differenceData[i] = new Color(0, 0, 0, 0); // If the current pixel is within the range of +/- the Variance (default: 100) variable, it has not significantly changes so is drawn black.
    else
        differenceData[i] = new Color(0, (byte)Math.Abs(sumCD - sumLD), 0); // This has changed significantly so is drawn a shade of green.
}

DifferenceTexture = new Texture2D(game1.GraphicsDevice, CurrentTexture.Width, CurrentTexture.Height);
DifferenceTexture.SetData<Color>(differenceData);

LastTexture = new Texture2D(game1.GraphicsDevice,CurrentTexture.Width, CurrentTexture.Height);
LastTexture.SetData<Color>(currentData);

هل هناك طريقة لتفريغ هذا الحساب إلى GPU باستخدام التظليل (يمكن أن تذهب في حوالي 25/26 FPS باستخدام الطريقة المذكورة أعلاه، ولكن هذا بطيء بعض الشيء)؟ لدي فهم أساسي لكيفية عمل HLSL SILSLERS ولا تتوقع حلا كاملا، أريد فقط أن أعرف ما إذا كان هذا ممكنا وكيفية الحصول على بيانات الملمس "الفرق" من Shader وإذا كان هذا سيكون بشكل أسرع وبعد

شكرا مقدما.

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

المحلول

فيما يتعلق بتعليقك أعلاه حول اتخاذ قرار باستخدام نهج موضوع مزدوج لمشكلتك، تحقق من ملحقات .NET الموازية CTP من Microsoft. microsoft.com.

إذا كنت لا تخطط للنشر إلى Xbox360، فإن هذه المكتبة تعمل بشكل رائع مع XNA، وشاهدت تحسينات سرعة ضخمة في حلقات وإجراءات معينة.

سيتعين عليك في الأساس فقط تغيير خطوط التعليمات البرمجية، على سبيل المثال:

for (int i = 0; i < currentData.Length; i++)
{
    // ...
}

سوف تتغير إلى:

Parallel.For(0, currentData.Length, delegate(int i)
{
   // ...
});

لتحقيق كل كور تلقائيا في المعالج الخاص بك مساعدة مع عدد الطحن. انها سريعة وممتازة.

حظ سعيد!

نصائح أخرى

يمكنك تذوق اثنين من القوام داخل شادر بكسل، ثم اكتب الفرق كقيمة اللون. إذا قمت بإعداد تقديم هدف, سيتم تخزين المعلومات الملونة التي توضع بها من Shader في هذا الملمس بدلا من الإطارات.

لا أعرف أي نوع من مكاسب السرعة التي تتوقع رؤيتها، ولكن هذه هي الطريقة التي سأفعلها.

* تحرير - أوه ونسيت أن أقول، كن على دراية بنوع أخذ العينات الذي تستخدمه، لأنه سيؤثر على النتائج. إذا كنت تريد أن تترجم خوارزميةك مباشرة إلى GPU، فاستخدم أخذ عينات نقطة للبدء بها.

ال سوبيل المشغل أو شيء من هذا القبيل يستخدم في محركات الألعاب وغيرها من التطبيقات في الوقت الفعلي للكشف عن الحافة. إنه تافهة لكتابة مثل شادر بكسل.

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