我在OpenGL中有一個很大的問題,主要是透明度問題。我試圖通過首先顯示一個簡單的紋理,然後再顯示一個更詳細的紋理來複制多層背景(例如,第一個將是藍色,第二個將包含山脈和東西)。我有這個幾乎工作,但我有一個奇怪的結果,我不知道如何解決它。OpenGL/Qt:紋理透明膠片不工作
我基本上希望我的第二個紋理中的黑色不會出現。我有這個工作,但我的山棕色似乎與第一個背景紋理混合(或添加到它)。我的棕色山脈呈現淡紅色。我的glBlendFunc當前位於GL_ONE,但我嘗試過使用GL_ONE_MINUS_SRC_ALPHA來改變任何內容;黑色仍然在那裏,山還是棕色的。
我試過三種不同格式的圖像,沒有區別(BMP,JPG和PNG)。
下面是我有兩個紋理代碼:
紋理1:
if (buf.load("images/background-layer1.png"))
{
tex1 = QGLWidget::convertToGLFormat(buf);
glPushAttrib(GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT);
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, tex1.width(), tex1.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits());
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2d(m_pBottomLeft.x, m_pBottomLeft.y); //Bottom Left
glTexCoord2f(1, 0);
glVertex2d(m_pBottomRight.x, m_pBottomRight.y); //Bottom Right
glTexCoord2f(1, 1);
glVertex2d(m_pTopRight.x, m_pTopRight.y); //Top Right
glTexCoord2f(0, 1);
glVertex2d(m_pTopLeft.x, m_pTopLeft.y); //Top Left
glEnd();
glDisable(GL_TEXTURE_2D);
glPopAttrib();
}
紋理2:
if (buf2.load("images/background-layer2.png"))
{
tex2 = QGLWidget::convertToGLFormat(buf2);
glPushAttrib(GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glGenTextures(2, &texture[1]);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex2.width(), tex2.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex2.bits());
glBegin(GL_QUADS);
glColor4f(1, 1, 1, 1);
glTexCoord2f(0, 0);
glVertex2d(m_pBottomLeft.x, m_pBottomLeft.y); //Bottom Left
glTexCoord2f(1, 0);
glVertex2d(m_pBottomRight.x, m_pBottomRight.y); //Bottom Right
glTexCoord2f(1, 1);
glVertex2d(m_pTopRight.x, m_pTopRight.y); //Top Right
glTexCoord2f(0, 1);
glVertex2d(m_pTopLeft.x, m_pTopLeft.y); //Top Left
glEnd();
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glPopAttrib();
}
截圖:
您的山區質地是否包含有效的alpha通道? – rotoglup
這聽起來似乎很愚蠢,但我怎麼弄出來或添加一個? – Starforsaken101
哎喲,很大的問題...... alpha通道允許你的圖像的一部分透明,就像你想要的黑色部分。您可以使用圖像編輯軟件來檢查/創建一個。例如,請參閱GIMP:http://docs.gimp.org/en/gimp-using-web-transparency.html – rotoglup