代码之家  ›  专栏  ›  技术社区  ›  Bill Prin

OpenGL多边形点画不在不同的机器上工作

  •  2
  • Bill Prin  · 技术社区  · 15 年前

    我有一种情况,我试图在不使用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);
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Goz    15 年前

    尝试在禁用过滤的情况下将点画纹理应用到多边形。

        2
  •  1
  •   Sanctus2099    15 年前

    如果使用帧缓冲区,这相当简单。 创建一个帧缓冲区并在其上绘制。现在在它里面你有了一个包含rgba信息的纹理。将纹理的像素数据放入CPU上的数组中,并使用该背景的draw命令绘制图像。这样就可以为任何场景保存alpha信息。
    问题是,它可能不像其他开销更大的解决方案那样快。

    推荐文章