10

たとえば、次のようにピクセルの配列を作成するとします。

int *getPixels()
{
    int *pixels = new int[10];
    pixels[0] = 1;
    pixels[1] = 0;
    pixels[1] = 1;
    // etc...
}

glTexImage2D(..., getPixels());

glTexImage2Dはその参照を使用しますか、それともピクセルを独自のメモリにコピーしますか?

答えが前者の場合、私は次のことをすべきですか?

int *p = getPixels();
glTexImage2D(..., p);

/* Just changed to delete[], because delete
 * would only delete the first element! */
delete[] p;
4

3 に答える 3

9

マニュアルページのこの引用から、glTexImage2Dが独自のメモリを割り当てているように聞こえます。これは理にかなっています。理想的には、OpenGL APIは、グラフィックカード自体に保存されるデータを送信します(ドライバー/実装などが許可されている場合)。

GLバージョン1.1以降では、ピクセルがnullポインタになる場合があります。この場合、テクスチャメモリは幅幅と高さ高さのテクスチャに対応するために割り当てられます。次に、サブテクスチャをダウンロードして、このテクスチャメモリを初期化できます。ユーザーがテクスチャ画像の初期化されていない部分をプリミティブに適用しようとすると、画像は未定義になります。

そうですね、テクスチャを生成した後は、メモリを解放しても害はないと思います。

于 2009-04-19T21:52:25.343 に答える
1

はい、geTexImage2D()returnsの呼び出し後、渡したデータを破棄しても安全です。実際、これを行わないと、次のコードのようにメモリリークが発生します。

int *getPixels()
{
    int *pixels = new int[10];
    pixels[0] = 1;
    pixels[1] = 0;
    pixels[1] = 1;
    // etc...
}

glTexImage2D(..., getPixels());

バッファへのポインタを呼び出しに渡しますが、ポインタが失われ、リークする可能性があります。あなたがすべきことは、それを保存し、呼び出しが戻った後にそれを削除することです:

int *pbuf = getPixels();
glTexImage2D(..., pbuf);
delete[] pbuf;

または、テクスチャのサイズが一定の場合は、スタック上にある配列へのポインタを渡すことができます。

{
    int buf[10];
    ...
    glTexImage2D(..., pbuf);
}

最後に、ポインターと配列について心配したくない場合は、STLを使用できます。

vector<int> buf;
fillPixels(buf);
getTexImage2D(..., buf.begin());
于 2009-04-19T22:21:08.410 に答える
0

ピクセルの描画が終了したら、メモリを解放するためにglDeleteTextures()を呼び出す必要があると思います。

于 2011-12-15T21:42:38.160 に答える