2009-03-08 11 views
0

좋아요, Java와 JoGL을 사용하고 있습니다. 텍스처를로드하고 표시하려고하지만 텍스처가 전혀 표시되지 않습니다. 전혀 오류가 없으므로 문제가 무엇인지 알 수 없습니다.왜 내 텍스처가 나타나지 않습니까?

import javax.media.opengl.*; 
import javax.media.opengl.glu.*; 
import com.sun.opengl.util.*; 
import com.sun.opengl.util.j2d.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import java.net.*; 
import java.nio.*; 
import javax.imageio.*; 
import javax.swing.*; 


public class chartest extends JFrame implements GLEventListener, KeyListener 
{ 
    private int texture; 

    public void display(GLAutoDrawable gLDrawable) 
    { 
     final GL gl = gLDrawable.getGL(); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
     gl.glLoadIdentity(); 


     gl.glColor3f(1.0f, 1.0f, 1.0f); 
     gl.glBindTexture(GL.GL_TEXTURE_2D, texture); 

     gl.glBegin(GL.GL_QUADS);    // Draw A Quad 
     gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-12.0f, -19.0f, -15.0f); 
     gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(12.0f, -19.0f, -15.0f); 
     gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(12.0f, 19.0f, -15.0f); 
     gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-12.0f, 19.0f, -15.0f); 
     gl.glEnd();    // Done Drawing The Quad 
     gl.glFlush(); 
    } 

    public void displayChanged(GLAutoDrawable g, boolean b, boolean b2){} 

    public void init(GLAutoDrawable gLDrawable) 
    { 
     final GL gl = gLDrawable.getGL(); 
     gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f); 
     gl.glShadeModel(GL.GL_FLAT); 
     gl.glEnable(GL.GL_TEXTURE_2D); 

     texture = genTexture(gl); 
     gl.glBindTexture(GL.GL_TEXTURE_2D, texture); 
     URL url = this.getClass().getResource("test.png"); 

     try 
     { 
     BufferedImage img = ImageIO.read(url); 
     makeRGBTexture(gl, new GLU(), img, GL.GL_TEXTURE_2D, false); 
     } 

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

     gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR); 
    } 

    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) 
    { 
     final GL gl = gLDrawable.getGL(); 
     final GLU glu = new GLU(); 

     if (height <= 0) // avoid a divide by zero error! 
     height = 1; 
     final float h = (float)width/(float)height; 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     glu.gluPerspective(45.0f, h, 1.0, 20.0); 
     gl.glMatrixMode(GL.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

    public void keyPressed(KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_ESCAPE) 
     System.exit(0); 
    } 
    public void keyReleased(KeyEvent e) {} 
    public void keyTyped(KeyEvent e) {} 

    public static void main(String[] args) { 

     chartest c = new chartest(); 

     GLCanvas canvas = new GLCanvas(new GLCapabilities()); 
     canvas.addGLEventListener(c); 
     c.add(canvas); 
     c.setSize(640, 480); 
     canvas.addKeyListener(c); 
     c.addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
      System.exit(0); 
      } 
     }); 
     c.setVisible(true); 
     canvas.requestFocus(); 
    } 



    //----------------------- 
    private void makeRGBTexture(GL gl, GLU glu, BufferedImage img, int target, boolean mipmapped) 
    { 
     ByteBuffer dest = null; 
     switch (img.getType()) 
     { 
     case BufferedImage.TYPE_3BYTE_BGR: 
     case BufferedImage.TYPE_CUSTOM: 
     { 
      System.out.println("Custom"); 
      byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); 
      dest = ByteBuffer.allocateDirect(99999); 
      dest.order(ByteOrder.nativeOrder()); 
      dest.put(data, 0, data.length); 
      break; 
     } 
     case BufferedImage.TYPE_INT_RGB: 
     { 
      int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 
      dest = ByteBuffer.allocateDirect(data.length * BufferUtil.SIZEOF_INT); 
      dest.order(ByteOrder.nativeOrder()); 
      dest.asIntBuffer().put(data, 0, data.length); 
      break; 
     } 
     default: 
      throw new RuntimeException("Unsupported image type " + img.getType()); 
     } 

     if (mipmapped) 
     { 
     glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, dest); 
     } 
     else 
     { 
     gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, dest); 
     } 
    } 

    private int genTexture(GL gl) 
    { 
     final int[] tmp = new int[1]; 
     gl.glGenTextures(1, tmp, 0); 
     return tmp[0]; 
    } 
} 
+0

실례합니다. 태그 양식에서 해당 서식을 사용하는 방법을 가르쳐 주시겠습니까? JAVA를 시도했지만 작동하지 않았습니다. – William

답변

1

com.sun.opengl.util.texture.Texture와 here이라는 튜토리얼을 사용하여 텍스처를로드 할 수있었습니다.

2

OpenGL 오류가 있는지 확인하지 않습니다. JOGL은 이것을 쉽게 할 수있는 방법을 제공한다. 단지 glDrawable.setGL(new DebugGL(glDrawable.getGL()));을 init 메소드의 시작 부분에 두십시오.

0이 아닌 경우 이미지 데이터와 텍스처 변수를 확인하면 도움이되지 않습니다.

관련 문제