2012-02-25 3 views
3

2D 타일 기반 프로젝트에 간단한 텍스처 관리자를 만들려고합니다.간단한 Java OpenGL 텍스처 관리자

내가 가진 것은 문자열 (텍스처 이름)과 텍스처의 해시 맵을 가진 클래스입니다. 이름이 해시 맵에 없으면 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"); 

경로 텍스처/tree.png도 있습니다.

이전 프로젝트에서 이와 비슷한 작업을 수행했지만 해시 맵 대신 TextureManager에서 변수를 하드 코딩했습니다. 그 수는 많지 않습니다. 나는 이전 TextureManager가 GL을 생성자를 통해 전달했기 때문에 스레드에 GL 문맥이 없기 때문에 그것이 의심 스럽지만 코드에서는 사용하지 않았다. loadTexture 함수를 호출 한 그리기 함수도 GL 변수로 전달됩니다.

답변

2

아 나는 문제의 원인을 알아 냈습니다. glBegin 및 glEnd 호출 내에서 텍스처를 바인딩했습니다.

불행히도 내 질문에 해결책을 제공했을 코드를 포함시키지 않았지만 모두 내 질문을 보아 주셔서 감사합니다. 그 사과.

앞으로도 다른 사람에게 도움이되기를 바랍니다.