我有一种情况,我试图在不使用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);发布于 2010-05-19 17:29:18
尝试在禁用过滤的情况下将点画纹理应用于多边形。
发布于 2010-05-19 18:13:56
如果您使用帧缓冲区,这是相当简单的。创建一个帧缓冲区并在其上绘制。现在,在其中有一个包含RGBA信息的纹理。将该纹理的像素数据放入CPU上的数组中,并使用该背景的绘制命令来绘制图像。这样,您可以保留任何场景的alpha信息。
问题是,它可能没有其他更多开销的解决方案那么快。
https://stackoverflow.com/questions/2861642
复制相似问题