gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:45:36 25 4
gpt4 key购买 nike

在 OpenGL 中使用混合时,我遇到了一个(希望是)小问题。目前我使用 LWJGL 和 Slick-Util 来加载纹理。纹理本身是一个 2048x2048 png 图形,我在其中存储大小为 128x128 的图 block ,以便每行/列有 16 个 Sprite 。由于 glTexCoord2f() 使用标准化坐标,我编写了一个小函数来缩放整个图像以仅显示我想要的 Sprite 。它看起来像这样:

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、宽度和高度存储为双坐标的类型)

现在的问题是,一旦我使用这些坐标, Sprite 就会正确显示,透明度也能正常工作,只是其他所有东西都变得明显更暗(我猜更正确的是它变得透明,但因为 ClearColor 是黑色的)。然而, Sprite 本身是正确绘制的。我已经尝试将所有 glColor3d(..) 更改为 glColor4d(..) 并将 alpha 设置为 1d,但这并没有改变任何内容。 Sprite 是当前唯一的图像,其他所有内容都只是彩色四边形。

这是我初始化 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):

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();

结果是这样的( Sprite 被正确绘制,只是其他一切都变暗/透明): How it looks after assigning the Texture to the quad没有纹理(只是一个灰色的四边形),它看起来像这样(现在一切都正确绘制,除了我没有 Sprite ): How it looks without assigning a texture to the quad

感谢所有愿意阅读本文的人!

<小时/>

编辑:

一些附加信息,来 self 尝试查找问题的过程:这是我将 ClearColor 设置为白色时的样子(使用 glClearColor(1, 1, 1, 1) ): Setting ClearColor to white

我尝试的另一件事是在绘制玩家之前启用混合,并在完成绘制后再次禁用它: this happens while only using blending when drawing the player (blackclear)

现在好一点了,但仍然明显更暗。在这种情况下,它确实看起来“更暗”而不是“更透明”,因为当我使用白色作为透明颜色时是一样的(同时仍然只在需要时启用混合并在之后立即禁用它),如下所示: this happens while only using blending when drawing the player (whiteclear)

最佳答案

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

所以现在,我仅在渲染 Sprite 之前启用它,然后在绘制 Sprite 后再次禁用它。现在可以完美运行了! :)

关于java - 使用 png 纹理时使用 opengl(通过 lwjgl)的混合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15463700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com