当前位置: 首页 > 知识库问答 >
问题:

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

裴凯定
2023-03-14

在 OpenGL 中使用混合时,我有一个(希望)小问题。目前,我使用 LWJGL 和光滑的Util 来加载纹理。纹理本身是一个 2048x2048 png 图形,我在其中存储大小为 128x128 的图块,以便每行/列有 16 个 sprite。由于 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);
}

(Recangle4d只是一种将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();

感谢所有费心阅读这篇文章的人!

编辑:

共有1个答案

满昊然
2023-03-14

我阅读了一些相关问题,最终找到了解决方案(链接)。显然,当我想渲染无纹理对象(在这种情况下为彩色四边形)时,我不能/不应该一直启用GL_TEXTURE_2D!

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

 类似资料:
  • 我正在绘制一个纹理四边形,但使用的纹理是以前绑定的纹理,即使我试图绑定一个新纹理。 在GuiHandler中创建纹理。Java语言 渲染代码 有人知道为什么使用先前绑定的纹理而不是正确的纹理吗?P、 我正在使用LWJGL

  • 假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但

  • 我有一个有两个纹理的全屏四块。 我想根据用户选择混合任意形状的两个纹理。 例如,quad一开始是100%texture0,而texture1是透明的。 为了实现任意形状,我假设我需要创建一个与texture0和texture1大小相同的alpha mask纹理? 然后我把纹理传递给frag shader来检查值,如果值是0,那么texture0,如果值是1,那么混合texture0和texture

  • 我是OpenGL新手。我将Java与LWJGL和Slick一起使用。到目前为止,我可以绘制多个纹理,使用缓冲区,我可以将屏幕上显示的图像复制到一个纹理,以便进行后处理。使用glColor3f()可以使屏幕具有所需的颜色(仅蓝色、仅红色、仅显示蓝色和绿色通道等)。 但是glColor3f(r, g, b)所做的只是将r, g, b的值乘以当前像素。如果R,G,B是像素的当前值,那么glColor对所

  • 我试图用lwjgl创建一个简单的OpenGL程序,但目前我还停留在创建纹理渲染上。 我得到的错误是一个分段错误: 机器信息: 有问题的JVM线程堆栈: 最后是我处理纹理创建的代码: 我创建的图像类工作得很好,我使用的示例图像是2 x 2像素,并且具有12字节长度的内部缓冲区,因此segvault不应该由太短的缓冲区引起。

  • 我正在尝试在OpenGL/LWJGL中制作一个简单的按钮, 我可以正确地渲染我的2D四边形,但是当我实现纹理时,整个四边形只有大约3/4的部分得到了纹理,就像这样:https://dl.dropboxusercontent.com/u/60223805/glerror1.png 如果我删除纹理坐标,我得到这个:https://dl.dropboxusercontent.com/u/60223805