私は若い頃から好きなゲームを "ハッキング"していましたが、OpenGL呼び出しを傍受してopengl32.dllラッパーを使ってC++コードを挿入することができました。私はこのためにいくつかのクールな使い方を考え出すことができましたが、私の現在の目標は、この古いゲームにglslシェーダーをポスト処理してよりモダンなものにすることです。ゲームはもともと90年代後半にリリースされたので、OpenGLとそのレンダリングコードの使用は限定的/プリミティブ/時代遅れです。フレームバッファーを注入する
私はglslシェーダプログラムを初期化して使用するコードを注入することで頂点シェーダとフラグメントシェーダを正常に作成できましたが、フレームバッファを作成する/テクスチャにシーンをレンダリングするという問題がサンプラとしてフラグメントシェーダに送信されます。私が知る限り、私が作り出すテクスチャは、通常はすべて黒です。
私がやっていることに関連するリソースを見つけて、未処理のopengl呼び出しを調べることは難しいです(私は、ゲームプレイの単一フレームのOpenGLトレースを読み込んでコードを挿入する場所を決定しようとしています)。私が間違ってやっていることの周りに私の頭を包み込むことができなかった。
私は多くの場所にコードを入れようとしましたが、ゲームコールがwglSwapBuffers()
のコールの後にバインドしています。次のglFlush()
コールの直前にバインドを解除していますが、わかりません複数のビューポートの設定や行列操作、またはこれらの時間の間に作成されたその他のものが何らかの形でフレームバッファを使いこなしている場合。
これはフレームバッファを初期化するコードです:
void initFB()
{
/* Texture */
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &fbo_texture);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
/* Depth buffer */
glGenRenderbuffers(1, &fbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 1920, 1080);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
/* Framebuffer to link everything together */
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth);
GLenum status;
if ((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE) {
fprintf(stderr, "glCheckFramebufferStatus: error %p", status);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
これはwglSwapBuffers
後に呼び出さコードです:
GLenum fboBuff[] = { GL_COLOR_ATTACHMENT0 };
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glDrawBuffers(1, fboBuff);
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
これはglFlush()
前に呼び出さコードです:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glPopAttrib(); // Restore our glEnable and glViewport states
... Draw an Overlay containing with fbo texture binded ...
Hereは単一フレームのglトレースです。
これはほぼ800行ですが、訓練されたOpenGLの眼では、いつどのような呼び出しが行われているか見ることができます。私は少なくとも何百行もの描画呼び出しを削除しました。
おそらく、残りのコードが正しいかどうかを確認するためにglReadPixelsでテクスチャを更新してみてください。 –