2012-10-20 84 views
0

我的問題是在背景圖像上方或上方繪製多邊形或其他OpenGL基元。總結像不同層次的塗料,但在OpenGL中,我認爲沒有圖層。在背景圖像上方繪製多邊形

現在我正在做一些測試,試圖在背景圖像上繪製一個三角形和一條線。

要繪製背景,我使用OpenGL窗口大小的正方形,然後將png圖像應用於此正方形作爲紋理。

之後,我嘗試繪製三角形和不同顏色的線條,但除了背景圖像外沒有看到任何東西。

我玩alpha通道,但我什麼也沒看到。

代碼:

void init() 
{ 
    // glClearColor(0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); 

    // The following two lines enable semi transparent 
    glEnable(GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    int width, height; 
    bool hasAlpha; 
    char filename[] = "prueba-luz.png"; 
    bool success = loadPngImage(filename, width, height, hasAlpha, &textureImage); 

    if (!success) 
    { 
     cout << "Unable to load png file" << endl; 
     return; 
    } 

    cout << "Image loaded " << width << " " << height << " alpha " << hasAlpha << endl; 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    glTexImage2D(GL_TEXTURE_2D, 0, hasAlpha ? 4 : 3, width, 
       height, 0, hasAlpha ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, 
       textureImage); 

    // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
} 

void display(void) 
{ 
    glEnable(GL_TEXTURE_2D); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); // Igual que GL_REPLACE pero se le puede aplicar transparencias a la textura 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    glPushMatrix(); 

    glColor4f(1, 1, 1, 1); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glBegin(GL_QUADS); 
     glTexCoord2i(0,0); glVertex2i(10, -10); 
     glTexCoord2i(1,0); glVertex2i(-10, -10); 
     glTexCoord2i(1,1); glVertex2i(-10, 10); 
     glTexCoord2i(0,1); glVertex2i(10, 10); 
    glEnd(); 

    glPopMatrix(); 

    glDisable(GL_TEXTURE_2D); 

    glBegin(GL_POLYGON); 
     glColor4f(1.0, 1.0, 1.0, 0.8); 
     glVertex3f(-1.0f, -3.0f, 0.0f); // A 
     glVertex3f(1.0f, -3.5f, 0.0f); // B 
     glVertex3f(0.0f, 0.5f, 0.0f); // C 
    glEnd(); 

    glBegin(GL_LINES); 
     glColor4f(1.0, 0.0, 0.0, 0.8); 
     glVertex2f(-8.0, 6.0); 
     glVertex2f (5.0, -3.0); 
    glEnd(); 

    glutSwapBuffers(); 
} 

怎樣繪製一幅圖像在背景圖像???

回答

9

有些事發現:

  • 嘗試禁用深度測試。您正在繪製Z = 0處的所有內容,並且您的應用程序肯定會寫入深度緩衝區。我不確定爲什麼你在這裏啓用深度測試,因爲你繪製的所有東西都在Z = 0。
  • 默認情況下,當啓用深度測試時,寫入相同或更高Z值的所有片段將被丟棄。這可以通過glDepthFunc(默認值GL_LESS)進行更改。這可能是你在這個例子中丟棄了幾何圖形的原因。
  • 繪製2D幾何圖形並不意味着深度緩衝區不會受到影響。 OpenGL將繪製Z = 0的幾何圖形,並將其寫入深度緩衝區。

目前沒有理由讓您的應用程序使用深度測試,除非您在不同的z位置繪製幾何圖形。您可以在2D圖形中使用深度測試,通過爲每個對象分配不同的z值來製作「圖層」。

使用z-culling進行2D繪圖的一個好的做法是首先繪製閉合層,然後再繪製層。這樣可以確保您寫入更少的片段。

例如:

  • Z = 0:繪製非透明覆蓋
  • Z = -1:繪製的東西隱藏在背後覆蓋
  • Z = -2:繪製背景

但是,透明對象需要特殊的規則。

您需要控制您的深度緩衝區。選項有:

  • glEnable/Disable(GL_DEPTH_TEST):啓用或禁用的z剔除
  • glDepthMask(GL_TRUE/GL_FALSE):啓用或禁用寫入深度緩衝器
  • glDepthFunc可以用來定義片段如何丟棄)

請注意,這裏的兩個第一功能爲您提供了比您想象的更多的選擇

  • 深度剔除和深度寫繪圖對象時
  • 深度剔除,但你的對象不影響深度緩衝
  • 沒有深度剔除,但你的對象將會寫入深度緩存
  • 沒有深度剔除和沒有深度寫

如果你想畫的所有的透明物體在最後一關可以例如啓用深度測試,因此對象不會在上面你對你的覆蓋面上繪製,但您禁用深度寫入,因爲你希望能夠在該圖層中繪製多個重疊對象。

使用你的創造力和學習愛深度緩衝:D

+0

感謝您的這個偉大的解釋。 –

+0

您還可以利用模板緩衝區進行額外的遮罩。 DEPTH24_STENCIL8深度緩衝區格式可用於此目的。 – Grimmy