2

我一直在尝试加载 bmp 图片以在我的程序中将其用作纹理我使用了一个IOStream类来扩展DataInputStream以使用此代码读取照片上的像素,该代码基于 C++ 的纹理加载器代码:

//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. 使用\and\\/and//
  2. 更改照片的路径,然后将所有路径从c:\photoname.bmp
  3. 使用数字重命名照片,例如1.bmp

没有工作。

4

3 回答 3

1

从您的最新评论来看,您不再收到 IOException 但仍然无法让纹理实际渲染(只是得到一个白色方块)。

我注意到您在此处发布的代码中没有以下内容(但可能在其他地方):

gl.glGenTextures 

在绑定它们之前,您需要为纹理生成位置。此外,请确保您已启用纹理:

gl.glEnable(GL.GL_TEXTURE2D);

有关开始使用 OpenGL 纹理的更多信息/教程,我建议阅读NeHe Productions: OpenGL Lesson #06。此外,在页面底部您会找到 JOGL 示例代码,以帮助您将概念从 C 转换为 Java。

无论如何,希望这能提供一些新的想法来尝试。

于 2010-01-24T03:46:03.070 回答
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);
...
于 2012-05-06T22:16:12.850 回答
0

可能不再需要这方面的帮助,但我注意到 IOStream 扩展了 DataInputStream 但是在实际实现 read() 时它被留空。因此,无论您实际上从未将任何内容读入 buf 中,这都可以解释为什么您的纹理为空白但您没有遇到任何其他问题。

于 2010-03-27T01:19:07.533 回答