Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用png纹理时使用opengl(通过lwjgl)的混合问题_Java_Opengl_Lwjgl_Alphablending - Fatal编程技术网

Java 使用png纹理时使用opengl(通过lwjgl)的混合问题

Java 使用png纹理时使用opengl(通过lwjgl)的混合问题,java,opengl,lwjgl,alphablending,Java,Opengl,Lwjgl,Alphablending,在OpenGL中使用混合时,我(希望)遇到了一个小问题。 目前我使用LWJGL和Slick Util加载纹理。 纹理本身是一个2048x2048 png图形,我在其中存储大小为128x128的瓷砖,因此每行/每列有16个精灵。 因为glTexCoord2f()使用标准化坐标,所以我编写了一个小函数来缩放整个图像,以便只显示我想要的精灵。 看起来是这样的: private Rectangle4d getTexCoord(int x, int y) { double row = 0, col

在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);
}
(矩形4D只是一种将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);
下面是我如何加载sprite(使用slick util):

最后,我将其呈现为这样(使用顶部提到的帮助函数getTexCoord()):

结果是这样的(精灵绘制正确,其他颜色都较暗/透明): 如果没有纹理(只有一个灰色四边形),它看起来是这样的(现在所有的东西都正确绘制了,除了我没有精灵):

感谢所有费心阅读此文的人


编辑

从我查找问题的尝试中获得的一些其他信息: 这是我将ClearColor设置为白色时的外观(使用glClearColor(1,1,1,1)):

我尝试的另一件事是在我绘制播放器之前启用混合,并在我完成绘制后再次禁用它:

现在好一点了,但是颜色还是很暗。在这种情况下,它似乎真的“更暗”而不是“更透明”,因为我使用白色作为清晰颜色时,它是相同的(同时仍然只在需要时启用混合,并在需要后立即禁用),如下所示:

我读了一些相关的问题,最终找到了解决方案()。显然,当我想要渲染无纹理对象(本例中为彩色四边形)时,我不能/不应该一直启用GL_TEXTURE_2D


所以现在,我只在渲染精灵之前启用它,然后在绘制精灵后再次禁用它。它现在工作得很好!:)

这是一个有趣的结果。如果禁用混合,会发生什么?整个屏幕都变黑了吗?当我禁用混合时,所有东西都正确绘制,除了精灵中原本不可见的部分是白色。好吧,你把我难住了。如果尝试注释掉代码的其他绘图部分,会发生什么情况?如果你把透明的颜色改成白色而不是黑色,会发生什么呢?谢谢你的评论,我在开场白中添加了更多的细节和屏幕。
texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/sprites.png"));
    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();