簡體   English   中英

使用png紋理時使用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)): 將ClearColor設置為白色

我嘗試的另一件事是在繪制播放器之前啟用混合,並在完成繪制后立即禁用它: 僅在繪制播放器時使用混合時會發生這種情況(blackclear)

現在好一點了,但仍然明顯更暗。 在這種情況下,它確實似乎是“暗”而不是“更透明”,因為當我使用白色作為純色時,它是相同的(雖然仍然僅在需要時啟用混合,然后立即禁用它),如下所示: 僅在繪制播放器時使用混合時會發生這種情況(whiteclear)

我閱讀了一些相關問題,並最終找到了解決方案( Link )。 顯然,當我想渲染無紋理的對象(在這種情況下為彩色四邊形)時,我不能/應該一直沒有啟用GL_TEXTURE_2D!

因此,現在,僅在渲染精靈之前啟用它,然后在繪制精靈后再次禁用它。 現在可以正常工作了! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM