当前位置: 首页 > 知识库问答 >
问题:

LWJGL OpenGL 纹理不正确

刘兴朝
2023-03-14

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

我可以正确地渲染我的2D四边形,但是当我实现纹理时,整个四边形只有大约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();

其中没有纹理(来自slick util库),函数Enable2D_GUI和Disable2D_GUI只启用和禁用正交和填充。

可能出了什么问题?我是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);

共有1个答案

严开宇
2023-03-14

您误用了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);

您不必在 glLoad 矩阵glLoad 身份之后执行状态切换,尽管这样做会更好。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);

禁用2D_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);

据我所知,您至少不能在 glMatrix 模式glLoadIdentity 调用之间使用 glPush 矩阵和 glPop 矩阵。我可能弄错了,然后我还添加了 glLoadIdentity 调用来重置矩阵。

 类似资料:
  • 我对多个渲染目标有一个奇怪的问题。我在FBO上附加了3种纹理:颜色、法线和位置。我可以正确渲染颜色和位置,但渲染正常纹理会产生(绿色和红色是旋转立方体的一部分): 在左下角,是将法线纹理渲染到四边形的结果。 在我的顶点着色器中,我将法线计算为:,在片段着色器中,我将其发射为:

  • 有人能给我解释一下,我如何在OpenGL中渲染多个不同纹理的物体吗? 我认为我接近最终结果,但目前我被困在这里,我不知道下一步需要做什么。真的需要一些帮助! 目前,这就是我所拥有的: > < li> drawSphere():根据经度和纬度的数量绘制UV球体 int numberOfVerices = 0; SetupGeometry():该方法用于绑定顶点和纹理坐标。 DrawSphere(30

  • 我试图用opengl在Qt中显示纹理,但当我运行时它就是不显示纹理。 我做了一些研究,发现我需要将纹理的高度和宽度设为2的幂。我的纹理现在是(1024x1024)。 我还添加了很多glTexParameterf,可以解决我的问题,但仍然没有运气。 EDIT1:是不是我的质地太大了? EDIT2:glBindTexture(GL_TEXTURE_2D,m_textureID);放置在glBindTe

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位

  • 我试图弄清楚为什么我不能用LWJGL 3渲染任何纹理。我尝试了多种加载(PNGDecoder、STB、BufferedImage)和渲染纹理的方法。但结果总是一个白色的四边形。 主要类: 加载方法: 渲染方法: ModelTexture类只是存储一些现在不使用的信息,blue.png是16x16的png文件。 这是我在启动程序时得到的输出:

  • 有问题显示纹理在我的3D框在LWJGL使用光滑。早些时候我犯了一个错误: BasicShader类: BasicVertex.vs basicfragment.fs