java - 使用 Ortho2D 在 OpenGL 中映射四边形纹理时出现问题

标签 java opengl texture-mapping lwjgl

以下代码生成下面的图像。我用于背景的图像是 640 x 480,显示模式也是如此。纹理背景是.bmp,并使用Slick 纹理加载器加载。我很困惑为什么它没有填充四边形以及为什么它被反射(reflect)。 编辑:我的 OpenGL 场景的背景是粉红色的,您看到的黑色来自创建的四边形。背景图片是带有 2px 浅蓝色边框的绿色 block ,上面贴有“test”。

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); 时,您会注意到出现了粉红色,这是在我的“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

最佳答案

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

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

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

3)当您加载纹理(或调用库来执行此操作)时,您做错了什么。

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

关于java - 使用 Ortho2D 在 OpenGL 中映射四边形纹理时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944373/

相关文章:

java - 自动配置 Java 以使用分配给其 Docker 容器的最大 RAM

c++ - 用于读写的 OpenCL OpenGL 互操作内核参数

opengl - 纹理(...)通过textureoffset(...)在glsl中的性能

c - 从另一个线程重绘opengl

opengl - 像素完美的纹理映射与现代 OpenGL

C++ openGl 纹理将图像映射到球体上

java - PDF 到字节数组,反之亦然

java - 编译器如何识别存在已检查异常

java - 违反完整性约束

C++11 <thread> 使用 OpenGL 进行多线程渲染可防止主线程读取标准输入