【问题标题】:Drawing textured quads OpenGL not working绘制纹理四边形OpenGL不起作用
【发布时间】:2013-08-14 10:13:38
【问题描述】:

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

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

我正在使用 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 时,一切正常......但使用颜色而不是纹理。我在这里犯了一个菜鸟错误吗?

【问题讨论】:

  • 这些枚举数中的任何一个都对调用glBegin (...) 无效。您应该传递原始类型(例如 GL_QUADS)
  • 嗯,这很奇怪,因为我最初从教程中复制并粘贴了该部分。

标签: java opengl png textures lwjgl


【解决方案1】:

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

glBegin 方法和 primitive mode GLenum。

因此,您可以使用:

  • 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);。

额外

还请记住,glVertex、glNormal、glTexCoord 等方法已弃用且不应使用。您应该使用 VBO 和着色器。 如果您正在学习 OpenGL,那么请继续使用已弃用的方法,因为它们很好并且在学习时易于使用!

【讨论】:

  • 感谢您抽出宝贵时间陪伴我。我会尝试一下,然后更新我的结果。
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多