【问题标题】:Texture loading at JOGLJOGL 的纹理加载
【发布时间】:2010-01-21 12:13:05
【问题描述】:

我一直在尝试加载 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. 使用\\\///
  2. 改变照片的路径,把c:\的所有路径都取到photoname.bmp
  3. 使用1.bmp等数字重命名照片

都没有用。

【问题讨论】:

  • 通过阅读这篇文章,我无法判断纹理是位于 jar 中还是位于文件系统中。你能详细说明一下吗?
  • 在文件系统中我创建了一个包“数据”并将照片添加到其中但在更改加载器代码后它可以正常工作并完美加载纹理“我试图打印图片的信息和它可以工作“..但是当它绑定纹理时没有发生任何事情它绘制了一个白色正方形!

标签: java loading iostream textures jogl


【解决方案1】:

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

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

gl.glGenTextures 

在绑定纹理之前,您需要 generate 放置纹理。另外,请确保您已启用纹理:

gl.glEnable(GL.GL_TEXTURE2D);

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

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

【讨论】:

  • 不幸的是..它写在其他地方,也是我问了一些朋友的启用行,他们告诉我这可能是由我的计算机显卡的硬件问题引起的,这可能吗?如果这是问题,有办法解决吗?
  • @Nour - 假设您正在运行 Windows 或 OSX,您可以尝试使用 OpenGL 扩展查看器来查看您的显卡支持的确切内容:realtech-vr.com/glview 如果您有旧显卡,我建议您尝试加载尺寸正好为 256*256 像素的纹理。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是在 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);
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多