我正在尝试为基于2D平铺的项目创建一个简单的纹理管理器。

我所拥有的是一个具有字符串(纹理名称)和纹理的散列图的类。 如果散列映射中不存在该名称,则它使用TextureIO.newTexture(..)创建它并将其存储到散列映射中。

这是我尝试加载纹理时得到的错误:

Exception in thread "Timer-0" javax.media.opengl.GLException: java.lang.IllegalArgumentException: Illegally formatted version identifier: "null"
    at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:271)
    at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:410)
    at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
    at com.sun.opengl.util.Animator.display(Animator.java:144)
    at com.sun.opengl.util.FPSAnimator$1.run(FPSAnimator.java:95)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Illegally formatted version identifier: "null"
    at com.sun.opengl.impl.FunctionAvailabilityCache$Version.<init>(FunctionAvailabilityCache.java:354)
    at com.sun.opengl.impl.FunctionAvailabilityCache.initAvailableExtensions(FunctionAvailabilityCache.java:133)
    at com.sun.opengl.impl.FunctionAvailabilityCache.isExtensionAvailable(FunctionAvailabilityCache.java:104)
    at com.sun.opengl.impl.GLContextImpl.isExtensionAvailable(GLContextImpl.java:351)
    at com.sun.opengl.impl.GLImpl.isExtensionAvailable(GLImpl.java:30493)
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:416)
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:381)
    at com.sun.opengl.util.texture.Texture.<init>(Texture.java:182)
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:445)
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:465)
    at dqs.manager.TextureManager.loadTexture(TextureManager.java:31)
    at dqs.world.World.draw(World.java:59)
    at dqs.scene.GameScene.display(GameScene.java:58)
    at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78)
    at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435)
    at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194)
    at javax.media.opengl.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:452)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at com.sun.opengl.impl.FunctionAvailabilityCache$Version.<init>(FunctionAvailabilityCache.java:309)
    ... 30 more
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.sun.opengl.impl.mipmap.Mipmap.closestFit(Mipmap.java:252)
    at com.sun.opengl.impl.mipmap.Mipmap.gluBuild2DMipmaps(Mipmap.java:726)
    at javax.media.opengl.glu.GLU.gluBuild2DMipmapsJava(GLU.java:1525)
    at javax.media.opengl.glu.GLU.gluBuild2DMipmaps(GLU.java:1581)
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:523)
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:381)
    at com.sun.opengl.util.texture.Texture.<init>(Texture.java:182)
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:445)
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:465)
    at dqs.manager.TextureManager.loadTexture(TextureManager.java:31)
    at dqs.world.World.draw(World.java:59)
    at dqs.scene.GameScene.display(GameScene.java:58)
    at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78)
    at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435)
    at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194)
    at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:412)
    at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
    at javax.media.opengl.GLCanvas.paint(GLCanvas.java:277)
    at sun.awt.RepaintArea.paintComponent(Unknown Source)
    at sun.awt.RepaintArea.paint(Unknown Source)
    at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

当我从TextureManager中调用loadTexture时发生错误。

这是TextureManager代码:

public class TextureManager {

    private static HashMap<String, Texture> textureMap;

    public TextureManager() {

        textureMap = new HashMap<String, Texture>();

    }

    public static void loadTexture(String name) {

        if(textureMap.containsKey(name)) return;

        try {

            textureMap.put(name, TextureIO.newTexture(new File("textures/" + name + ".png"), true));
        }
        catch (GLException e) {

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

            e.printStackTrace();
        }
    }

    public static void bindTexture(String name) {

        textureMap.get(name).bind();
    }
}

之前已在代码中创建了一个TextureManager对象:

new TextureManager();

这是我用它调用的代码:

TextureManager.loadTexture("tree");

path textures / tree.png也存在。

我在一个较旧的项目中做了类似的事情,但是我没有使用hashmap,而是在TextureManager中为我使用的每个纹理(不是很多)编写了一个变量。 我怀疑这是因为线程缺少GL上下文,因为我的旧TextureManager通过构造函数传递了GL,但从未在代码中使用它。 调用loadTexture函数的draw函数也传入GL变量。

