有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java绘图纹理四边形OpenGL不工作

我正在尝试渲染一组纹理四边形

我可以使用彩色四边形进行渲染,但不能使用纹理四边形(屏幕显示为空)

我正在使用LWJGL和PNGDecoder

初始化我的OGL的代码:

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 800, 0, 600, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glEnable(GL11.GL_TEXTURE_2D);

解码我的图像的代码:

ByteBuffer buffer = null;
InputStream in = ClassLoader.getSystemResourceAsStream(filename);
try {
    buffer = decodeStreamToBuffer(in);
} finally {
    in.close();
}
return buffer;

我的decodeStreamToBuffer(InputStream in)

PNGDecoder decoder;
ByteBuffer buf = null;
try {
    decoder = new PNGDecoder(in);

    buf = ByteBuffer.allocateDirect(4*decoder.getWidth()*decoder.getHeight());
    decoder.decode(buf, decoder.getWidth()*4, Format.RGBA);
    buf.flip();
} catch (Exception e) {
    e.printStackTrace();
}

return buf;

我的渲染代码:

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    GL11.glColor3f(0.5f, 0.5f, 1.0f); //Still there to test color quads.

    // draw quad
    GL11.glPushMatrix();
        GL11.glTranslatef(screencenter.getX(), screencenter.getY(), 0);
        GL11.glScalef(1f, 0.5f, 1f);
        GL11.glRotatef(camRotation, 0f, 0f, 1f);
        GL11.glTranslatef(-screencenter.getX(), -screencenter.getY(), 0);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
        GL11.glBegin(GL11.GL_TEXTURE_2D);

            GL11.glTexCoord2f(0.0f, 0.0f);
            GL11.glVertex2f(0, 0);

            GL11.glTexCoord2f(1.0f, 0.0f);
            GL11.glVertex2f(32, 0);

            GL11.glTexCoord2f(1.0f, 1.0f);
            GL11.glVertex2f(32, 32);

            GL11.glTexCoord2f(0.0f, 1.0f);
            GL11.glVertex2f(0, 32);

        GL11.glEnd();

    GL11.glPopMatrix();

当我不使用纹理绑定并将GL_TEXTURE_2D更改为GL_MODELVIEW时,一切都会正常工作。。。但是用颜色而不是纹理。我是不是犯了个错误


共 (1) 个答案

  1. # 1 楼答案

    这是错误的GL11.glBegin(GL11.GL_TEXTURE_2D);

    {}方法是一种{}{}

    因此,您可以使用:

    • GL_POINTS
    • GL_LINES
    • GL_LINE_STRIP
    • GL_LINE_LOOP
    • GL_TRIANGLES
    • GL_TRIANGLE_STRIP
    • GL_TRIANGLE_FAN
    • GL_QUADS
    • GL_QUAD_STRIP
    • GL_POLYGON

    使用的模式指定要渲染的内容。在本例中,您需要编写GL_QUADS代码,因此要修复代码,您需要将GL11.glBegin(GL11.GL_TEXTURE_2D);替换为GL11.glBegin(GL11.GL_QUADS);

    额外

    还请记住glVertexglNormalglTexCoord等方法已被弃用,不应使用。假设您使用VBO和着色器但是如果您正在学习OpenGL,那么请继续使用不推荐的方法,因为它们在学习时很好用