我有一種情況,我試圖在不使用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);
這確實沒有很好的答案。簡單的事實是(特別是對於較舊的硬件)英特爾對OpenGL的實現相當糟糕。關於你所能做的就是避免使用不起作用的功能。例如,您可能能夠捕獲另一個矩形,然後將其用作OpenGL中的紋理,然後將矩形與該矩形混合。當然,這也可能不起作用(我似乎還記得混合的一些問題,但它們可能已被修復)。 – 2010-05-18 22:48:54
是的,我想這是事實。實際上,我正在開發一款帶有蹩腳英特爾卡的舊機器,用於另一臺配備蹩腳英特爾卡的舊機器,因爲我複製了我遇到的幾個問題,而這是我無法解決的最後一個問題。原來只侷限於我的測試機器,所以我認爲它必定是一個bug,我不需要擔心它。 – 2010-05-18 23:38:21