現状では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の使いやすさからかけ離れていきそうなので、完全に独立したレンダリングエンジンになっていきそう・・・。