LWJGL OpenGL 不会绘制 2D 纹理

Posted

技术标签:

【中文标题】LWJGL OpenGL 不会绘制 2D 纹理【英文标题】:LWJGL OpenGL won't draw 2D texture 【发布时间】:2019-04-02 10:50:26 【问题描述】:

我正在尝试创建一些用于在 LWJGL 中加载和绘制 2D 纹理的代码。这是我的绘图代码:

glfwShowWindow(window);
GL.createCapabilities();
loadTextures();
glClearColor(1f, 1f, 1f, 1f);

while (!glfwWindowShouldClose(window))

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //draw

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glPushMatrix();
    glTranslatef(100, 100, 0);
    glBindTexture(GL_TEXTURE_2D, testTexture);
    glBegin(GL_QUADS);
    
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);

        glTexCoord2f(1, 0);
        glVertex2f(TEXTURE_WIDTH, 0);

        glTexCoord2f(1, 1);
        glVertex2f(TEXTURE_WIDTH, TEXTURE_HEIGHT);

        glTexCoord2f(0, 1);
        glVertex2f(0, TEXTURE_HEIGHT);
     

     glEnd();
     glPopMatrix();

    //end draw

    glfwSwapBuffers(window);
    glfwPollEvents();


glfwFreeCallbacks(window);
glfwDestroyWindow(window);
glfwTerminate();
glfwSetErrorCallback(null).free();

这是我的纹理加载代码:

try

    BufferedImage image = ImageIO.read(file);
    /*
    if (image.getType() != BufferedImage.TYPE_INT_ARGB)
    
        throw new TextureException("Invalid image!");
    
    */
    int[] pixels = new int[image.getWidth() * image.getHeight()];
    image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
    ByteBuffer byteBuffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);

    for (int x = 0; x < image.getWidth(); x++)
    
        for (int y = 0; y < image.getHeight(); y++)
        
            int pixel = pixels[y * image.getWidth() + x];
            byteBuffer.put((byte)((pixel >> 16) & 0xFF));
            byteBuffer.put((byte)((pixel >> 8) & 0xFF));
            byteBuffer.put((byte)(pixel & 0xFF));
            byteBuffer.put((byte)((pixel >> 24) & 0xFF));
        
    

    byteBuffer.flip();
    int textureID = glGenTextures();
    glBindTexture(GL_TEXTURE_2D, textureID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, byteBuffer);
    return textureID;

catch (Exception e)

    e.printStackTrace();
    throw new TextureException("Failed to load image!");

但是,当我运行此代码时,我得到的只是一个白屏。我检查了 testTexture 的值,它被设置为 1,所以我认为这是纹理的 ID,这让我相信它有效,但我认为绘制时出现了问题。

【问题讨论】:

【参考方案1】:

二维纹理必须由glEnable 启用,并且可以由glDisable 禁用:

glEnable(GL_TEXTURE_2D);

如果启用了纹理,则当几何图形由glBegin/glEnd 序列绘制时,将应用当前绑定的纹理。


如果要在窗口(像素)坐标中绘制几何图形,则必须设置正交投影。可以通过glOrtho设置正投影。 如果不设置正交投影,则顶点坐标必须在 [-1.0, 1.0] 范围内的标准化设备空间中。

在下面的windowWidthwindowHeight 中假定为窗口的宽度和高度:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);

while (!glfwWindowShouldClose(window))

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    // [...]

【讨论】:

我添加了那行,但什么也没发生。我是在绘制之前启用并在绘制之后禁用吗? 我在 glEnable(GL_BLEND) 后面加了 glEnable(GL_TEXTURE_2D) 行,还是没有区别。 感谢您的编辑。我正在使用我在某处找到的一个示例,但我忘记包含一些内容,而您的解释使这些内容更容易理解。

以上是关于LWJGL OpenGL 不会绘制 2D 纹理的主要内容,如果未能解决你的问题,请参考以下文章

绘制到纹理不起作用 LWJGL

在 OpenGL 中绘制多个 2D 纹理

使用 OpenGL ES 2.0 绘制 2D 图像

OpenGL纹理不会绘制

OpenGL ES 渲染到纹理,然后绘制纹理

基于OpenGL编写一个简易的2D渲染框架-04 绘制图片