2011-05-10 118 views
2

以下代码会生成以下图像。我用于背景的图像是640 x 480,与displayMode一样。纹理背景是一个.bmp文件,并加载了Slick纹理加载器。我很困惑,为什么它没有填满四边形,为什么它被反映出来。 编辑:我的OpenGL场景的背景是粉红色,你看到的黑色是从创建的四。背景图像是绿色块,其上贴有2px浅蓝色边框,并贴有“test”字样。在OpenGL中使用Ortho2D绘制四边形问题的纹理问题

private void renderBackground(){ 
    float w = displayMode.getHeight()/2; 
    float h = displayMode.getWidth()/2; 

    GL11.glMatrixMode(GL11.GL_PROJECTION); 
    GL11.glPushMatrix(); 

    GL11.glLoadIdentity(); 
    GLU.gluOrtho2D(-w, w, -h, h); 

    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    GL11.glPushMatrix(); 

    GL11.glLoadIdentity();  
    GL11.glDisable(GL11.GL_DEPTH_TEST); 

    if(useTextures)background.bind(); 
    GL11.glBegin(GL11.GL_QUADS); 

    GL11.glTexCoord2f(0.0f, 0.0f); 
    GL11.glVertex2f(-w,-h); 

    GL11.glTexCoord2f(1.0f, 0.0f); 
    GL11.glVertex2f(w,-h); 

    GL11.glTexCoord2f(1.0f, 1.0f); 
    GL11.glVertex2f(w, h); 

    GL11.glTexCoord2f(0.0f, 1.0f); 
    GL11.glVertex2f(-w, h); 

    GL11.glEnd(); 

    GL11.glEnable(GL11.GL_DEPTH_TEST); 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 
    GL11.glPopMatrix(); 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    GL11.glPopMatrix(); 
} 

OpenGL Texture mismapping

现在,当我添加GL11.glTranslatef(20.0f, 20.0f, 0.0f);你会发现,出现粉红色,这是INT我“initGL”方法创建的颜色: GL11.glClearColor(1.0f, 0.75f, 0.796f, 0.0f);enter image description here

我GL_PROJECTION包含前推下它,当调用renderBackground()时,我的GL_MODELVIEW未被修改。

GL11.glMatrixMode(GL11.GL_PROJECTION); // Select The Projection Matrix 
    GL11.glLoadIdentity(); // Reset The Projection Matrix 

    // Calculate The Aspect Ratio Of The Window 
    GLU.gluPerspective(45.0f, (float) displayMode.getWidth()/(float) displayMode.getHeight(), 0.1f, 25.0f); 
    //position camera 
    GLU.gluLookAt(5.0f, 3.0f, -5.0f, 0.0f, 0.0f, -10.0f, 0.0f, 1.0f, 0.0f); 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The Modelview Matrix 
+0

“显示错误”:正确的显示将是...什么? – genpfault 2011-05-10 02:56:33

+0

对不起,我的错误。我期待整个多边形充满我的纹理。 – kieve 2011-05-10 02:58:19

+0

它看起来像被填满。你想让多边形填满整个视口吗?如果是这样,在你推动它们之前,你的'GL_PROJECTION'和'GL_MODELVIEW'矩阵的内容是什么? – genpfault 2011-05-10 02:59:59

回答

3

我需要更多的信息来确定问题,但这里有一个列表有一些可能性。

1)您正在使用较旧的视频卡,因为您正在使用库来加载纹理,可能正在检测它,创建两个图像的幂,并且不支持2的纹理非功率,并且用黑色填充。 2)您(或您正在使用的某个库)更改了纹理矩阵堆栈的矩阵,并且它正在更改纹理坐标。

3)当你加载纹理时(或者调用库来做)你做错了。

我会检查的第一件事是如果你的显卡支持2扩展的纹理非功率。您可以在运行时检查,看how to detect if openGL/card supports non power of 2?

+0

谢谢,事实证明,不支持不是2的幂的纹理。 – kieve 2011-05-10 03:29:17

0

我看到的第一件事,就是你计算

float w = displayMode.getHeight()/2; 
float h = displayMode.getWidth()/2; 

切换?

其次,纹理可以翻转,因为加载器翻转它(当我记得这是发生在我身上,尤其是BMP)。