OpenGLのテクスチャの取り扱いに関する自分用メモ
(勘で書いているのであまりあてにしないでください。自分へのメモ書きのつもりで書いています)
テクスチャに関するポイント
テクスチャスロット
テクスチャスロットは描画されるテクスチャのスタックで、描画する際はここに置いてあるものを参照してテクスチャサンプリングを行う。テクスチャスロットは一回の描画単位(glDrawElements)で決定される。スロットの数はハードによって異なる(?)
テクスチャをShaderに結び付ける際、『glUniform1i(自分のエンジンだとMaterial::SetTexUniform)』にはその テクスチャを割り当てている『テクスチャスロット番号』を指定する
テクスチャを使用するまでの手順
テクスチャの生成
glGenTextures・glBindTexture・glTexParameteri・glTexImage2Dでテクスチャを生成する。このとき、そのテクスチャの識別用固有IDが一緒に返ってくる(ここまでは簡単)
描画
- glActiveTextureに任意のテクスチャスロット番号(GL_TEXTUREi)を渡し、使用するテクスチャスロットをアクティブにする
- glBindTextureでテクスチャをバインドする(第二引数には識別用の固有テクスチャIDを渡す)。このときステップ1でアクティブにしたテクスチャスロットにテクスチャが割り当てられる(おそらくglActiveTextureを使用しない場合は自動的にGL_TEXTURE0に割り当てられる?)
- glUniform1iにステップ1のテクスチャスロット番号を渡し、テクスチャをShaderに結び付ける
- 今のドローコール内の次のテクスチャをShaderに割り当てる(1~3を繰り返す)
- テクスチャの割り当てが終わったら描画を実行する
- 描画して使い終わったら、もう一度glActiveTexture後、glBindTexture(GL_TEXTURE_2D, 0) でバインドを解除しておく(なんかこれをしとないと別のとこに影響して描画がおかしくなることがある???)
- また別のオブジェクトの準備に移行する
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, mTextureID);
m_material->SetTexUniform("_SrcTexture", 2);
Draw();
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, 0);