Deffered RenderingとofFbo

現状ではofFboのバグのため、Deffered RenderingのためのG-Bufferを作ることすらできないのでちょっと残念である。(現時点でバグのためのPull Requestは出ている) とはいえofFboの設計思想についてはMTR(Multi Target Rendering)を想定して設計されているようだ。

これは実際に作っているDeffered Renderingのデバッグビュー

一例であるが、下記のようにDeffered RenderingのGbufferが構成できる。

ofFbo::Settings gSetting;
gSetting.textureTarget=GL_TEXTURE_2D;
gSetting.depthStencilAsTexture=true;
gSetting.depthStencilInternalFormat=GL_DEPTH_COMPONENT; //depth
gSetting.height=height;
gSetting.internalformat=GL_RGB;
gSetting.maxFilter=GL_NEAREST;
gSetting.minFilter=GL_NEAREST;
//これが現在バグっている(of0.8.0)↓↓
gSetting.colorFormats.push_back(GL_RGB); //diffuse
gSetting.colorFormats.push_back(GL_RGB); //specular
gSetting.colorFormats.push_back(GL_RGBA);//Normals + SSAO.
gSetting.colorFormats.push_back(GL_RG8); //velocity
gSetting.useDepth=true;
gSetting.useStencil=false;
gSetting.width=width;
gSetting.wrapModeHorizontal=GL_CLAMP_TO_EDGE;
gSetting.wrapModeVertical=GL_CLAMP_TO_EDGE;
gbuffer.allocate(gSetting);	

個人的に加えて欲しいのがMTRのためのテクスチャのアタッチメントだ。ofFboではFboオブジェクトがテクスチャを内包するような設計のため、内部テクスチャを他のFBOにアタッチすることができない。いや、実際は下記のようにすればできるわけだから、窓口が用意されていないだけか。

//bind a velocity buffer to HDR Buffer
ofTexture &velTex=gbuffer.getTextureReference(3);
mFboHDR.begin(false);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0+1,velTex.texData.textureTarget,velTex.texData.textureID,0);
mFboHDR.end();

例えば、ライティングを必要としない光源や環境マップをHDRレイヤーに直接レンダリングする際、G-Bufferに書き込みはしないが、Velocity bufferを更新する必要がある。このようなケースではGbufferのVelocity textureをHDRレイヤーのFBOにもアタッチしておけば、余計なレンダリングパスを増やさなくてすむことになる。

とまぁ実装しててcoreの色々足りないところが出てきている。
例えばofTextureについてはcube Textureはiblのために必要だし、1D textureも使えた方がいい。これらはofTextureを継承してofxCubeTexture、ofxTexture1Dみたいに実装している。

また、遅延レンダリングをするには、シェーダーを含めたマテリアルの管理システムが必要になってくる。of標準のofMesh,ofMaterialクラスでは限界があるのでこの辺りはもうちょっと拡張していく必要がありそう。assimpも含めてマテリアル情報を正確に取り込み、レンダリングする仕組みを作らなければならないだろう。これは今後の課題。

とまぁいろいろやってみると、どんどんopenframeworksの使いやすさからかけ離れていきそうなので、完全に独立したレンダリングエンジンになっていきそう・・・。

CubeTexutureのシームレスなMipMap

くそハマった・・・。

IBL(image based ligting)における光源にCubeTextureのMipMapを使うとき。(もちろんIBLじゃなくても。)
CubeTextureはそのままではそれぞれのイメージで独立した画像としてMipMapを作成するため、高レベルのMipMapを使うとCubeが綺麗に繋がらない。もうこれがどうやったら回避できるのか、諦めてMipMap用のシェーダー書き始めたところで発見した・・・。

CubeTexutureのシームレスなMipMapは下記1行。

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);

IBL実装したら写実感がめっちゃアップした。