ما هي الطريقة المفضلة لعرض الصور الكبيرة في برنامج OpenGL؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

لقد واجهت هذه المشكلة عدة مرات.لنفترض أنني أريد عرض شاشة البداية أو شيء ما في سياق OpenGL (أو DirectX في هذا الشأن، إنه شيء مفاهيمي أكثر)، الآن، يمكنني إما فقط تحميل نسيج بحجم 2048 × 2048 وآمل أن تتكيف بطاقة الرسومات مع ذلك (أفترض أن معظمهم سيفعلون هذه الأيام)، ولكن مع النمو باستخدام بطاقة الرسومات القديمة، أشعر بضمير سيء يميل علي ويخبرني أنه لا ينبغي لي استخدام مواد بهذا الحجم.

ما هي الطريقة المفضلة في الوقت الحاضر؟هل هو مجرد حشر هذا الشيء في ذاكرة الفيديو، أو تجانبه، أو السماح لوحدة المعالجة المركزية بالقيام بالعمل وglDrawPixels؟أو شيء أكثر تفصيلا؟

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

المحلول

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

GLint width = 0;
while ( 0 == width ) {  /* use a better condition to prevent possible endless loop */
    glTexImage2D(GL_PROXY_TEXTURE_2D, 
                      0,                /* mip map level */
                      GL_RGBA,          /* internal format */
                      desiredWidth,     /* width of image */
                      desiredHeight,    /* height of image */
                      0,                /* texture border */
                      GL_RGBA           /* pixel data format, */ 
                      GL_UNSIGNED_BYTE, /* pixel data type */
                      NULL              /* null pointer because this a proxy texture */
    );

    /* the queried width will NOT be 0, if the texture format is supported */
    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);

    desiredWidth /= 2; desiredHeight /= 2;
}

بمجرد معرفة الحد الأقصى لحجم النسيج الذي يدعمه برنامج تشغيل OpenGL الخاص بالنظام، يكون لديك خياران على الأقل إذا لم تكن الصورة مناسبة:

  • تبليط الصورة:استخدم رباعيات متعددة بعد تقسيم صورتك إلى أجزاء أصغر مدعومة.لا ينبغي أن يكون تبليط الصور لشيء مثل شاشة البداية أمرًا صعبًا للغاية.يمكنك استخدام glPixelStoreiGL_PACK_ROW_LENGTH معلمة لتحميل أجزاء من صورة أكبر إلى نسيج.
  • تغيير حجم الصورة:قم بتغيير حجم صورتك لتلائم الحد الأقصى لحجم المادة المدعومة.هناك أيضًا وظيفة مساعدة GLU للقيام بذلك نيابةً عنك، gluScaleImage.

نصائح أخرى

وأنا لا أعتقد أن هناك المدمج في وظيفة برنامج OpenGL، ولكن قد تجد مكتبة (أو كتابة الدالة نفسك) لكسر أسفل الصورة إلى قطع أصغر ومن ثم طباعة لفحص قطع أصغر (128X128 البلاط أو ما شابه).

وكان لي مشكلة مع هذا باستخدام Slick2D للحصول على لعبة جافا. يمكنك التحقق من هم الطبقة "BigImage" للأفكار <لأ href = "https://bob.newdawnsoftware.com/repos/slick/trunk/Slick/src/org/newdawn/slick/BigImage.java" يختلط = "نوفولو noreferrer "> هنا .

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