【问题标题】:LWJGL OpenGL texturing not correctLWJGL OpenGL 纹理不正确
【发布时间】:2013-08-13 01:50:28
【问题描述】:

我正在尝试在 OpenGL/LWJGL 中制作一个简单的按钮,

我可以正确渲染我的 2D QUAD,但是当我实现纹理时,整个四边形只有大约 3/4 部分被纹理化,如下所示:https://dl.dropboxusercontent.com/u/60223805/glerror1.png

如果我删除纹理坐标,我会得到:https://dl.dropboxusercontent.com/u/60223805/glerror2.png

     none.bind();

     co.Enable2D_GUI();
     GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(co.width/2-200, co.height/2);
    GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(co.width/2+none.getTextureWidth(),co.height/2);
    GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(co.width/2+none.getTextureWidth(), co.height/2+none.getTextureHeight());
    GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(co.width/2-200, co.height/2+none.getTextureHeight());
     GL11.glEnd();
     co.Disable2D_GUI();

其中 none 是 Texture(来自 slick-util 库),函数 Enable2D_GUI 和 Disable2D_GUI 只是启用和禁用 Ortho 和其他东西。

有什么问题吗?我对 OpenGL 很陌生,所以如果我的问题有点不明白,我很抱歉

这是我的 Enable2D_GUI 和 Disable2D_GUI 函数:

    public void Enable2D_GUI() {

     GL11.glMatrixMode (GL11.GL_PROJECTION);
     GL11.glPushMatrix();
     GL11.glLoadIdentity ();
     GL11.glOrtho (0, width, height, 0, 1, -1);
     GL11.glDisable(GL11.GL_DEPTH_TEST);
     GL11.glMatrixMode (GL11.GL_MODELVIEW);
     GL11.glPushMatrix();
    GL11.glLoadIdentity();
}

public void Disable2D_GUI() {
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glPopMatrix();
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glPopMatrix();

    GL11.glDisable(GL11.GL_BLEND);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
}

现在,当我使用 3D QUAD 对其进行测试时,它也不起作用,结果相同。这是我的 OpenGL 初始化代码:

           GL11.glEnable(GL11.GL_TEXTURE_2D);
       GL11.glShadeModel(GL11.GL_SMOOTH);
       GL11.glClearColor(0f, 0.0f, 0.0f, 0.0f); 
       GL11.glClearDepth(1.0); 
       GL11.glEnable(GL11.GL_DEPTH_TEST);
       GL11.glDepthFunc(GL11.GL_LEQUAL); 

       GL11.glViewport(0, 0, width, height);

       GL11.glMatrixMode(GL11.GL_PROJECTION); 
       GL11.glLoadIdentity();

       GLU.gluPerspective(
             45.0f,
             (float)width/(float)height,
             0.5f,
             50.0f);


       GL11.glMatrixMode(GL11.GL_MODELVIEW);
       GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);

【问题讨论】:

标签: opengl lwjgl texturing


【解决方案1】:

您误用了glPushMatrixglPopMatrix,也没有按正确的顺序添加或执行状态切换。

在您的初始化代码中,您需要将其更改为以下内容。

GL11.glViewport(0, 0, width, height);

GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glLoadIdentity();

GLU.gluPerspective(45.0f, (float) width / (float) height, 0.5f, 50.0f);

GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glLoadIdentity();

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glShadeModel(GL_SMOOTH);
GL11.glClearColor(0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1.0);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);

您不必在glLoadMatrixglLoadIdentity 之后执行状态切换,尽管这样做会更好。 1 代码更具可读性。 2 调用glLoadIdentity 后,有些东西会被重置,尽管只是关于矩阵本身和内部的东西。

那么您还需要将您的Enable2D_GUIDisable2D_GUI 修复为以下内容。

Enable2D_GUI

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, width, height, 0f, 1f, -1f);

GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();

GL11.glDisable(GL11.GL_DEPTH_TEST);

Disable2D_GUI

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();

GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();

GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_DEPTH_TEST);

至少我知道你不能在glMatrixModeglLoadIdentity 调用之间使用glPushMatrixglPopMatrix我可能弄错了然后我还添加了 glLoadIdentity 调用来重置矩阵。

【讨论】:

  • 我现在不在家,但我回家后试试看!提前致谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多