===============>>#1 票数:2 已采纳

啊我弄清楚导致问题的原因。 我在glBegin和glEnd调用中绑定了纹理。

感谢所有看过我的问题的人,不幸的是我没有包含在我的问题中提供解决方案的代码。 为此道歉。

希望未来能够帮助别人!

  ask by Mick translate from so

未解决问题?本站智能推荐:

1回复

JAVA OpenGL 3D多维数据集多个纹理

我在OpenGL中在JAVA中创建旋转骰子动画时遇到问题。 多维数据集是可见的,有颜色的和旋转的,但我还需要在每一侧使用不同的纹理。 现在,我在那里看不到任何纹理,但是当我使用println时,似乎所有纹理都已启动并已缓冲。
1回复

纹理无法正确显示OpenGL

我正在尝试为正在创建的游戏的菜单加载简单的背景纹理,但纹理显示不正确。 例如,如果我使用此纹理: http : //s15.postimage.org/mqvuhq463/Super_Mario_Galazy_Background.png,则整个背景为蓝色,如果我使用此纹理: http :
1回复

OpenGL帧缓冲区渲染到纹理不起作用

我正在尝试使用Java和JOGL使用framebuffers创建发光效果,但是遇到了问题。 目前,我的目标是将用照明纹理进行纹理处理的飞船模型渲染为帧缓冲纹理,然后将帧缓冲纹理绘制到三角形扇形四边形。 我正在与OpenGL 2.1和/或2.0一起运行这是用于生成帧缓冲区及其纹理的代码:
1回复

opengl / JOGL-绘制纹理的最佳方法

我考虑了在OpenGL / JOGL中绘制图片的最佳方法。 我目前正在编写一个游戏,我的目标是将有关图片的信息保存在文本文件中,而不是保存图片。 我的想法是编写一种方法,该方法将每个像素信息(RGB)保存在X和Y位置。然后绘制每个像素并完成。 您如何看待这个想法?
3回复

Jogl-图片将不会在纹理映射过程中加载? (JAVA)

谁能看到什么问题? 我正在尝试在QUAD形状上加载图像并将其显示在框架上。 当我运行它时,没有显示任何东西,既没有四边形,也没有图像。 程序代码如下:
2回复

为什么我的纹理不显示?

好的,我正在使用Java和JoGL。 我正在尝试加载和显示纹理,但是纹理根本没有显示。 我根本没有任何错误,所以我不知道问题可能出在哪里。
1回复

多维纹理的多维数据集

我有一个单一纹理的立方体 - 我试图在上面的立方体上设置多个纹理,意味着在“正面”之后,替换为另一个纹理,它将在另一个立方体面上生效。 我怎么能做到这一点?
1回复

JOGL大纹理输出内存不足

我正在使用TextureIO在JOGL中加载一个7兆字节的纹理,但是大约三秒钟后,该程序崩溃了,没有显示任何带有OutOfMemoryError 。 是的,我知道一个7兆字节的图像是一个荒谬的大小,但是我仍然想加载它。 顺便说一句,是否应该将8192 x 4096纹理设为7兆字节?
1回复

JOGL Confusion-纹理如何起作用?

OpenGL对我来说很混乱,我不习惯许多图形术语,等等。在许多教程中,这非常猖very。 我了解如何绘制三角形,圆形,四边形,多边形等,但是现在我试图了解纹理的工作方式。 有人可以指出我正确的方向来理解纹理吗? 由于只能让JOGL在Netbeans中工作,因此我尝试将名为“ Tik
1回复

在特定条件下更改对象的纹理

我在Jogl中遇到纹理问题。 我画了一个书架,当架子被检测为标记时,纹理应该改变。 到目前为止,这是我的代码: 对象books和books_marked是构造函数的参数,其创建方式如下: 我的意图是在if条件下实例化这本书的Texture-Object,以便bind()命令将