【问题标题】:Problem texture mapping a quad in OpenGL with Ortho2D使用 Ortho2D 在 OpenGL 中映射四边形的问题纹理
【发布时间】:2011-05-10 14:43:39
【问题描述】:

下面的代码生成下面的图像。我用于背景的图像是 640 x 480,displayMode 也是如此。纹理 background 是一个 .bmp,并使用 Slick 纹理加载器加载。我很困惑为什么它没有填充 Quad 以及为什么它被反射。 编辑:我的 OpenGL 场景的背景是粉红色的,你看到的黑色来自创建的 Quad。背景图片是带有 2px 浅蓝色边框的绿色块,上面贴着“测试”。

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();
}

现在当我添加GL11.glTranslatef(20.0f, 20.0f, 0.0f); 时,您会注意到出现了粉红色,这是在我的“initGL”方法中创建的颜色: GL11.glClearColor(1.0f, 0.75f, 0.796f, 0.0f);

我的 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

【问题讨论】:

  • “它显示的很不正确”:正确的显示应该是……什么?
  • 对不起,我的错。我期待整个多边形都被我的纹理填充。
  • 看起来已经填满了。你想让多边形填满整个视口吗?如果是这样,您的GL_PROJECTIONGL_MODELVIEW 矩阵在推送之前的内容是什么?
  • 感谢您的帮助,我编辑了我的问题以表明我的推理黑色是多边形的一部分。
  • gluLookAt 属于模型视图矩阵,而不是投影矩阵。投影矩阵是 OpenGL 相机的“镜头”,但只是镜头。视点是由世界的相反运动设定的。

标签: java opengl texture-mapping lwjgl


【解决方案1】:

我需要更多信息来确定问题,但这里列出了一些可能性。

1)您使用的是较旧的视频卡,它不支持纹理非 2 的幂,因为您正在使用库来加载纹理,也许它正在检测它,创建 2 的幂图像,并填充它是黑色的。

2)您(或您正在使用的某个库)更改了纹理矩阵堆栈的矩阵,它正在更改纹理坐标。

3) 你在加载纹理时做错了(或调用库来这样做)。

我要检查的第一件事是您的视频卡是否支持纹理非 2 扩展。可以在运行时查看,见how to detect if openGL/card supports non power of 2?

【讨论】:

  • 谢谢,事实证明,不支持不是 2 次方的纹理。
【解决方案2】:

我首先看到的是你计算

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

切换了?

其次,纹理可能会被翻转,因为加载器翻转了它(当我没记错的时候,这也发生在我身上,尤其是使用 BMP 时)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2023-03-08
    相关资源
    最近更新 更多