PNG Texture not showing (new guy)
Posted by midramble on Oct 12, 2012; 5:15am
URL: https://forum.jogamp.org/PNG-Texture-not-showing-new-guy-tp4026475.html
Hello all. I'm pretty new to JOGL and I've created the below code just to display a png with an alpha channel as a texture on a simple quad. The code throws no exceptions; however, the texture doesn't show and neither does the background color of the quad. As you can also see I've tried other methods of binding textures (the code that is /* */ blocked out) that also didn't work. I just can't seem to see what I'm doing wrong.
[Below is my main class]
public class redoubt
{
public static void main(String[] args)
{
// setup OpenGL Version 2
GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
capabilities.setRedBits(8);
capabilities.setBlueBits(8);
capabilities.setGreenBits(8);
capabilities.setAlphaBits(8);
capabilities.setSampleBuffers(true);
// Create canvas
GLCanvas glcanvas = new GLCanvas(capabilities);
glcanvas.addGLEventListener(new mainrend());
glcanvas.setSize( 500, 500 );
glcanvas.setBackground(Color.WHITE);
JFrame frame = new JFrame( "Redoubt" );
frame.getContentPane().add(glcanvas);
// shutdown the program on windows close event
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
frame.setSize( frame.getContentPane().getPreferredSize() );
frame.setVisible( true );
}
}
[below is my render class]
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import javax.imageio.ImageIO;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.gl2.GLUgl2;
import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureData;
import com.jogamp.opengl.util.texture.TextureIO;
class mainrend implements GLEventListener
{
private GLUgl2 glu = new GLUgl2();
private Texture dude;
public void init(GLAutoDrawable gLDrawable)
{
System.out.println("init() called");
GL2 gl = gLDrawable.getGL().getGL2();
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL2.GL_FLAT);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL.GL_BLEND);
/*
try {
InputStream stream = getClass().getResourceAsStream("dude.png");
TextureData data = TextureIO.newTextureData(GLProfile.get(GLProfile.GL2) ,stream, false, "png");
dude = TextureIO.newTexture(data);
System.out.println("texture load complete");
}
catch (IOException exc) {
System.out.println("text load went to crap with " + exc);
}
*/
}
public void display(GLAutoDrawable gLDrawable)
{
System.out.println("display called");
final GL2 gl = gLDrawable.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
//texture prep
int Text;
int retval[]= new int[1];
gl.glGenTextures(1, retval, 0);
Text = retval[0];
gl.glBindTexture(GL.GL_TEXTURE_2D, Text);
mmify(glu, "dude.png");
//Load texture
/*
dude.enable(gl);
dude.bind(gl);
*/
System.out.println("texture loaded?");
gl.glBegin(GL2.GL_QUADS);
gl.glVertex3f(-1.0f, 1.0f, 0.0f);
gl.glVertex3f(1.0f, 1.0f, 0.0f);
gl.glVertex3f(1.0f, -1.0f, 0.0f);
gl.glVertex3f(-1.0f, -1.0f, 0.0f);
gl.glEnd();
gl.glFlush();
}
public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged)
{
System.out.println("displayChanged called");
}
public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
{
System.out.println("reshape() called: x = "+x+", y = "+y+", width = "+width+", height = "+height);
final GL2 gl = gLDrawable.getGL().getGL2();
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(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 20.0);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void dispose(GLAutoDrawable arg0)
{
System.out.println("dispose() called");
}
//create mipmap from png... hence mipmapify
public void mmify(GLU glu, String imgname) {
try {
InputStream inpstr = ClassLoader.getSystemResourceAsStream(imgname);
BufferedInputStream buffinst = new BufferedInputStream(inpstr);
BufferedImage buffimg = ImageIO.read(buffinst);
Raster rast = buffimg.getRaster();
DataBufferByte dbuffb = (DataBufferByte)rast.getDataBuffer();
byte b[] = dbuffb.getData();
int textsize = b.length;
ByteBuffer texture = ByteBuffer.allocateDirect(textsize);
texture.order(ByteOrder.nativeOrder());
texture.put(b, 0, textsize);
texture.rewind();
int iwidth = buffimg.getWidth();
System.out.println("made iwidth int " + iwidth);
int iheight = buffimg.getHeight();
System.out.println("made iheight int " + iheight);
System.out.println("buffer size = " + textsize);
System.out.println("middle 4 bytes are: " + b[(textsize/2)] + ", " + b[textsize/2+1] + ", " + b[textsize/2+2] + ", " + b[textsize/2+3]);
glu.gluBuild2DMipmaps(GL.GL_TEXTURE_2D, GL.GL_RGBA8, iwidth, iheight, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, texture);
}
catch (Exception e) {
System.out.println("Some crap happend in mmify " + e);
}
}
}