سؤال

وهناك لديك سؤال، ربما شخص يمكن أن تساعدني. واني اسعى الى جعل تأثير المرآة باستخدام برنامج OpenGL. أود أن ألفت طائرة شفافة، وهو "يعكس" مشهد قطع من الاستنسل، ونسخة أصلية واحدة. ولكن لدي "الجدار" تماما غير شفاف بدلا من المرآة. وأنا أعلم أنه يحدث بسبب الأول تقديم طائرة مرآة (للحصول على منطقة عازلة الاستنسل). ولكن أنا لا أعرف ماذا أفعل مع هذا :( هنا هو رمز:

  void CMirror::draw(CSceneObject * curscene)
{
    glPushMatrix();
    glClearStencil(0.0f);

    glClear(GL_STENCIL_BUFFER_BIT);
    //Draw into the stencil buffer
    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);
    glStencilFunc(GL_ALWAYS, 1, 0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glEnable(GL_STENCIL_TEST);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    glScalef(this->size, this->size, this->size);
    glColor4f(1, 0, 1, 0);
    glBegin(GL_QUADS);
        glVertex3f(0.0f, this->height / 2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / -2.0f);
        glVertex3f(0.0f, this->height / 2.0f, this->width / -2.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_STENCIL_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    //glClear(GL_COLOR_BUFFER_BIT);
    //Draw the scene
    glEnable(GL_STENCIL_TEST);  
    glStencilFunc(GL_EQUAL, 1, 255);
    glPushMatrix();
    glTranslatef( 2*this->coords[0], 2*this->coords[1], 2*this->coords[2]);
    glScalef(-1.0f, 1.0f, 1.0f);
    ((CScene*)curscene)->draw();
    glColor4f(0.0f, 0.30f, 0, 0.9); 
    ((CScene*)curscene)->spline->draw();
    ((CScene*)curscene)->morph->draw();


    glPopMatrix();
    glDisable(GL_STENCIL_TEST);
    //the mirror itself:
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    glScalef(this->size, this->size, this->size);
    glColor4f(0, 0, 0, 0.9);
    glBegin(GL_QUADS);
        glVertex3f(0.0f, this->height / 2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / -2.0f);
        glVertex3f(0.0f, this->height / 2.0f, this->width / -2.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_BLEND);

    glPopMatrix();
}
هل كانت مفيدة؟

المحلول

وماذا يحدث إذا كنت لا تفعل ذلك التعادل الأخير (أي إذا كانت المشكلة لا تزال هناك، إزالته لأنه يعقد سبيل المثال)؟

والشيء الوحيد الذي هو واضح هو أنك لا يبدو أن التعامل مع أي شيء Z-عازلة ذات الصلة.

عند رسم رباعية الأولى لتعيين الاستنسل، على افتراض Z-الكتابة على، كنت في نهاية المطاف تحديد القيم Z إلى Z. المرآة رسم المشهد الذي يفترض أن تنعكس في المرآة ستكون Z- رفضت.

وتحتاج إلى مسح المخزن المؤقت Z لتلك المنطقة من الشاشة بطريقة أو بأخرى. من الواضح، يمكن للClear(DEPTH_BIT) كامل يعمل ولكن ذلك يعتمد على ما كنت قد رسمت بالفعل على الشاشة.

وبالمثل، لا تحديث عازلة Z عند تحديث الاستنسل يمكن أن تعمل أي شيء اعتمادا على ما إذا تم رسمها من قبل.

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