NeHeのテクスチャマッピングチュートリアルを見ています。テクスチャをロードするだけでは非常に複雑に見えます。
SFMLにテクスチャをロードしてOpen GLで使用する方法はありますか?私はウィンドウ処理にSFMLを使用しています。
NeHeのテクスチャマッピングチュートリアルを見ています。テクスチャをロードするだけでは非常に複雑に見えます。
SFMLにテクスチャをロードしてOpen GLで使用する方法はありますか?私はウィンドウ処理にSFMLを使用しています。
回答:
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_REPEAT
(GL_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
テクスチャメッシュを描画するために使用できるはずです。
glEnable(GL_TEXTURE2D);
init関数を入力してみてください。
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