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

lwjgl 2d 渲染两个 tetxures 之间的冲突

能帅
2023-03-14

好的,所以我目前正在使用LWJGL在Java中开发2d游戏。我对java及其工作原理有相当扎实的了解,并且了解游戏如何工作和LWJGL / openGL的基础知识,但我在渲染纹理方面遇到了一个非常奇怪的问题。我确定我在这里的一种绘制方法是罪魁祸首。

public static void texturedTriangleInverted(float x, float y, float width, float height, Texture texture) {
    GL11.glPushMatrix();
        {

            GL11.glTranslatef(x, y, 0);
            texture.bind();

            GL11.glBegin(GL11.GL_TRIANGLES);
                {
                    GL11.glVertex2f(width / 2, 0);
                    GL11.glTexCoord2f(width / 2, 0);

                    GL11.glVertex2f(0, height);
                    GL11.glTexCoord2f(0, 1);

                    GL11.glVertex2f(width, height);
                    GL11.glTexCoord2f(1, 1);
                }
            GL11.glEnd();
        }
    GL11.glPopMatrix();
}

所以发生的事情是,如果我用这种方法渲染任何东西,那么下一个渲染的东西看起来像是字面上压缩了一端,在另一端被拉伸了,即使渲染的下一个东西不是用这种方法渲染的。我几乎可以肯定它与我传入Gl11.glTexCoord2f(float x,float y)方法的参数有关,但我不知道如何修复它。

这是我的openGL初始化代码

private void initGL() {
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, Strings.DISPLAY_WIDTH, 0, Strings.DISPLAY_HEIGHT, -1, 1);

    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glEnable(GL11.GL_TEXTURE_BINDING_2D);
    GL11.glViewport(0, 0, Strings.DISPLAY_WIDTH, Strings.DISPLAY_HEIGHT);
    GL11.glClearColor(0, 0, 1, 0);
    GL11.glDisable(GL11.GL_DEPTH_TEST);

}

我的游戏循环代码

    private void gameLoop() {
    while (!Display.isCloseRequested()) {

        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glLoadIdentity();
        GL11.glTranslatef(Strings.transX, Strings.transY, 0);

        this.level.update();
        this.level.render();

        Display.update();
        Display.sync(Strings.FPS_CAP);
    }

    Keyboard.destroy();
    Display.destroy();

}

我的纹理加载代码(注意我使用光滑来加载我的纹理)

public static final Texture loadTexture(String location) {
    try {
        if (textureExists(location)) {
            return TextureLoader.getTexture("png", new BufferedInputStream(new FileInputStream(new File(location))), false);
        } else {
            System.err.println("txture does not exist");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

共有1个答案

汝吕恭
2023-03-14

您需要在它所引用的 glVertex 之前指定 glTexCoord,而不是在它之后。这与 glColorglNormal 相同,glVertex 使用您设置的最后一个属性。

 类似资料:
  • 问题内容: 我想知道判断Shape对象是否与另一个形状相交的最佳方法。目前,我在游戏中已对碰撞检测进行了分类,只要它涉及与矩形相交的Shape,反之亦然。我遇到的问题是Shape类中的intersects()方法只能将Rectangle或Point作为参数,而不能将另一个Shape用作参数。有没有一种有效的方法来测试两个Shape对象是否以任何方式重叠?我尝试的一种方法是使用for循环生成一个点区

  • 如何在javaFx上得到2个图像或边界相交的碰撞?我移动一张图片,但是如果我触摸第二张图片,我想触发一些东西。 此代码不起作用

  • 我有一个带有对象数组的组件,其中我正在根据字符串进行过滤。问题是当我尝试将此过滤器的返回设置为本地状态时,它会抛出错误,我不太理解原因。 所以,因为我希望这个数组处于我的状态,所以我决定这样做: 插入这一行后发生的事情是这样的: 它开始多次渲染。我假设,每次状态改变时,它都会重新渲染组件(如果我错了,请纠正我)。不过,我不知道它为什么要多次这样做。 因此,我想过使用 useEffect 来实现此处

  • 重新渲染日程表的所有日程: .fullCalendar( 'rerenderEvents' ) 官方英文文档:http://arshaw.com/fullcalendar/docs/event_rendering/rerenderEvents/

  • 渲染一个新的日程到日程表上: .fullCalendar( 'renderEvent', event [, stick ] ) event 是 Event Object 对象,至少含有 title 和 start 属性。 通常,用 renderEvent 方法添加的日程会在日程表重载数据(refetches)之后消失。可以将stick设置为true 官方英文文档:http://arshaw.com

  • 日程从DOM中移除之前触发: function( event, element, view ) { } event 是 Event Object 对象。 element 是要被移除的 jQuery 对象。 此函数可以用来移除 eventRender 注册的插件。 官方英文文档:http://arshaw.com/fullcalendar/docs/event_rendering/eventDest