سؤال

هل يغفر لي إذا كان هذا قد طلب من قبل ، لقد كنت تبحث عن الجواب على هذا كل يوم وكل ما أنا الخروج مع مساعدة مع البلاط على أساس 2د الألعاب.س ~ س

أحاول إنشاء واجهة المستخدم الرسومية سكينبل في ديريكت 3 د 9 ، وذلك باستخدام ملف شمل الذي يحتوي على مواقف لكل عنصر وخيار لتمتد أو البلاط لهم.تمتد هو إجراء بسيط بما فيه الكفاية ، ولكن لم أتمكن من معرفة طريقة لبلاط جزء صغير من الملمس.تقليديا لبلاط نسيج أود فقط تعيين إحداثيات الأشعة فوق البنفسجية إلى > 1.0 ، ولكن إحداثيات نسيج المصدر ستكون فقط مجموعة فرعية صغيرة من النسيج كله ، مثل 0.4 إلى 0.5.

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

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

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

المحلول

أفهم أنك تريد تجانب مجموعة فرعية فقط من النسيج, حق?ثم تتعقد الأمور.

افترض أننا نريد تجانب يو-كوورد بين يو1 و يو2 القيم ، يو1 < يو 2.

ثم نحن بحاجة إلى وظيفة و (ش) ، بحيث

f(0.0) = u1
f(0.5) = (u1+u2)/2
f(0.9999) = u2
f(1.0) = u1
f(1.5) = (u1+u2)/2
f(1.9999) = u2
f(2.0) = u1
and so on...

الوظيفة المناسبة هي f(u) = frac(u) * (u2-u1) + u1

الشيء نفسه ينطبق على الخامس كورد, f(v) = frac(v) * (v2-v1) + v1

لاحظ أنه تبليط دون النسخ المتطابق.إذا كنت بحاجة إلى النسخ المتطابق ، فيجب أن تكون الوظيفة دالة موجية مثلثة ، وهي t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5 و f(u) = t(u) * (u2-u1) + u1.استخدام الدوال المثلثية يمكن أن تكون مكلفة على الرغم من.

أنا لا أعرف ما إذا كان من الممكن مع خط أنابيب ثابت ، ولكن يمكنك أن تفعل ذلك بسهولة في تظليل بكسل (رمز هلس):

// float2 tex_coord -> (u,v) from vertex shader, in [0,n] range,
//                     n - number of repetitions
// float2 tex1, tex2 -> constants, subrange of [0,1] coords that will be tiled

// no mirroring
float4 color = tex2D(sampler, frac(tex_coord) * (tex2-tex1) + tex1);

أو

// mirroring, t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5
float4 color = tex2D(sampler, t(tex_coord) * (tex2-tex1) + tex1);

تحرير:طريقة أفضل لحساب دالة الموجة المثلثة: t1(x) = abs(2(0.5x-floor(0.5x+0.5))) أو t2(x) = abs(2(frac(0.5x+0.5))-1) (ليس بالضبط نفس ر1 ولكن صحيح للأرقام غير السالبة).

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