0

私はしばらくの間、Graphics、Graphics2DなどでJavaの通常のグラフィックデバイス、awt、swingなどを使用してきましたが、LWJGLに関する一連のチュートリアルを見始めました。私は本当に楽しんで、そのシステムで自分のゲームの 1 つをやり直すことにしました。ロジックはすでにあるので、簡単だと思いました。そして、1 つの概念上の問題に遭遇しました。

この特定のケースでは、ボックスを表すクラス Box がありましたが、画像で描画して境界線を作成しました。私は9枚の画像を持っていました.1枚は中央に1枚(これはプレーンカラーの1ピクセル幅の画像です)、4枚は側面に、4枚は角に使用しました。すべてのボックスで同じだったので、静的な BufferedImage 配列にこのすべての画像がありました。次に、各ボックスにはグローバルな BufferedImage があり、そこにボックスを描画しましたが、ボックスのすべての部分に画像を描画する必要があるため、これは非常に遅いプロセスです。次に、実際の draw メソッド (Graphics g を受け取った) で、正しい位置に BufferedImage を描画しました。ボックスが作成されると、ボックスのサイズは変更されないため、コンストラクターでボックス イメージを 1 回「作成」するだけで済みました。

gl_ メソッド (glBegin()、glVertex2i()) は、指定したことがないにもかかわらず、常に画面に描画されるため、LWJGL でそれを行う方法を理解できませんでした。では、どのように画像に描画し、どのようにメモリに保存するのですか (BufferedImage も使用します)。また、必要なときに画面に描画するにはどうすればよいですか? LWJGL がテクスチャを使用していることがわかったので、BufferedImage の最初の静的配列を Texture の静的配列にし、その中に 9 つのテクスチャのそれぞれを正しく保存しました。それは正しい方法ですか?グローバル BufferedImage はどうですか? グローバル テクスチャである必要がありますか? その場合、テクスチャに「描画」する方法は?

4

3 に答える 3

1

OpenGL では、スケーリングは非常に安価です。事前に何も生成する必要はありません。すべての画像を 1 つのテクスチャに配置し、テクスチャ マッピングを使用して、それらを画面に描画するときに適切に配置およびスケーリングできます。

を使用したソリューションが既にある場合はBufferedImage、そのままにしておいてください。このイメージを GPU で生成しても、あまり時間は節約されません。awt を使用して画像を生成し、そこからテクスチャを作成し、LWJGL を使用して画面に描画します。

本当にやりたい場合は、 を使用して画面からテクスチャに保存できますglCopyPixels。しかし、そこから OpenGL を学び始めるつもりはありません。画像をメイン メモリに転送しないようにします (BufferedImage ではなくテクスチャに保持します)。CPU と GPU 間のデータ送信は非常に遅くなる可能性があります。

于 2012-06-23T17:48:13.090 に答える
1

あなたが探しているテクニックは、通常「Render to Texture」(RTT) と呼ばれます。opengl フレームバッファを作成し、それにテクスチャをアタッチし、フレームバッファをバインドしてから、通常の描画呼び出しを発行します。フレームバッファがバインドされているので、ドローコールはテクスチャに直接描画されます。次に、フレーム バッファをアンバインドし、テクスチャを通常のテクスチャとして使用します。

これらの検索用語を使用すると、これを行う方法についてのチュートリアルをインターネット上で見つけることができると確信しています。

ただ気になるのですが、通常のテクスチャでは描けないボックスはどのようなものですか? たぶん、それについてもっと簡単な方法があります。

于 2012-06-23T17:36:51.910 に答える
1

ウィキから、このLWJGL テクスチャ チュートリアルをご覧ください。この例では、Slick-Util Libraryを使用しているため、画像からテクスチャを簡単に作成できます。


または、テクスチャを自分で生成することもできます。

BufferedImage bufferedImage = ...;
ByteBuffer textureBuffer = convertImageData(bufferedImage);

int texture = glGenTextures();
glBindTexture(GL_TEXTURE_2D, texture);

int pixelFormat;
if (bufferedImage.getColorModel().hasAlpha()) {
    pixelFormat = GL_RGBA;
} else {
    pixelFormat = GL_RGB;
}

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
        bufferedImage.getWidth(), bufferedImage.getHeight(), 0,
        pixelFormat, GL_UNSIGNED_BYTE, textureBuffer);

ああ、私が以前に書いた convertImageData() のこの回答を参照してください。(彼のコードには、削除できる行がいくつかあります)

テクスチャを描画するには: LWJGL Space Invadersの 97 行を参照してください。

于 2012-06-23T17:41:31.973 に答える