سؤال

لقد قمت بإنشاء صورة PNG في Photoshop مع شفافية قمت بتحميلها في برنامج OpenGL. لقد ارتدته إلى نسيج وفي البرنامج تبدو الصورة ضبابية ولست متأكدًا من السبب.

alt text http://img685.imageshack.us/img685/9130/upload2.png

alt text http://img695.imageshack.us/img695/2424/upload1e.png

رمز التحميل

// Texture loading object
nv::Image title;

// Return true on success
if(title.loadImageFromFile("test.png"))
{
    glGenTextures(1, &titleTex);
    glBindTexture(GL_TEXTURE_2D, titleTex);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}

else
    MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);

رمز العرض

glEnable(GL_TEXTURE_2D);    
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);

glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
    glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
    glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);    
glDisable(GL_TEXTURE_2D);

تحرير: لا أعتقد أنني أمد كل بكسل يجب أن يكون اثنين في نظام التنسيق

int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

لماذا تريد استخدام MIPMapping وتصفية متباين الخواص لصورة ثابتة على شاشة البدء في المقام الأول؟ من غير المحتمل أن يتم تدوير الصورة (ما هو تصفية متباين الخواص) أو يجب تغيير حجمها عدة مرات (ما هو MIPMapping).

إذا تم تمديد الملمس: حاول استخدام GL_NEAREST من اجلك GL_MAG_FILTER, ، في هذه الحالة يمكن أن يعطي نتائج أفضل (GL_LINEAR أكثر دقة ، ولكن لديه طبيعة غير واضحة).

إذا تم تقليل الملمس: نفس الشيء ، فحاول استخدام GL_NEAREST_MIPMAP_NEAREST, ، أو حتى الأفضل ، حاول استخدام أي miPMaps و GL_NEAREST (أو GL_LINEAR, أيهما يعطيك أفضل نتيجة).

أقترح أن تجعل PNG لديه قرار في قوة 2. IE 1024x512 ووضع الجزء الذي تريد رسمه في الركن الأيسر العلوي منه لا يزال بدقة الشاشة. ثم قم بتنشيط Texcoords لتكون 800.0/1024.0 و 600.0/512.0 للحصول على الجزء الأيمن من الملمس. أعتقد أن ما يحدث glTexImage2D يمكن في وقت ما عرض المعالجة والارتفاع اللذين لا يمثلان قوة 2 ولكن يمكن أن يقوم بعد ذلك بتوسيع صورة الإدخال وبالتالي تصفيةها.

مثال على التعامل مع هذا يمكن عرضه هنا (A iPhone - OpenGles - مشروع يمسك جزءًا من الشاشة غير الطاقة من 2 ويسحب ذلك إلى نسيج 512 × 512 ويقوم بإنقاذ GL_TEXTURE Matrix ، السطر 123 ، بدلاً من القيام بمشاهدة يدوي لـ Texcoords)

هنا هو آخر منشور يذكر هذه الطريقة.

هذه فرضية:

نافذتك 800 × 600 (وربما إطارك أيضًا) ، ولكن منطقة العميل الخاصة بك ليست كذلك ، بسبب زخرفة النافذة على الجانبين.

لذلك يتم تغيير حجم مؤشر الإطار الخاص بك عند إزاحته إلى منطقة العميل في نافذتك. هل يمكنك التحقق من رمز إنشاء النافذة الخاص بك؟

  • احذر من الحجم الدقيق لمنطقة العميل في نافذتك. تحقق من ذلك هو ما تتوقعه أن يكون
  • حذار قواعد محاذاة البكسل. قد تحتاج إلى إضافة 0.5 إلى إحداثيات x/y الخاصة بك لضرب مراكز البكسل. يمكن العثور على وصف لـ DirectX هنا - قد تكون قواعد OpenGL مختلفة ، رغم ذلك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top