![](/img/trans.png)
[英]Problems drawing VBO with glDrawArrays using OpenGL/LWJGL
[英]Blending problems using opengl (via lwjgl) when using a png texture
在OpenGL中使用混合時,我有一個(希望)有一個小問題。 目前,我使用LWJGL和Slick-Util加載紋理。 紋理本身是一個2048x2048 png圖形,其中存儲了128x128大小的圖塊,因此每行/列有16個精靈。 由於glTexCoord2f()使用歸一化的坐標,因此我編寫了一個小函數來縮放整個圖像,以僅顯示我想要的精靈。 看起來像這樣:
private Rectangle4d getTexCoord(int x, int y) {
double row = 0, col = 0;
if(x > 0)
row = x/16d;
if(y > 0)
col = y/16d;
return new Rectangle4d(row, col, 1d/16d, 1d/16d);
}
(Rectangle4d只是一種將x,y,寬度和高度存儲為雙坐標的類型)
現在的問題是,一旦我使用了這些坐標,精靈就可以正確顯示,透明度也可以正常工作,只是其他所有東西都變得更暗(我猜更正確的是,它變得透明了,但是由於ClearColor是黑色的)。 但是,精靈本身已正確繪制。 我已經嘗試將所有的glColor3d(..)更改為glColor4d(..),並將alpha設置為1d,但這並沒有任何改變。 目前,子畫面是唯一的圖片,其他所有內容均為彩色方形。
這是我初始化OpenGL的方法:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
這是我如何加載精靈(使用slick-util):
texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/sprites.png"));
最后,我這樣渲染它(使用頂部提到的輔助函數getTexCoord()):
texture.bind();
glColor4d(1, 1, 1, 1);
glBegin(GL_QUADS);
{
Rectangle4d texCoord = getTexCoord(0, 0);
glTexCoord2f((float)texCoord.getX(), (float)texCoord.getY());
glVertex2i((Game.WIDTH-PLAYERSIZE)/2, (Game.HEIGHT-PLAYERSIZE)/2);
glTexCoord2f((float)texCoord.getX()+(float)texCoord.getWidth(), (float)texCoord.getY());
glVertex2i((Game.WIDTH+PLAYERSIZE)/2, (Game.HEIGHT-PLAYERSIZE)/2);
glTexCoord2f((float)texCoord.getX()+(float)texCoord.getWidth(), (float)texCoord.getY()+(float)texCoord.getHeight());
glVertex2i((Game.WIDTH+PLAYERSIZE)/2, (Game.HEIGHT+PLAYERSIZE)/2);
glTexCoord2f((float)texCoord.getX(), (float)texCoord.getY()+(float)texCoord.getHeight());
glVertex2i((Game.WIDTH-PLAYERSIZE)/2, (Game.HEIGHT+PLAYERSIZE)/2);
}
glEnd();
結果是這樣(精靈被正確繪制,只是其他所有元素都更暗/透明): 沒有紋理(只是一個灰色的四邊形),它看起來像這樣(現在一切都正確繪制了,除了我沒有精靈):
感謝所有不願閱讀此書的人!
編輯 :
我嘗試查找問題時得到一些其他信息:這是將ClearColor設置為白色時的外觀(使用glClearColor(1,1,1,1)):
我嘗試的另一件事是在繪制播放器之前啟用混合,並在完成繪制后立即禁用它:
現在好一點了,但仍然明顯更暗。 在這種情況下,它確實似乎是“暗”而不是“更透明”,因為當我使用白色作為純色時,它是相同的(雖然仍然僅在需要時啟用混合,然后立即禁用它),如下所示:
我閱讀了一些相關問題,並最終找到了解決方案( Link )。 顯然,當我想渲染無紋理的對象(在這種情況下為彩色四邊形)時,我不能/應該一直沒有啟用GL_TEXTURE_2D!
因此,現在,僅在渲染精靈之前啟用它,然后在繪制精靈后再次禁用它。 現在可以正常工作了! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.