2

Java と lwjgl を使用して、opengl で 320 x 240 のフルスクリーン解像度の画像を描画しようとして遊んでいます。解像度を 640 x 480 に設定し、スペースを埋めるためにピクセルのサイズを 2 倍にしました。多くのグーグル検索の後、glDrawPixels 関数を使用して画面への描画を高速化する方法に関する情報を見つけました。画面上のすべてのピクセルにランダムな色を割り当ててテストしたかったのですが、画面いっぱいになりませんでした。幅をそれぞれ 80 ピクセルの 4 つのセクションに分割し、赤、緑、青、白に色付けしました。色をインターリーブしていることがわかりましたが、その方法がわかりません。

出力のイメージを次に示します。

画像

ここで openGL コードを実行します。

// init OpenGL
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 640, 0, 480, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);

while (!Display.isCloseRequested()) {
    pollInput();

    // Clear the screen and depth buffer
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);  



    randomizePixels();
    GL11.glRasterPos2i(0, 0);

    GL11.glDrawPixels(320, 240,GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,buff);

    GL11.glPixelZoom(2, 2);


    Display.update();   
}
Display.destroy();
}

ここで、ピクセルの色データを作成します。

public void randomizePixels(){
    for(int y = 0; y < 240; y++){
        for(int x = 0; x < 320; x+=4){
            /*
            pixels[x * 320 + y] = (byte)(-128 + ran.nextInt(256));
            pixels[x * 320 + y + 1] = (byte)(-128 + ran.nextInt(256));
            pixels[x * 320 + y + 2] = (byte)(-128 + ran.nextInt(256));
            pixels[x * 320 + y + 3] = (byte)(-128 + ran.nextInt(256));
            */

            if(x >= 0 && x < 80){
                pixels[y * 240 + x] = (byte)128;
                pixels[y * 240 + x + 1] = (byte)0;
                pixels[y * 240 + x + 2] = (byte)0;
                pixels[y * 240 + x + 3] = (byte)128;
            }else if(x >= 80 && x < 160){
                pixels[y * 240 + x] = (byte)0;
                pixels[y * 240 + x + 1] = (byte)128;
                pixels[y * 240 + x + 2] = (byte)0;
                pixels[y * 240 + x + 3] = (byte)128;
            }else if(x >= 160 && x < 240){
                pixels[y * 240 + x] = (byte)0;
                pixels[y * 240 + x + 1] = (byte)0;
                pixels[y * 240 + x + 2] = (byte)128;
                pixels[y * 240 + x + 3] = (byte)128;
            }else if(x >= 240 && x < 320){
                pixels[y * 240 + x] = (byte)128;
                pixels[y * 240 + x + 1] = (byte)128;
                pixels[y * 240 + x + 2] = (byte)128;
                pixels[y * 240 + x + 3] = (byte)128;
            }

        }
    }
    buff.put(pixels).flip();
}

ピクセルを x 座標と y 座標に揃えることができない理由を理解できれば、それは素晴らしいことです。glDrawPixels はおそらく画面にピクセルを描画する最良または最速の方法ではないことを読みましたが、他の方法に進む前に、この特定の問題が発生している理由を理解したいと思います。

4

3 に答える 3

4

画像 (スケーリングなし) をテクスチャにロードし、テクスチャ付きのクワッドを描画するだけです。

使用しないでくださいglDrawPixels。この関数は、ほとんどのドライバーで適切に最適化されることはなく、OpenGL-2 以降では非推奨となり、OpenGL-3 コア以降では削除されました。

于 2012-07-05T08:59:06.030 に答える
2

あなたの に 2 つの問題が見つかりましたrandomizePixels()

1. ピクセル バッファのインデックス作成

ピクセル タイプが GL_RGBA であるため、ピクセル バッファの合計サイズは320x240x4 バイトです。したがって、添字演算子 [] を使用して各ピクセルにインデックスを付けると、次のようになります。

for(int y = 0; y < 240; y++)
{
    for(int x = 0; x < 320; x++)
    {
        pixels[y * 320 * 4 + x * 4 + 0] = ... // R
        pixels[y * 320 * 4 + x * 4 + 1] = ... // G
        pixels[y * 320 * 4 + x * 4 + 2] = ... // B
        pixels[y * 320 * 4 + x * 4 + 3] = ... // A
    }
}

2. 色の値

8 ビットカラーの最大強度は255です。たとえば、不透明な赤のピクセルは (255, 0, 0, 255) になります。

于 2012-07-05T16:25:31.813 に答える
0

テクスチャの操作。直交でそれを行う方が良いです。それは良い結果をもたらすだろう

于 2012-07-05T09:20:12.317 に答える