2010-05-18 48 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