OpenGL用のSFMLでテクスチャをロードするにはどうすればよいですか?


回答:


16

OpenGLへようこそ。そこでは、高速なものが無料で、簡単なものが困難になります。

サンプルが「テクスチャをロードするためだけに」長くて複雑だと思った場合は、まだ何も見ていません。DDSテクスチャのロード、HDRテクスチャの処理、キューブマップのサポート、テクスチャへのレンダリングなどが必要になるまで待ちます。

OpenGLでのテクスチャのロードは、2つのコンポーネントで構成されています。

  • 画像形式からデータを取得する。ファイルからテクスチャをロードしたり、手続き的に生成したりできます。色情報の配列が適切であれば、それは問題ではありません。

  • ビデオカードにデータを置く。データはシステムRAMからビデオRAMに移動する必要があります。

SFMLには標準の画像ローダーが付属しているため、最初の部分は簡単です。

sf::Image img_data;
if (!img_data.LoadFromFile("images/avatar.png"))
{
    LOG_ERROR("Could not load '%s'.", "images/avatar.png");
    return false;
}

次に、OpenGLテクスチャオブジェクトを生成する必要があります。

GLuint texture_handle;
glGenTextures(1, &texture_handle);

テクスチャをバインドするには、いくつかの選択肢があります。3つの主なタイプ:1D、2D、3Dがあり、キューブマップ(+ X、-X、+ Y、-Y、+ Z、-Z)をサポートしています。ただし、99%の場合、2Dテクスチャが必要になります。

glBindTexture(GL_TEXTURE_2D, texture_handle);

次に、興味深い部分について説明します。データをビデオカードにアップロードしましょう。

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    img_data.GetWidth(), img_data.GetHeight(),
    0,
    GL_RGBA, GL_UNSIGNED_BYTE, img_data.GetPixelsPtr()
);

最後に、いくつかのテクスチャパラメータを設定できます。これらは次のような質問に答えます:(0.0、1.0)の範囲外のテクスチャ座標を使用するとどうなりますか?折り返しますかGL_REPEATGL_CLAMP)、何もしませんか()?また、テクスチャに線形補間を使用することをビデオカードに説明するために使用することもできます。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

これで、テクスチャをバインドして、glBindTextureテクスチャメッシュを描画するために使用できるはずです。


MMM、私はそうしようと、私が得るすべてはホワイトキューブである:pastebin.com/nVQFAMRJ
Darestium

glEnable(GL_TEXTURE2D);init関数を入力してみてください。
knight666

すばらしい、うまくいきました!ありがとう!ところで、その機能は何をしますか?テクスチャリングを有効にしますか?
Darestium

はい、2Dテクスチャオブジェクトをオンにして、テクスチャデータを受信できるようにします。初期化時に一度だけ有効にする必要がありますが、コードを新しいプロジェクトにコピーするときに忘れられることがよくあります。私も含まれます。;)
knight666

とてもいい説明。チュートリアルを書くことができます!
danijar

2

SFML 2.0以降では、テクスチャのロードがさらに簡単になります。

sf::Texture texLid;
std::string image2="images/top.jpg";
if (!texLid.loadFromFile(image2))
{
    std::cout << "Could not load" << image2;
    char c;
    std::cin>>c;
    return false;
}


glEnable(GL_TEXTURE_2D);//tell OpenGL to use textures when drawing

sf::Texture::bind(&texLid);//select this texture for OpenGL rendering
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.