JOGL white texture?

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

I am trying to load earth.png and place it over a triangle. The image is 256x256. I have followed an online tutorial and played around with this for hours, but the triangle still remains white. Can any one point me in the right direction.

import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.InputStream;  import javax.media.opengl.*; import javax.media.opengl.awt.GLCanvas;  import com.jogamp.opengl.util.texture.Texture; import com.jogamp.opengl.util.texture.TextureData; import com.jogamp.opengl.util.texture.TextureIO;  public class test implements GLEventListener {     private Texture earthTexture;      public static void main(String[] args) {         GLProfile glp = GLProfile.getDefault();         GLCapabilities caps = new GLCapabilities(glp);         GLCanvas canvas = new GLCanvas(caps);          final Frame frame = new Frame("AWT Window Test111");         frame.setSize(700, 700);         frame.add(canvas);         frame.setVisible(true);          // by default, an AWT Frame doesn't do anything when you click         // the close button; this bit of code will terminate the program when         // the window is asked to close         frame.addWindowListener(new WindowAdapter() {             public void windowClosing(WindowEvent e) {                 frame.dispose();                 System.exit(0);             }         });     canvas.addGLEventListener(new test());      }       @Override     public void display(GLAutoDrawable arg0) {           update();         render(arg0);       }      private void update() {         // TODO Auto-generated method stub      }      private void render(GLAutoDrawable drawable) {          GL2 gl = drawable.getGL().getGL2();         gl.glClear(GL.GL_COLOR_BUFFER_BIT);         gl.glEnable(GL.GL_TEXTURE_2D);          gl.glBegin(GL2.GL_TRIANGLES);                           // Begin drawing triangle sides          earthTexture.enable();         earthTexture.bind();          // gl.glColor3f( 1.0f, 0.0f, 0.0f);                     // Set colour to red     gl.glTexCoord2f(0.0f, 0.0f);     gl.glVertex3f( 0.0f, 1.0f, 1.0f);                       // Top vertex     gl.glTexCoord2f(-1.0f, -2.0f);     gl.glVertex3f(-1.0f,-1.0f, 0.0f);                       // Bottom left vertex     gl.glTexCoord2f(1.0f, -2.0f);     gl.glVertex3f( 1.0f,-1.0f, 0.0f);                       // Bottom right vertex          gl.glEnd();      }      @Override     public void dispose(GLAutoDrawable arg0) {         // TODO Auto-generated method stub      }      @Override     public void init(GLAutoDrawable arg0) {         GL2 gl = arg0.getGL().getGL2();          // Load texture.        try {             InputStream stream = getClass().getResourceAsStream("earth.png");            TextureData data = TextureIO.newTextureData(gl.getGLProfile(), stream, 100, 200, false, "png");            earthTexture = TextureIO.newTexture(data);        }        catch (IOException exc) {            exc.printStackTrace();            System.exit(1);        }       }      @Override     public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,             int arg4) {         // TODO Auto-generated method stub      }    } 

回答1:

A couple of things I have noticed:

You need to explicitly enable texturing within OpenGL, by using something like:

gl.glEnable(GL.GL_TEXTURE_2D); 

You also will need to specify coordinates for the textures (typically expressed as u,v coordinates), this needs to be done for every 3D point:

gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 0.0f, 1.0f, 1.0f);  ... 

The excellent NeHe tutorials also have JOGL sample code these days, which will be worthwhile looking at in more depth:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=07

This article also has some good information on understanding texture coordiantes:

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node52.html



回答2:

You are binding your texture in between the glBegin/glEnd statements. It is required to do so before the glBegin. Texture switches in between begin/end pairs are likely to be ignored.



文章来源: JOGL white texture?
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!