GLSL を使用した OpenGL (3.X) の「被写界深度」の実装に取り組んでいます。それはかなりうまく機能し、中央の深度はシェーダー(テクスチャ(tex1、vec2(0.5)))によってオートフォーカスに使用されます。しかし、そのような実装フォーカスの使用はすぐに起こります。彼は目が好きなはずです-徐々に適応します。このためには、CPU メモリの側面の真ん中に深さが必要です。私はPBOの使い方を知っています.PBOを使用してピクセル/ピクセルの色を読み取ると、かなり高速に動作します(非同期で実行されます)が、GL_RGBをGL_DEPTH_COMPONENTに変更するとパフォーマンスが大幅に低下します. 中央の深さが何色なのか比較的早く読める方法はありますか?
glReadPixels(a/2, b/2, 1, 1, GL_RGB , GL_BYTE, 0); // WORKS FINE - 30 ns
glReadPixels(a/2, b/2, 1, 1, GL_DEPTH_COMPONENT, GL_BYTE, 0); // WORKS SLOOOW - around 3500 microseconds
glReadPixels(a/2, b/2, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, 0); // WORKS SLOOOW- around 3500 microseconds
@EDIT: FBO テクスチャを作成しました:
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT32F , sett.framebuffer_width, sett.framebuffer_height, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
ダウンロード深度:
index = (index + 1) % 2;// for ping-pong PBO
nextIndex = (index + 1) % 2;// for ping-pong PBO
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pboIds[index]);
glReadPixels(w/2, h/2, 1, 1, GL_DEPTH_COMPONENT , GL_FLOAT, 0);
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
深さを RAM にコピー:
GLfloat tabc[10];
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pboIds[nextIndex]);
GLfloat* srccccc = (GLfloat*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
tabc[0]=*srccccc;
std::cout<<"Depth center: "<<tabc[0]<<std::endl;//only to check is that correct
glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
現在、はるかに高速に動作しています (3500 マイクロ秒から 357 マイクロ秒)。今はいいですか?すべてのフォーマット?