OpenGL 加载和渲染 png 到屏幕

Posted

技术标签:

【中文标题】OpenGL 加载和渲染 png 到屏幕【英文标题】:OpenGL load & render png to screen 【发布时间】:2016-07-18 22:27:22 【问题描述】:

我正在尝试将十字准线 png 加载到我正在使用 OpenGL 开发的游戏中,更准确地说是 JOGL。

十字准线应该加载到屏幕的中心。

然而,即使在互联网上扫描了几个小时后 - 还没有找到一种方法来简单地使用 JOGL 将 png 渲染到屏幕上,我相信这很容易。

我找到的所有答案都是关于纹理的,这不是我要寻找的,因为我不打算为此制作一个对象 - 只是在需要时在屏幕上显示它。

编辑:

根据eldo的建议,尝试在显示方法中做如下:

    gl.glPushMatrix();
    gl.glEnable(GL2.GL_TEXTURE_2D);

    try 
        Texture text = TextureIO.newTexture(getClass().getResourceAsStream("/misc/crosshair.png"),true, "png");
        gl.glTexParameteri( GL2.GL_TEXTURE_2D,GL2.GL_TEXTURE_WRAP_T, GL2.GL_REPEAT );
        gl.glTexParameteri( GL2.GL_TEXTURE_2D,GL2.GL_TEXTURE_WRAP_S, GL2.GL_REPEAT );
        text.bind(gl);
     catch (GLException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

    float sizeX = 20, sizeY = 20, sizeZ = 20;
    gl.glBegin(GL2.GL_QUADS);

    // create crosshair square
    gl.glTexCoord2d(0, 0);
    gl.glVertex3d(0, sizeY, 0);
    gl.glTexCoord2d(1, 0);
    gl.glVertex3d(sizeX, sizeY, 0);
    gl.glTexCoord2d(1, 1);
    gl.glVertex3d(sizeX, sizeY, sizeZ);
    gl.glTexCoord2d(0, 1);
    gl.glVertex3d(0, sizeY, sizeZ);


    gl.glEnd();
    gl.glPopMatrix();

但是我得到的结果是(其他的只是墙):

这是十字准线 png:

【问题讨论】:

"我认为这很容易" 好吧,事实并非如此。这不是 OpenGL 的工作方式。如果要渲染图像,则必须为其制作纹理。至少,在现代 OpenGL 中。 “我不打算为此制作对象” OpenGL 没有对象的概念。它在屏幕上绘制点、线和三角形。听起来您想要一个更高级别的框架或引擎而不是 OpenGL。 @NicolBolas 我明白了。所以你说我必须把它放在世界上然后给它应用纹理? @ColonelThirtyTwo 你说得对,我不准确。我为我的游戏中的每个对象创建了 Java 对象,其中包含数据(在这种情况下,它的资源 .obj 文件的路径以及额外的数据,例如在世界中的位置等)。这就是我说反对的原因。 看看Hello Texture here 【参考方案1】:

您不能只在屏幕中间轻松地绘制图像,OpenGL 不会“忘记”其实际状态并按照您的意愿渲染图像。但是,在完成所有 3D 内容渲染后,您可以通过几个步骤使其能够绘制出来。

gl.glMatrixMode(GL.GL_PROJECTION); //reset the projection matrix
gl.glLoadIdentity();
gl.glOrtho(left, right, bottom, top, near, far);//change to orthographic projection
gl.glMatrixMode(GL.GL_MODELVIEW);// reset the modelview matrix
gl.glLoadIdentity();
gl.glDisable(GL.GL_DEPTH_TEST);//disable depth test
//draw 2D stuff here

之后,您可以在屏幕中间绘制一个带有十字线纹理的四边形。

【讨论】:

除了禁用深度测试,这都是旧的,已弃用的 OpenGL。 @Colonel 三十二 它仍然是一个有效的解决方案,可以用新的东西代替。无论如何,它不是一个可行的解决方案,只是一个示例或概念。此外,他没有提供任何代码,因此无法准确回答他的需求。 我添加了一些由于某种原因不起作用的代码...你能看看吗? @Jjang “其他东西”看起来像它应该的样子?看起来你在角落里。 @Jjang 我没有看到你所有的代码,我什至不是专家,但这里有一个纹理的工作示例:github.com/xranby/modern-jogl-examples/commit/…

以上是关于OpenGL 加载和渲染 png 到屏幕的主要内容,如果未能解决你的问题,请参考以下文章

opengl vbo建议[关闭]

使用 libpng 将 OpenGL 屏幕像素保存为 PNG

opengl交错vbo不渲染到屏幕

OpenGL渲染纹理全白

优化流媒体vbo openg

OpenGL:如何设置 OpenGL 只渲染到 FBO,不输出到屏幕/窗口/控件?