toge's diary

コンピュータ関連の趣味をつらつらと。

FBOでRECTANGLE_NVしか使えない 解決編

http://d.hatena.ne.jp/toge/20050709#1120910095 の続き。

Frame Bufferに指定するテクスチャのフィルタをGL_LINEARにすることで解決しました。
やった、これでベンダ依存の苦痛から開放されるぞ。
速度としては1024x1024のテクスチャに40個のtriangleを描画して1.4ms。まあ、そこそこですかね?
最適なピクセルフォーマットがありそうなので、もう少し弄ってみますか。

以下成功するコードです。

// FBOの描画対象になるテクスチャの生成(フィルタをLINEARにすること!)
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// Framebufferを生成
glGenFramebuffersEXT(1, &framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);

// 生成したテクスチャをFramebufferの描画先(色部分)として描画するように設定
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);

// Framebufferをきちんとセットアップ出来たかチェック
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
switch (status)
{
case GL_FRAMEBUFFER_COMPLETE_EXT:
  printf("framebuffer supoprted\n");
  break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
  printf("framebuffer unsupoprted\n");
  break;
default:
  printf("program error\n");
}

// この後の描画が通常描画(Windowに直接描画する)になるようにする
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);