使用 OpenGL / LWJGL 绘制纹理四边形使用旧纹理

Posted

技术标签:

【中文标题】使用 OpenGL / LWJGL 绘制纹理四边形使用旧纹理【英文标题】:Drawing textured quad with OpenGL / LWJGL uses old texture 【发布时间】:2014-03-06 22:53:30 【问题描述】:

我正在绘制纹理四边形,但使用的纹理是以前绑定的,即使我正在尝试绑定新纹理。

在 GuiHandler.java 中创建纹理

    tex = GL11.glGenTextures();
    InputStream in = null;
    try 
        in = new FileInputStream(new File("res/gui.png"));
     catch (FileNotFoundException e) 
        e.printStackTrace();
    
    PNGDecoder decoder = null;
    try 
        decoder = new PNGDecoder(in);
     catch (IOException e) 
        e.printStackTrace();
    
    ByteBuffer buffer = BufferUtils.createByteBuffer(4 * decoder.getWidth()
            * decoder.getHeight());
    try 
        decoder.decode(buffer, decoder.getWidth() * 4,
                PNGDecoder.Format.RGBA);
     catch (IOException e) 
        e.printStackTrace();
    
    buffer.flip();
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D,
            GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D,
            GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
    GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0,
            GL11.GL_RGB8, decoder.getWidth(), decoder.getHeight(), 0,
            GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);

渲染代码

GL11.glPushAttrib(GL11.GL_TEXTURE_BINDING_2D);
    GL11.glLoadIdentity();
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, GuiHandler.tex);
    GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(gui.getX(), gui.getY());
    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(gui.getX()+gui.getWidth(), gui.getY());
    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(gui.getX()+gui.getWidth(), gui.getY()+gui.getHeight());
    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(gui.getX(), gui.getY()+gui.getHeight());
    //GL11.glRectf(gui.getX(), gui.getY(), gui.getWidth()+gui.getWidth(), gui.getY() + gui.getHeight());
    GL11.glEnd();
    GL11.glPopAttrib();

有谁知道为什么使用以前绑定的纹理而不是正确的纹理? PS我正在使用LWJGL

【问题讨论】:

【参考方案1】:

您的纹理创建代码实际上没有绑定新创建的纹理对象,而是更新了之前绑定的对象。

【讨论】:

@VivaDaylight3:只需在创建新纹理对象之后调用glBindTexture(但在glTexParameterglTexImage 调用之前)。但是,我不确定您是否真的想要每帧创建一个新的纹理对象 - 您可能只需要一个已更新的对象,如果没有进一步的上下文我无法判断。 嗯,我得到了同样的结果:/ 谢谢你的回复

以上是关于使用 OpenGL / LWJGL 绘制纹理四边形使用旧纹理的主要内容,如果未能解决你的问题,请参考以下文章

使用 lwjgl/opengl 进行简单裁剪

绘制带纹理的四边形 OpenGL

如何在OpenGL中将像素作为纹理绘制到多边形?

OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?

如何在 C++ 中将位图绘制为 OpenGL 纹理?

使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理