3

カラー バッファーの前に深度バッファーをバインドすると、アプリケーションが意図したとおりに動作することに気付きました。

glGenRenderbuffers(1, &_depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh);
glGenRenderbuffers(1, &_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

ただし、後で深度バッファーをバインドすると、glClearColor 設定が無視されても、何もレンダリングされません。

glGenRenderbuffers(1, &_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
glGenRenderbuffers(1, &_depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh);

個々のコンポーネントを徹底的に調査することで、OpenGL ES 2.0 がどのように機能するかの流れの一部を理解するようになりましたが、これは、誰もがチュートリアル/本で行う唯一のことのように見えますが、その理由は説明されていません. 何か案は?これは問題ですか、それともセットアップの残りの部分で何か問題があるのでしょうか? (そうであれば、すべてのコードを含めます)

編集

@cli_hlt - 深度バッファは既にフレームバッファに追加されています:

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderbuffer);

編集

前の深さ境界:

ここに画像の説明を入力 ここに画像の説明を入力

後にバインドされた深さ:

ここに画像の説明を入力

4

1 に答える 1

3

私は完全に間違っているかもしれません—私は自分でこのようなものを処理しているだけです—しかし、私が理解しているように、glBindコマンドはOpenGLに後続の関数に使用するrenderbuffer /texture/何でも指示するだけです。オブジェクト指向プログラミングに慣れているなら、それは奇妙なモデルです。ボイラープレートセットアップコードでは、作成したバッファーをGL_RENDERBUFFER "slot"にバインドして、次のglRenderbufferStorage()または-[EAGLContext renderbufferStorage:fromDrawable:]呼び出しで使用するバッファーを認識できるようにする必要があります。問題は、-[EAGLContext presentRenderBuffer:]を呼び出す前に、アクティブなGL_RENDERBUFFERをカラーバッファーにバインドしていないことだけだと思います。したがって、実際には深度バッファーが表示されています。追加する

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);

presentRenderBufferの前:呼び出しでこれを修正する必要があります。…おもう。

于 2012-04-16T06:08:04.040 に答える