2

我有一种情况,我试图在不使用 openGL 的背景上绘制一个半透明的矩形,所以我不能使用混合。我决定按照某些人的建议使用多边形点画来实现“纱门透明度”效果。它在我的机器和其他一些机器上运行良好,但在一些带有稍微旧的英特尔显卡的机器上,它根本无法渲染矩形。如果我关闭多边形点画,它会渲染得很好(但没有点画)。我已经比较了许多我认为可能会在机器之间影响它的状态变量(参见代码),它们都是相同的,我没有得到任何错误。

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);
4

2 回答 2

1

尝试在关闭过滤的情况下对多边形应用点状纹理。

于 2010-05-19T09:29:17.500 回答
1

如果您使用帧缓冲区,这相当简单。创建一个帧缓冲区并在其上绘制。现在在其中你有一个带有 RGBA 信息的纹理。将该纹理的像素数据放入 CPU 上的数组中,并使用该背景的绘制命令来绘制图像。通过这种方式,您可以为任何场景保留 Alpha 信息。
问题是它可能不像其他更多开销的解决方案一样快。

于 2010-05-19T10:13:55.820 回答