2010-01-21 132 views
2

我一直在试图加载一个bmp图片作为我的程序纹理使用IOStream类扩展DataInputStream读取基于纹理的代码照片上的像素用于C++加载程序代码:JOGL纹理加载

//class Data members 
public static int BMPtextures[]; 
public static int BMPtexCount = 30; 
public static int currentTextureID = 0; 
//loading methode 
static int loadBMPTexture(int index, String fileName, GL gl) 
    { 
     try 
     { 
      IOStream wdis = new IOStream(fileName); 
      wdis.skipBytes(18); 
      int width = wdis.readIntW(); 
      int height = wdis.readIntW(); 
      wdis.skipBytes(28); 
      byte buf[] = new byte[wdis.available()]; 
      wdis.read(buf); 
      wdis.close(); 
      gl.glBindTexture(GL.GL_TEXTURE_2D, BMPtextures[index]); 
      gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 3, width, height, 0, GL.GL_BGR, GL.GL_UNSIGNED_BYTE, buf); 
      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); 
      currentTextureID = index; 
      return currentTextureID; 
    } 
     catch (IOException ex) 
     { 
      // Utils.msgBox("File Error\n" + fileName, "Error", Utils.MSG_WARN); 
      return -1; 
     } 
    } 

和iostream的代码:

public class IOStream extends DataInputStream { 

    public IOStream(String file) throws FileNotFoundException { 
     super(new FileInputStream(file)); 
    } 

    public short readShortW() throws IOException { 
     return (short)(readUnsignedByte() + readUnsignedByte() * 256); 
    } 

    public int readIntW() throws IOException { 
     return readShortW() + readShortW() * 256 * 256; 
    } 

    void read(Buffer[] buf) { 

    } 
} 

和主叫:

GTexture.loadBMPTexture(1,"/BasicJOGL/src/basicjogl/data/Font.bmp",gl); 

调试后,我想通了,当它来到这个行:

IOStream wdis = new IOStream(fileName); 

IOExeption发生,这是一个DispatchException这是什么应该是说,我怎么能解决呢?

我想:

  1. 使用\\\///
  2. 改变照片的路径,并采取从c:\photoname.bmp
  3. 所有的路径重命名使用数字,如照片1.bmp

无效。

+0

从阅读这个我不能告诉如果纹理位于jar或文件系统。你能详细解释一下吗? – 2010-01-21 18:16:30

+0

在一个文件系统我创建了一个包“数据”,并添加到它的照片 但改变加载程序代码后,它的工作原理和加载完美的纹理“我试图打印图片的信息,它的工作原理”.. ..但是当它来绑定纹理没有发生任何事情时,它绘制了一个白色的方块! – Nour 2010-01-22 09:01:40

+0

嗨,你解决了吗? – elect 2015-08-07 13:31:20

回答

1

根据您的最新评论判断,您不再获得IOException,但仍然遇到让纹理实际渲染(仅获得白色正方形)的麻烦。

我注意到以下不在你这里张贴的代码(但可能是其他地方):

gl.glGenTextures 

你结合他们之前需要generate的地方为你的纹理。此外,请确保您已启用纹理:

gl.glEnable(GL.GL_TEXTURE2D); 

的其他信息/如何开始使用的OpenGL纹理教程,我建议采取的NeHe Productions: OpenGL Lesson #06读。另外,在页面的底部,您会发现JOGL示例代码,以帮助您将概念从C转换为Java。

无论如何,希望这给了一些新的想法尝试。

+0

不幸的是..这是写在其他地方也是实现行 我问了一些朋友,他们告诉我,这可能是由我的电脑显卡的硬件问题可能导致? 如果这是问题有无论如何解决呢? – Nour 2010-01-24 11:27:19

+0

@Nour - 假设您运行的是Windows或OSX,您可以尝试使用OpenGL Extensions查看器来查看您的视频卡支持的内容:http://www.realtech-vr.com/glview/ 如果您有旧视频卡我建议尝试加载尺寸完全为256 * 256像素的纹理。 – Clinton 2010-01-24 23:41:05

0

可能不需要这方面的帮助了,但我注意到IOStream扩展了DataInputStream,但是在实际实现read()时它一直保留为空。所以无论你从来没有真正阅读buf的东西,这可能解释为什么你的纹理是空白的,但你没有任何其他问题。

0

以下是在JOGL中加载纹理的简单方法。它也适用于BMP。

public static Texture loadTexture(String file) throws GLException, IOException 
{ 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    ImageIO.write(ImageIO.read(new File(file)), "png", os); 
    InputStream fis = new ByteArrayInputStream(os.toByteArray()); 
    return TextureIO.newTexture(fis, true, TextureIO.PNG); 
} 

也不要忘记启用和绑定,并设置纹理坐标。

... 
    gl.glEnableClientState(GL2ES1.GL_TEXTURE_COORD_ARRAY); 
    if(myTexture == null) 
    myTexture = loadTexture("filename.png"); 
    myTexture.enable(gl); 
    myTexture.bind(gl); 
    gl.glTexCoordPointer(2, GL2ES1.GL_FLOAT, 0, textureCoords); 
...