我一直在尝试加载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
这应该是什么意思,我该如何解决?
我试图:
\
和\\
以及/
和//
c:\
到photoname.bmp
1.bmp
没有工作。
答案 0 :(得分:1)
根据您的最新评论判断,您不再获得IOException,但仍然无法让纹理实际呈现(只是获得一个白色方块)。
我注意到以下内容不在您发布的代码中(但可能在其他地方):
gl.glGenTextures
在绑定纹理之前,您需要generate个纹理位置。此外,请确保您已启用纹理:
gl.glEnable(GL.GL_TEXTURE2D);
有关开始使用OpenGL纹理的其他信息/教程,我建议您阅读NeHe Productions: OpenGL Lesson #06。此外,在页面底部,您将找到JOGL示例代码,以帮助您将概念从C转换为Java。
无论如何,希望这会给出一些新想法。
答案 1 :(得分:0)
可能不再需要这方面的帮助,但我注意到IOStream扩展了DataInputStream,但是当涉及到实际实现read()时,它被留空了。因此,无论你是否真的从未读过任何东西到buf中,这可能解释了为什么你的纹理是空白但你没有遇到任何其他问题。
答案 2 :(得分: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);
...