0

iOS でオフスクリーン レンダリングを実行する際に問題が発生しています。以下は、フレームバッファ オブジェクトと関連するバッファを設定するためのコードです。これは基本的に、Apple が開発者センターに置いているコードと同じです。

glGenFramebuffers(1, &pick_id);
glBindFramebuffer(GL_FRAMEBUFFER, pick_id);

GLuint color_id, depth_id;
glGenRenderbuffers(1, &color_id);
glBindRenderbuffer(GL_RENDERBUFFER, color_id);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, screen_width, screen_height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_id);

glGenRenderbuffers(1, &depth_id);
glBindRenderbuffer(GL_RENDERBUFFER, depth_id);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, screen_width, screen_height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_id);

std::cout << pick_id << " " << color_id << " " << depth_id << std::endl;

switch(glCheckFramebufferStatus(GL_FRAMEBUFFER))
{
  case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: std::cout << "framebuffer incomplete attachment" << std::endl; break;
  case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: std::cout << "framebuffer incomplete missing attachment" << std::endl; break;
  case GL_FRAMEBUFFER_UNSUPPORTED: std::cout << "framebuffer unsupported" << std::endl; break;
  case GL_FRAMEBUFFER_COMPLETE: std::cout << "framebuffer complete" << std::endl; break;
}

glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glFinish();

GLubyte pix[] = {0, 0, 0};
glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pix);

std::cout << (int)pix[0] << " " << (int)pix[1] << " " << (int)pix[2] << std::endl;

これを実行すると「framebuffer complete」と表示されるので、framebuffer オブジェクトが正しく設定されていると思います。しかし、glReadPixels を呼び出すと、設定したクリア カラー (赤) が返されることが期待されますが、代わりに黒が返されます。

ここに欠けているものはありますか?アプリでオブジェクトを選択するためにオフスクリーン レンダリングを機能させようとしています。

4

2 に答える 2

0

上記のコードは正しいようです。唯一の問題は、GL_RGBA を glreadpixels の引数として使用する必要がある iOS では、GL_RGB が機能しないことです。

于 2013-09-27T06:30:14.370 に答える
0

追加する必要があると思います

glReadBuffer(GL_COLOR_ATTACHMENT0);

glReadPixels の前に。しかし、それがうまくいかない場合、私はアイデアがありません。

于 2013-09-27T00:14:41.773 に答える