2011-05-03 74 views
3

我對OpenGL有點新鮮。我正在製作一個2D應用程序,並且我定義了一個Quad類,它定義了一個帶有紋理的正方形。它從紋理圖集中加載這些紋理,並正確執行此操作。一切正常紋理的作品,紋理正確顯示,但紋理圖像不是正方形時不正確顯示。例如,我想要一個Quad具有明星紋理,並且要顯示星星,並且仍然位於Quad中的星形圖像周圍的區域是透明的。但最終發生的事情是這顆恆星顯示出來很好,然後是我的紋理圖集中的另一個紋理,它填充了Quad。我認爲它背後的紋理只是我加載到系統中的最後一個紋理?無論哪種方式,我不希望那個紋理顯示出來。OpenGL非方形紋理

這是我的意思。我想明星,但不是雲十歲上下的紋理背後顯示出來:
enter image description here

我的渲​​染功能的重要組成部分是:

glDisable(GL_CULL_FACE); 
glVertexPointer(vertexStride, GL_FLOAT, 0, vertexes); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(colorStride, GL_FLOAT, 0, colors); 
glEnableClientState(GL_COLOR_ARRAY); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates); 

//render 
glDrawArrays(renderStyle, 0, vertexCount); 
+0

非方形紋理呢?這似乎是一個混合相關的問題。問題標題有誤導性...... – Luca 2011-05-03 19:00:06

回答

3

這似乎是顯而易見的選擇將是使用RGBA紋理,並通過將α通道設置爲零來爲這些像素(併爲紋理單元啓用alpha混合)使星形透明。

+0

那麼我需要弄清明星的像素來做到這一點嗎?明星紋理是一個具有透明背景和星形的PNG,我認爲顯示紋理會顯示具有透明背景的星形。 – 2011-05-03 15:41:30

+1

@Mike:很難猜測 - 它將取決於您用來加載PNG並將其轉換爲紋理的軟件。在某種程度上,這聽起來像是你得到了某種透明度,但不清楚透明度在哪裏出現。 – 2011-05-03 15:49:54

1

使用圖像處理程序。 Photoshop是一個偉大的,瘸腿是一個免費的。你並沒有真正使用OpenGL來裁剪你的紋理。相反,你的紋理需要事先準備好你的程序。

應該有某種非常簡單的工具去除星星外的所有東西。刪除,我的意思是使其透明,這將需要一個alpha通道。這意味着您需要確保在程序中加載紋理的方式考慮了32位顏色(RGBA - 紅色,綠色,藍色,alpha),而不僅僅是24位顏色(RGB - 紅色,綠色,藍色)。

這將使你明星透明或透明背後的一切。另外,只是一個事後考慮,它看起來像你可以從互聯網上取得版權的圖像,並在你的遊戲/程序中使用它。如果您正在做商業廣告,我強烈建議您創建自己的紋理。

+0

好的,我會試試這個。哦,我目前使用的圖像僅用於開發測試。我將在最終產品中使用的圖像將在內部進行製作。 – 2011-05-03 20:04:59

0

你想調用glBindTexture(GL_TEXTURE_2D,0);您映射紋理 這裏後,從被寫入

  // Bind the texture 
    glBindTexture(GL_TEXTURE_2D, image.getID()); 

    // Draw a QUAD with setting texture coordinates 
    glBegin(GL_QUADS); 
    { 
     // Top left corner of the texture 
     glTexCoord2f(0, 0); 
     glVertex2f(x, y); 

     // Top right corner of the texture 
     glTexCoord2f(image.getRelativeWidth(), 0); 
     glVertex2f(x+image.getImageWidth(), y); 

     // Bottom right corner of the texture 
     glTexCoord2f(image.getRelativeWidth(), image.getRelativeHeight()); 
     glVertex2f(x+image.getImageWidth()-20, y+image.getImageHeight()); 

     // Bottom left corner of the texture 
     glTexCoord2f(0, image.getRelativeHeight()); 
     glVertex2f(x+20, y+image.getImageHeight()); 
    } 
    glEnd(); 
    glBindTexture(GL_TEXTURE_2D, 0); 

我不是專家的一些代碼香港專業教育學院的例子,但是這無疑解決您所遇到什麼我。

+0

這當然考慮到雲不是你圖片的一部分。 – 2013-11-02 18:32:23