OpenGL Polygon Stipple не работает на другой машине - PullRequest
2 голосов
/ 19 мая 2010

У меня есть ситуация, когда я пытаюсь нарисовать полупрозрачный прямоугольник на фоне, который не использует openGL, и поэтому я не могу использовать смешивание. Я решил использовать рисование многоугольника для эффекта «прозрачности дверцы экрана», как рекомендовано некоторыми. Он отлично работает на моей машине и на некоторых других, но на некоторых машинах с немного старыми видеокартами Intel он вообще не отображает прямоугольник. Если я отключу пунктирную полигону, он будет хорошо (но без пунктирной). Я сравнил многие переменные состояния, которые, по моему мнению, могут влиять на это (см. Код) между машинами, и все они одинаковы, и я не получаю ошибок.

static const GLubyte stipplePatternChkr[128];  //definition omitted for clarity
                                               //but works on my machine

 // stipple the box
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        glColor4ubv(Color(COLORREF_PADGRAY));
    glEnable(GL_POLYGON_STIPPLE);
    glPolygonStipple(stipplePatternChkr);
        CRect rcStipple(dim);
        rcStipple.DeflateRect(padding - 1, padding - 1);
        glBegin(GL_QUADS);
            glVertex2i(rcStipple.left, rcStipple.bottom);
            glVertex2i(rcStipple.right, rcStipple.bottom);
            glVertex2i(rcStipple.right, rcStipple.top);
            glVertex2i(rcStipple.left, rcStipple.top);
        glEnd();
    glDisable(GL_POLYGON_STIPPLE);  

       int err = glGetError();
       if (err != GL_NO_ERROR) {
        TRACE("glError(%s: %s)\n", s, gluErrorString(err));
       }

    float x;
    glGetFloatv(GL_UNPACK_ALIGNMENT, &x);
    TRACE("unpack alignment %f\n", x);
    glGetFloatv(GL_UNPACK_IMAGE_HEIGHT, &x);
    TRACE("unpack height %f\n", x);
    glGetFloatv(GL_UNPACK_LSB_FIRST, &x);
    TRACE("unpack lsb %f\n", x);
    glGetFloatv(GL_UNPACK_ROW_LENGTH, &x);
    TRACE("unpack length %f\n", x);
    glGetFloatv(GL_UNPACK_SKIP_PIXELS, &x);
    TRACE("upnack skip %f\n", x);
    glGetFloatv(GL_UNPACK_SWAP_BYTES, &x);
    TRACE("upnack swap %f\n", x);

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Это довольно просто, если вы используете кадровые буферы. Создайте буфер кадров и нарисуйте его. Теперь в нем есть текстура с информацией RGBA. Получите данные пикселей этой текстуры в массив на CPU и используйте команды рисования этого фона для рисования изображения Таким образом, вы можете сохранить альфа-информацию для любой сцены.
Проблема в том, что это может быть не так быстро, как другие, более дорогие решения.

1 голос
/ 19 мая 2010

Попробуйте применить пунктирную текстуру к многоугольнику с отключенной фильтрацией.

...