كيفية استخدام GL_REPEAT لتكرار مجموعة مختارة من أطلس النسيج فقط؟(برنامج OpenGL)

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

سؤال

كيف يمكنني تكرار مجموعة مختارة من أطلس النسيج؟

على سبيل المثال، الكائن (التحديد) الخاص بي موجود ضمن إحداثيات النسيج:

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

ثم أريد أن أكرر ذلك الكائن ن مرات إلى شريط مثلث (أو رباعي) محدد بواسطة:

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

أعلم أن الأمر له علاقة GL_REPEAT وtextCoords تمر عبر النطاق [0,1].ومع ذلك، هذا لا يعمل:(محاولة تكرار N = 10)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

نحن نرى أطلس الملمس الكامل الخاص بنا يتكرر...

كيف أفعل هذا بالطريقة الصحيحة؟

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

المحلول

لا يمكن أن يتم ذلك بالطريقة الموضحة في السؤال.تنطبق أوضاع إحداثيات نسيج OpenGL على النسيج بأكمله فقط.

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

لا يدعم أي من أوضاع التفاف النسيج نوع العملية كما هو موضح في السؤال، أي.يتم تعيينهم جميعًا إلى النطاق الكامل [0،1]، وليس مجموعة فرعية عشوائية.عندما تقوم بالتركيب باستخدام جزء فقط من النسيج، لا توجد طريقة لتحديد تنسيق النسيج الأكبر بطريقة تجعل OpenGL يكرره داخل المستطيل الفرعي فقط.

لديك في الأساس خياران:قم إما بإنشاء نسيج جديد يحتوي فقط على الكائن الذي تحتاجه من النسيج الموجود أو كتابة برنامج GLSL vertex لتعيين إحداثيات النسيج بشكل مناسب.

نصائح أخرى

لست متأكدا من أنك تستطيع أن تفعل ذلك.أعتقد أن أوضاع تنسيق نسيج OpenGL تنطبق فقط على النسيج بأكمله.عند استخدام الأطلس، فإنك تستخدم "أنسجة فرعية"، بحيث لا تقترب إحداثيات النسيج أبدًا من 0 و1، وهي الحدود الطبيعية التي يحدث فيها الالتفاف والتثبيت.

قد تكون هناك ملحقات للتعامل مع هذا، لم أتحقق منها.

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

هذا أمر فظ بعض الشيء للشرح بدون صور.

على أي حال، عندما تقوم بالتركيب باستخدام جزء فقط من النسيج، لا توجد طريقة لتحديد تنسيق النسيج الأكبر بطريقة تجعل OpenGL يكرره داخل المستطيل الفرعي فقط.

لا يدعم أي من أوضاع التفاف النسيج نوع العملية التي تبحث عنها، على سبيل المثال.يتم تعيينهم جميعًا إلى النطاق الكامل [0،1]، وليس مجموعة فرعية عشوائية.لديك في الأساس خياران:قم إما بإنشاء نسيج جديد يحتوي فقط على الكائن الذي تحتاجه من النسيج الموجود أو كتابة برنامج بكسل GLSL لتعيين إحداثيات النسيج بشكل مناسب.

في حين أن هذا قد يكون موضوعا قديما؛إليك كيف انتهيت من القيام بذلك:

سيكون الحل البديل هو إنشاء شبكات متعددة، يتم لصقها معًا وتحتوي على المجموعة الفرعية من Texture UV's.

على سبيل المثال:لدي نسيج ليزر موجود داخل أطلس نسيج أكبر، عند U[0.05 - 0.1] وV[0.05-0.1].

سأقوم بعد ذلك بإنشاء شبكات N، تحتوي كل منها على إحداثيات U[0.05-0.1] وV[0.05-0.1].(N = الطول / الملمس.الارتفاع؛الارتفاع هو البعد من الملمس وأود أن أكرر.أو أسهل:مقدار المرات التي أرغب في تكرار الملمس فيها.)

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

(OpenGL ES 1.0,1.1,2.0 - الأجهزة المحمولة 2011)

لا يمكن القيام به...

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