opengl - Injecting a Frame Buffer -
i've been "hacking" 1 of favorite games when younger, , i've managed able intercept opengl calls , inject c++ code using opengl32.dll wrapper. i've been able come number of cool uses this, current goal implement post processing glsl shaders old game make bit more modern. game released in late 90's, usage of opengl , rendering code limited/primitive/outdated.
i have been able produce vertex , fragment shaders injecting code initialize , use glsl shader programs, problem lies in producing framebuffer / rendering scene texture send fragment shader sampler. far can tell, texture produce black.
it's hard find resources relevant doing , examining raw opengl calls (i have been trying determine insert code reading opengl trace of single frame of gameplay), haven't been able wrap head around i'm doing wrong.
i've tried putting code in many places, currently, i'm binding framebuffer after game calls wglswapbuffers()
, i'm unbinding before next glflush()
call made, i'm not sure if multiple viewports setup, or matrix operations, or whatever else created between these times somehow messing framebuffer.
this code initialize framebuffer:
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 link */ 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); }
this code called after wglswapbuffers
:
glenum fbobuff[] = { gl_color_attachment0 }; glbindframebuffer(gl_framebuffer, fbo); gldrawbuffers(1, fbobuff); glpushattrib(gl_viewport_bit | gl_enable_bit);
this code called before glflush()
:
glbindframebuffer(gl_framebuffer, 0); glpopattrib(); // restore our glenable , glviewport states ... draw overlay containing fbo texture binded ...
here gl trace of single frame.
it's 800 lines trained opengl eye should able see calls getting made when. removed several hundred lines of drawing calls atleast understand.
i not sure want do. run game render fbo? render stuff on top? start, try hooking wgl , gl calls. http://research.microsoft.com/en-us/projects/detours/ place start.
but reading post again, guess know that. know want do.
- rendering overlay: hook swapbuffers, stuff there
- capturing: again, hook swapbuffers
- rendering texture , doing post effects: hook bindframebuffer. there catch: frame buffer 0 default @ startup, code not use not call bindframebuffer start, set 0. try hooking glclear or whatever call comes first.
feel free pm me more details. sounds fun educational project love :)
i read post again before posting, , problem might lot easier. windows program target assumes fbo 0 bound when starts rendering frame. that. before it's done, it'll switch fbo 0. don't push/pop thing. make sure fbo same size (on windows bigger ok also) expects. need hook bindframebuffer though. whenever game calls bind 0, need bind yours instead. there no need else touching viewport, game has take care of already. when render in swapbuffers hook, make sure restore change.
also don't need drawbuffers call. confused mole out of me , of target. :) target gl 1.2 code, doing 3...4...
Comments
Post a Comment