2010-05-18 71 views
2

我有一种情况,我试图在不使用openGL的背景上画一个半透明的矩形,所以我不能使用混合。我决定使用多边形点画作为某些人推荐的'屏幕门透明度'效果。它在我的机器和其他一些机器上运行良好,但在一些使用稍旧的英特尔图形卡的机器上,它根本无法呈现矩形。如果我关闭多边形点画,它渲染罚款(但没有点画)。我比较了许多我认为可能会影响它的状态变量(参见代码),它们都是一样的,而且我没有任何错误。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); 
+0

这确实没有很好的答案。简单的事实是(特别是对于较旧的硬件)英特尔对OpenGL的实现相当糟糕。关于你所能做的就是避免使用不起作用的功能。例如,您可能能够捕获另一个矩形,然后将其用作OpenGL中的纹理,然后将矩形与该矩形混合。当然,这也可能不起作用(我似乎还记得混合的一些问题,但它们可能已被修复)。 – 2010-05-18 22:48:54

+0

是的,我想这是事实。实际上,我正在开发一款带有蹩脚英特尔卡的旧机器,用于另一台配备蹩脚英特尔卡的旧机器,因为我复制了我遇到的几个问题,而这是我无法解决的最后一个问题。原来只局限于我的测试机器,所以我认为它必定是一个bug,我不需要担心它。 – 2010-05-18 23:38:21

回答

1

尝试在过滤器关闭的情况下将多边形纹理应用于多边形。

+0

谢谢,我会试试这个。 – 2010-05-19 13:33:52

1

如果您使用帧缓冲区,这非常简单。 创建一个帧缓冲区并在其上绘制。现在,您拥有了RGBA信息的纹理。将纹理的像素数据获取到CPU上的数组中,并使用该背景的绘制命令绘制图像。这样你可以为任何场景保存alpha信息。
问题是,它可能不像其他更多的架空解决方案一样快。

+0

这听起来有点复杂,但我会调查。帧缓冲区是指帧缓冲区对象吗?我不需要它来支持它可能不支持的扩展吗? – 2010-05-19 13:34:52