Pregunta

Bueno, estoy usando Java y JoGL. Estoy intentando cargar y mostrar una textura, pero la textura no se muestra en absoluto. No recibo ningún error, por lo que no sé cuál podría ser el problema.

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];
    }
}
¿Fue útil?

Solución 2

Logré cargar una textura usando com.sun.opengl.util.texture.Texture y el tutorial que encontré here .

Otros consejos

No veo que compruebes los errores de OpenGL. JOGL proporciona una manera fácil de hacer esto. Simplemente coloque glDrawable.setGL (nueva DebugGL (glDrawable.getGL ())) al comienzo de su método de inicio.

Si eso no ayuda, revisaría los datos de la imagen y la variable de textura si no fueran cero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top