2011-12-11 54 views
1

我想加载一个PNG文件作为纹理,但即使我没有任何错误,我无法看到纹理。我唯一得到的是一种颜色的正方形。我已经搜索了一些例子,我没有看到我在做什么错误。下面是代码:opengl java加载PNG纹理不能正常工作

 final Image image = SWTImageFactory.getImage(ImageFactory.CROSS_SYMBOL_IMAGE); 
     final ImageData imageData = image.getImageData(); 

     ByteBuffer buffer = ByteBuffer.allocate(4*imageData.width * imageData.height); 
     int p, r, g, b, a; 

     for (int y = 0; y<imageData.height; y++) { 
      for (int x = 0; x < imageData.width; x++) { 

       p = imageData.getPixel(x, y); 
       a = (p >> 24) & 0xFF; // get pixel bytes in ARGB order 
       r = (p >> 16) & 0xFF; 
       g = (p >> 8) & 0xFF; 
       b = (p >> 0) & 0xFF; 

       buffer.put((byte)r); // fill in bytes in RGBA order 
       buffer.put((byte)g); 
       buffer.put((byte)b); 
       buffer.put((byte)a); 
      } 
     } 

     buffer.rewind(); 
     gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 4,imageData.width, imageData.height,0, 
         GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, buffer); 

     gl.glEnable(GL.GL_TEXTURE_2D); 
     int [] textures = new int [1]; 
     gl.glGenTextures(1, textures, 0); 

     gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0]); 

     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT); 
     gl.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR); 

     gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE); 

     gl.glBegin(GL.GL_QUADS); 

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

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

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

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

     gl.glEnd(); 
     gl.glDisable(GL.GL_TEXTURE_2D); 
+0

欢迎来到StackOverflow,我希望你阅读[FAQ](http://stackoverflow.com/faq#howtoask)。 –

回答

1

要调用gl.glTexImage2D任何纹理结合之前(或者一些其他纹理方向),但这个函数改变当前绑定的纹理对象的纹理图像。所以在你的代码中,你应该在gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0])之后调用它。因为你不应该在每一帧都创建一个新的纹理对象(不要从硬盘读取图像)(让我们不要在每帧中调用这个函数)除了你实际上并没有删除它)。实际上,您应该在一些初始化代码中创建纹理对象,将图像放入其中并调整其参数,以便在绘图代码中只需拨打glBindTexture(或者glEnable(GL_TEXTURE_2D)或类似的东西)即可。