سؤال

لقد صعدت لعدة أيام لإيجاد أي موارد لمساعدتي في كتابة تظليل توهج/طمس بسيط باستخدام لغة التظليل عالية المستوى والمكتبات المدارة DirectX 9.

كل ما أحتاج إلى فعله هو الحصول على مجموعة من CustomVertex.TransformedColored الرؤوس المرسومة كخطوط بسيطة ثم وضوح/توهج بتأثير HLSL.

لقد بحثت في الإنترنت لمدة ثلاثة أيام تقريبًا مع بعض النتائج ، لكن لا يمكنني العثور على برنامج تعليمي أو مثال جيد حقًا. لدي فهم أساسي لـ HLSL لكنني لا أفهمه بما يكفي لمعرفة كيفية كتابة هذا التظليل (لقد قرأت الفصل HLSL في 3 كتب DirectX أيضًا).

فيما يلي بعض الرمز (المختص):

CustomVertex.TransformedColored[] glowVertices = new CustomVertex.TransformedColored[4];
glowVertices[0] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[1] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());
glowVertices[2] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[3] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());

this.device.BeginScene();
int passes = this.glowEffect.Begin(0);
for (int i = 0; i < passes; i++)
 {
     this.glowEffect.BeginPass(i);
     this.device.DrawUserPrimitives(PrimitiveType.LineStrip, glowVertices.Length - 1, glowVertices);
     this.glowEffect.EndPass();
 }
 this.glowEffect.End();
 this.device.EndScene();

أظن أنني لست أبحث كثيرًا عن المساعدة في جزء معين من HLSL ، بالنظر إلى عدد الأسئلة ومقدار التعليمات البرمجية التي يجب أن أنشرها ، فأنا أبحث عن بعض المساعدة في العثور على الموارد!

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

المحلول

المشكلة الفورية التي أراها مع الكود الخاص بك هي أنك تطبق تظليلًا على الخطوط نفسها. تظليل البكسل لا تعمل حقًا بهذه الطريقة. لا يمكنك التفاعل مع أي من وحدات البكسل حول البيكسل المظللة. كل ما تحصل عليه هو السجلات (الموضع ، اللون ، إحداثيات الملمس ، إلخ) وأخذ العينات (القوام) لهذا البيكسل الذي يتم الإخراج.

للتغلب على هذا ، تتمثل العملية الأساسية في القيام بتأثير ضبابي (مثل الوهج أو الإزهار) في رسم المشهد الذي تريد أن تطهيره إلى هدف عرض. ثم استخدم هذا الهدف عرضًا كملمس على رباعي على الشاشة كاملاً ترسمه بتظليل ضبابي. يأخذ تظليل طمس بسيط يأخذ عينات متعددة من هذا الملمس - ولكل منها إحداثيات نسيج الإزاحة قليلاً. والنتيجة هي صورة غير واضحة للملمس.

عادةً ما تكرر هذه العملية (مما يجعل الآن عرض الأهدف على الشاشة المليئة بهدف عرض آخر) ، مما يؤدي إلى طمس واحد أفقيًا وواحدًا رأسيًا ، للحصول على أقصى حد من عدد العينات.

أوصي بالنظر إلى عينة زنا بلوم. هناك وثائق أكثر شمولاً حول العملية هناك. على الرغم من أن واجهة برمجة التطبيقات هي XNA ، وليس DirectX ، إلا أنها متشابهة إلى حد ما وكلاهما يستخدم HLSL.

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