2012-12-10 248 views
1

我在我的OpenGL程序中繪製了一個帶有紋理的多邊形作爲HUD的一部分。Opengl紋理透明度.BMP

//Change the projection so that it is suitable for drawing HUD 
glMatrixMode(GL_PROJECTION); //Change the projection 
glLoadIdentity(); 
glOrtho(0, 800, 800, 0, -1, 1); //2D Mode 
glMatrixMode(GL_MODELVIEW); //Back to modeling 
glLoadIdentity(); 

//Draw the polygon with the texture on it 
glBegin(GL_POLYGON); 
glTexCoord2f(0.0, 1.0); glVertex3f(250.0, 680, 0.0); 
glTexCoord2f(1.0, 1.0); glVertex3f(570.0, 680, 0.0); 
glTexCoord2f(1.0, 0.0); glVertex3f(570.0, 800, 0.0); 
glTexCoord2f(0.0, 0.0); glVertex3f(250.0, 800, 0.0); 
glEnd(); 

//Change the projection back to how it was before 
glMatrixMode(GL_PROJECTION); //Change the projection 
glLoadIdentity(); 
gluPerspective(45.0, ((GLfloat)800)/GLfloat(800), 1.0, 200.0); //3D Mode 
glMatrixMode(GL_MODELVIEW); //Back to modeling 
glLoadIdentity(); 

問題是,我無法獲得圖像周圍的「框」與背景混合。我在Photoshop中打開了圖像(.bmp),並刪除了要顯示的圖像周圍的像素,但仍然繪製了整個矩形圖像。它使用我用glColor3f()使用的最後一種顏色對我刪除的像素進行着色,並且我可以讓整個圖像變得透明,但我只希望在Photoshop中刪除的像素透明。 有什麼建議嗎?

屬性,我使用貼圖:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, TextureList[i]->getSizeX(), TextureList[i]->getSizeY(), GL_RGB, GL_UNSIGNED_BYTE, TextureList[i]->getData()); 

這裏是我的節目的圖像。我試圖讓白框消失,但是當我用glColor4f()減少alpha時,整個圖像就會消失,而不僅僅是白框。
img607.imageshack.us/img607/51/ogly.png

,從文件加載紋理代碼:

texture::texture(string filename) 
{ 
// Routine to read a bitmap file. 
// Works only for uncompressed bmp files of 24-bit color. 
// Both width and height must be powers of 2. 
unsigned int size, offset, headerSize; 

// Read input file name. 
ifstream infile(filename.c_str(), ios::binary); 

// Get the starting point of the image data. 
infile.seekg(10); 
infile.read((char *) &offset, 4); 

// Get the header size of the bitmap. 
infile.read((char *) &headerSize,4); 

// Get width and height values in the bitmap header. 
infile.seekg(18); 
infile.read((char *) &sizeX, 4); 
infile.read((char *) &sizeY, 4); 

// Allocate buffer for the image. 
size = sizeX * sizeY * 24; 
data = new unsigned char[size]; 

// Read bitmap data. 
infile.seekg(offset); 
infile.read((char *) data , size); 

// Reverse color from bgr to rgb. 
int temp; 
for (unsigned int i = 0; i < size; i += 3) 
{ 
temp = data[i]; 
data[i] = data[i+2]; 
data[i+2] = temp; 
} 
} 
+0

你有什麼'GL_TEXTURE_WRAP_S'和'GL_TEXTURE_WRAP_T'設置爲?那麼GL_TEXTURE_ENV_MODE呢? – genpfault

+0

我添加了我用於紋理的屬性。 – Darius

回答

2

我在代碼中看不到glEnable(GL_BLEND)或glBlendFunc。你在做這個嗎?

另外,你有圖像中的alpha通道嗎?

編輯:你正在加載格式爲GL_RGB的紋理,你告訴OpenGL這個紋理沒有alpha。

  1. 您需要使用alpha透明度製作圖像。在這裏尋找GIMP教程或在這裏尋找Photoshop教程。
  2. 現在加載指示正確圖像格式的紋理。在互聯網上有很多「opengl alpha混合」教程 - here是一個C++和SDL視頻教程。

希望這會有所幫助!

+0

一個alpha通道似乎是一個問題,但我仍然無法讓它工作,無論我用Photoshop做它。你知道任何可能有幫助的教程嗎?我正在用Stephan指定的glBlend。這是我的程序的圖像。我試圖讓白框消失,但是當我用glColor4f()減少alpha時,整個圖像就會消失,而不僅僅是白框。 http://img607.imageshack.us/img607/51/ogly.png – Darius

+0

請爲我們提供您使用的實際紋理(圖像文件) - 如果混合狀態設置正確,則可能是紋理本身這是搞砸了。另外 - 請發佈從文件加載紋理的代碼部分。也有可能你不給OpenGL提供正確的像素格式。 – Ani

+0

這是原始圖像,雖然它最初是在.bmp中,並且在我上傳時轉換爲.png ... http://img803.imageshack.us/img803/503/11450210.png 我試過即Photoshop教程,但每當我嘗試以.bmp格式保存它時,它將填充用白色背景刪除的像素。 – Darius

0

要使用透明度通道(alpha通道),您需要同時生成BMP使用此通道的文件(如果您要求,Photoshop會執行此操作),並在生成mipmap並將圖像發送到視頻卡時指定正確的格式。

這樣,圖像將具有所需的透明度信息,OpenGl驅動程序將知道圖像具有此信息。

+0

Alpha通道似乎是一個問題,但無論我在Photoshop中做什麼,它仍然無法正常工作。你知道任何可能有幫助的教程嗎?這是我的程序的圖像。我試圖讓白框消失,但是當我用glColor4f()減少alpha時,整個圖像就會消失,而不僅僅是白框。 http://img607.imageshack.us/img607/51/ogly.png – Darius

+0

您的代碼還有其他一些問題。 gluBuild2DMipmaps的第二個參數應該是GLU_ *常量中的一個,而不是GL_ *。此外,嘗試使用GLU_RGBA或GLU_RGBA8而不是GL_RGB。看看這裏:http://www.opengl.org/sdk/docs/man2/xhtml/gluBuild2DMipmaps.xml –

1

如果我理解正確,你想透明處理你的紋理,是嗎? 如果是這樣,改變

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, TextureList[i]->getSizeX(), TextureList[i]->getSizeY(), GL_RGB, GL_UNSIGNED_BYTE, TextureList[i]->getData()); 

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, TextureList[i]->getSizeX(), TextureList[i]->getSizeY(), GL_RGBA, GL_UNSIGNED_BYTE, TextureList[i]->getData()); 

爲了允許Alpha通道,並打開與共混:

glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

UPDATE
據我知道, BMP不支持透明度(它們可以, ananthonline糾正我的意見,但你的應用程序必須支持這個)你應該嘗試下列格式之一,如果你IMAG編輯器不帶alpha支持BMP的:

  • PNG
  • TIFF(最近的變化)
  • TARGA
+0

這是我的程序的圖像。我試圖讓白框消失,但是當我用glColor4f()減少alpha時,整個圖像就會消失,而不僅僅是白框。 http://img607.imageshack.us/img607/51/ogly.png – Darius

+0

@ user1136506您需要確保圖像本身具有Alpha通道和透明背景(在您的Photoshop中執行此操作)。還要確保你的'gluBuild2DMipmaps'調用正在使用GL_RGBA。 –

+0

@ user1136506我在gluBuild2DMipmaps調用中修復了一個錯字,請嘗試一下。 –