سؤال

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

ومع ذلك، هذا هو التقدم الذي أحرزته حتى الآن.

  1. أنشأت 8 رؤوس لتشكيل 2 مربعات.
  2. إنشاء نسيج بقيمة ألفا 200 بت (هكذا، حوالي 80٪ شفافة).
  3. تم تعيين نفس الملمس لكل مربع، والذي يظهر بشكل صحيح.
  4. لاحظ أنه عندما أستخدم نسيجا مع 255 ألفا، يبدو أكثر إشراقا.

الأول شيء مثل ما يلي:

glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, textureIds);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

int i, j;
GLubyte pixel;
for (i = 0; i < TEXTURE_HEIGHT; i++)
{
    for (j = 0; j < TEXTURE_WIDTH; j++)
    {
        pixel = ((((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255);
        texture[i][j][0] = pixel;
        texture[i][j][1] = pixel;
        texture[i][j][2] = pixel;
        texture[i][j][3] = 200;
    }
}

glBindTexture(GL_TEXTURE_2D, textureIds[0]);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    TEXTURE_WIDTH, TEXTURE_HEIGHT,
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture);

هذا مشابه إلى حد ما مقتطف التعليمات البرمجية من صفحة 417 في الكتاب، دليل البرمجة OpenGL., ، ويخلق نمط الاختيار.

ثم، تحتوي وظيفة العرض ...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);

// Use model view so that rotation value is literal, not added.
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

// ... translation, etc ...

glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right
glEnd();

    // not neccecary to repeat, just good practice
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right
glEnd();

glFlush();
glDisable(GL_TEXTURE_2D);

glPopMatrix();

SwapBuffers();

لذلك، هذا يجعل مربع 2nd في الخلفية؛ أستطيع أن أرى هذا ولكن يبدو أنهم يمزجون مع الخلفية (أفترض ذلك لأنهم أغمق مع ألفا 200 بت من 255 بت) بدلا من الملمس وراء ...

Transparent textures not working

كما ترون، لا شفافية ... كيف يمكنني إصلاح هذا؟

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

المحلول

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

المزيد حول هذا هذه الصفحة.

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