4

C ++ OpenGLでは、各ピクセルを手動で(私が想定するテクスチャとして)単純な正方形のプリミティブ、または実際に正方形を形成する2つのポリゴンに描画したいと思います。

どこから始めればいいのか、どんなフレーズを探すのかわからない。テクスチャマッピングまたはテクスチャの作成を探していますか?ほとんどの例はファイルからロードすることですが、私はそれをしたくありません。

私はOpenGLプログラミングガイドブックを読んでみましたが、OpenGLにまったく慣れていないので、それは単なる迷路です。助けてください。

4

6 に答える 6

6

glTexImage2D をよく見てください。これは、2D テクスチャの OpenGL に画像をロードする呼び出しです。

glTexImage2D は実際には、画像内のピクセル データへの生のポインターを受け取ります。自分でメモリを割り当て、画像データを直接設定し (必要に応じて)、この関数を呼び出して画像を OpenGL に渡すことができます。

テクスチャを作成したら、ステートにバインドして、三角形がそのテクスチャを使用できるようにします。

OpenGL には、テクスチャとして使用される画像をファイルからロードする必要があるものは何もありません。テクスチャの優れたリソースは、この GameDev 記事にあります。

于 2009-03-20T02:14:13.103 に答える
1

描画している正方形が 2 次元で回転していない場合、 glDrawPixelsを探している可能性があります。ポリゴンを使用せずに、ピクセルの長方形領域をバッファに直接描画できます。

于 2009-03-20T07:20:25.223 に答える
0

初めての方は、 NeHeのチュートリアル1から始めることをお勧めします。

于 2009-03-20T03:34:19.777 に答える
0

glTexImage2D()ロードするピクセルへのポインターを受け取りますが、呼び出し後のそのデータへの変更は気にしないことに注意してください。つまり、データは指定したメモリ領域から実際にロードされ、OpenGL は独自のコピーを作成します。

これは、データが変更された場合、glTexImage2D() 呼び出しをやり直すかglTexSubImage2D()、部分的な更新を行うなどの方法を使用する必要があることを意味します。テストとプロファイリングを行って、サブテクスチャの更新が迅速かどうかを確認することをお勧めします。実際のドライバーがその場合にどのように最適化されるかはわかりません。

于 2009-03-20T07:15:04.177 に答える
0

に向けて私を指摘してくれたReed Copseyに感謝しglTexImage2Dます。これは非常に単純です。GLubyte の配列をglTexImage2D関数に渡すだけです (テクスチャをバインドするために必要なすべての関数なども同様です)。この正確なコード スニペットはまだ試していませんが、問題なく動作するはずです。配列要素は、行、列、およびチャネルのシリアル バージョンを表します。

int pixelIndex = 0;
GLubyte pixels[400];

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; x++)
    {
         for (int channel = 0; channel < 4; channel++)
         {
             // 0 = black, 255 = white
             pixels[pixelIndex++] = 255;
         }
    }
}

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, SIZE, SIZE, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, pixels);

モノクロ画像に2D配列を使用できるOpenGLの本を読んだので、3D配列も使用できると思います。

于 2009-03-29T01:34:44.827 に答える
-1

あなたが探しているものは、一般的に「テクスチャへのレンダリング」と呼ばれています。

http://developer.nvidia.com/object/gdc_oglrtt.html

そのチュートリアルはかなり古いです。これらの拡張機能のいくつかは、実際には新しいバージョンの OGL の拡張機能ではないと思います。申し訳ありませんが、これ以上お役に立てません。グラフィックス API を直接操作することはもうほとんどありません。できれば D3D を使用したいと思います (拡張機能のスープを避けるため、およびその他の理由により、ここで退屈させることはしません)。

于 2009-03-20T06:56:41.537 に答える