2

プログラムでテクスチャとして使用するために bmp 画像を読み込もうとしてきましたC++ のテクスチャ ローダー コードに基づいたこのコードを使用して、IOStreamクラスを使用して写真のピクセルを読み取るように拡張しました。DataInputStream

//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

どれも機能しませんでした。

4

3 に答える 3

1

最新のコメントから判断すると、IOException が発生しなくなりましたが、テクスチャを実際にレンダリングするのにまだ問題があります (白い四角形を取得するだけです)。

ここに投稿したコードに次のものが含まれていないことに気付きました(ただし、他の場所にある可能性があります):

gl.glGenTextures 

テクスチャをバインドする前に、テクスチャの場所を生成する必要があります。また、テクスチャリングが有効になっていることを確認してください。

gl.glEnable(GL.GL_TEXTURE2D);

OpenGL テクスチャリングの開始に関する追加情報/チュートリアルについては、NeHe Productions: OpenGL Lesson #06を読むことをお勧めします。また、ページの下部には、概念を C から Java に変換するのに役立つ JOGL サンプル コードがあります。

とにかく、これがいくつかの新しいアイデアを試してくれることを願っています.

于 2010-01-24T03:46:03.070 に答える
0

おそらくこれについてはもう助けは必要ありませんが、IOStream が DataInputStream を拡張していることに気付きましたが、実際に read() を実装するときは空白のままです。したがって、テクスチャが空白である理由を説明する可能性のある buf に実際に何も読み取っていないにもかかわらず、他の問題は発生しません。

于 2010-03-27T01:19:07.533 に答える
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 に答える