シーンをキューブマップにレンダリングする方法を見つけようとしています。私はこれに少し立ち往生しており、皆さんに助けを求めると思いました。OpenGLは初めてで、FBOを使用するのは初めてです。
現在、キューブマップbmpファイルの使用例があり、フラグメントシェーダーのsamplerCubeサンプルタイプがGL_TEXTURE1にアタッチされています。シェーダーコードはまったく変更していません。キューブマップbmpファイルをロードしていた関数を呼び出さず、以下のコードを使用してキューブマップにレンダリングしようとしているという事実を変更しているだけです。
以下のように、GL_TEXTURE1にもテクスチャを再度アタッチしています。これは、ユニフォームを設定したときです。
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
フラグメントシェーダーでにアクセスできますuniform samplerCube Cubemap
。
私は次のような関数を呼び出しています:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
ここで、下の描画ループで、+ x、-x、+ y、-y、+ z、-z軸を見下ろすようにビューの方向を変更していないことに気付きます。私は本当にそれを実装する前に何かが最初に動作するのを見たいだけでした。私は少なくとも、コードが今のようにオブジェクト上に何かを見るべきだと考えました。
私は何も見ていません、ただ真っ黒です。背景を白にしましたが、オブジェクトは黒です。キューブマップテクスチャをサンプリングするために照明と色を削除しましたが、まだ黒です。
GL_RGB8、GL_RGBAのテクスチャを設定するときの問題は、フォーマットのタイプかもしれないと思っていますが、私も試しました:
GL_RGBA、GL_RGBA GL_RGB、GL_RGB
フレームバッファにアタッチされたテクスチャにレンダリングするので、これは標準だと思いましたが、異なる列挙値を使用する異なる例を見てきました。
また、キューブマップを使用するすべての描画呼び出しでキューブマップテクスチャをバインドしようとしました。
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
また、ほとんどの例で見たFBO用の深度バッファーを作成していません。これは、キューブマップのカラーバッファーのみが必要だからです。実際にそれを追加して、それが問題かどうかを確認しましたが、それでも同じ結果が得られました。試してみたときに、それを少しでもおかしくすることができました。
正しい方向に私を向けることができる助けはありがたいです。
GLuint renderToCubeMap(int size, GLenum InternalFormat, GLenum Format, GLenum Type)
{
// color cube map
GLuint textureObject;
int face;
GLenum status;
//glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &textureObject);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureObject);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
for (face = 0; face < 6; face++) {
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, InternalFormat, size, size, 0, Format, Type, NULL);
}
// framebuffer object
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textureObject, 0);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
printf("%d\"\n", status);
printf("%d\n", GL_FRAMEBUFFER_COMPLETE);
glViewport(0,0,size, size);
for (face = 1; face < 6; face++) {
drawSpheres();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, textureObject, 0);
}
//Bind 0, which means render to back buffer, as a result, fb is unbound
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return textureObject;
}
drawSpheres
関数が実際に目に見えるものを描画することを確認するためにテストしましたか?関数は実際に何かを描画しますか?drawSpheres
フレームバッファをクリアするように変更するとどうなりますか?