Drawing an OpenGL scene to C# bitmap; off-screen gets clipped -



Drawing an OpenGL scene to C# bitmap; off-screen gets clipped -

i draw complex 2d scene opengl window. user able take screenshot of scene , save jpg. however, them able specify scene can drawn bigger screen (which allow them see more details, etc).

when specify numbers bigger viewport fits screen, not visible them not drawn bitmap. sense have false understanding of behavior of of these opengl functions haven't been able track down.

the below code works totally fine when rendersize smaller default viewport start programme with. if rendersize bigger, jpg of appropriate size gets created, right/top section past screen's visible area blank. if click , drag viewport across sec monitor, more of image gets drawn, still not of if rendersize bigger both monitors. how can create drawing independent of viewport shown screen is?

(i can verify renderlocation , rendersize set correctly when function called, rendersize beingness big number, 7000 x 2000)

public bitmap rendertobitmap(rendermode mode) { // load specific ortho projection contain entire graph gl.matrixmode(matrixmode.projection); gl.pushmatrix(); gl.loadidentity(); gl.ortho(0, rendersize.width, 0, rendersize.height, -1, 1); gl.viewport(0, 0, rendersize.width, rendersize.height); gl.matrixmode(matrixmode.modelview); gl.pushmatrix(); gl.loadidentity(); // move graph starts drawing @ 0, 0 , fills entire viewport gl.translate(-renderlocation.x, -renderlocation.y, 0); gl.clearcolor(color.white); gl.clear(clearbuffermask.colorbufferbit | clearbuffermask.depthbufferbit); // render graph this.render(mode); // set bitmap save bitmap bitmap = new bitmap(rendersize.width, rendersize.height, system.drawing.imaging.pixelformat.format32bppargb); bitmapdata bdata = bitmap.lockbits(new rectangle(0, 0, bitmap.width, bitmap.height), imagelockmode.readwrite, bitmap.pixelformat); // read info straight bitmap's buffer (bitmap stored in bgra) gl.readpixels(0, 0, rendersize.width, rendersize.height, opentk.graphics.opengl.pixelformat.bgra, pixeltype.unsignedbyte, bdata.scan0); bitmap.unlockbits(bdata); bitmap.rotateflip(rotatefliptype.rotatenoneflipy); // compensate opengl/gdi y-coordinates beingness flipped // revert stuff opengl changed gl.matrixmode(matrixmode.projection); gl.popmatrix(); gl.matrixmode(matrixmode.modelview); gl.popmatrix(); homecoming bitmap; }

and here's how initialize gl window, in case comes play.

private void initgl() { gl.clearcolor(color.antiquewhite); gl.disable(enablecap.lighting); gl.clear(clearbuffermask.colorbufferbit | clearbuffermask.depthbufferbit); resetcamera(); } private void resetcamera() { offsetx = offsety = 0; // bottom-left corner pixel has coordinate (0, 0) zoomfactor = 1; setupviewport(); glwindow.invalidate(); } private void setupviewport() { int w = glwindow.width; int h = glwindow.height; gl.matrixmode(matrixmode.projection); gl.loadidentity(); gl.ortho(0 + offsetx, w + offsetx, 0 + offsety, h + offsety, -1, 1); gl.viewport(0, 0, w, h); // utilize of glcontrol painting area }

sounds you're running pixel ownership problem:

14.070 why don't valid pixel info overlapped area when phone call glreadpixels() part of window overlapped window?

this due portion of opengl specification called pixel ownership test. if window obscured window, doesn't have store pixel info obscured region. therefore, glreadpixels() phone call can homecoming undefined info obscured region.

the pixel ownership test varies 1 opengl implementation next. opengl implementations store obscured regions of window, or entire window, in off-screen buffer. such implementation can homecoming valid pixel info obscured window. however, many opengl implementations map pixels on screen one-to-one framebuffer storage locations , don't store (and can't return) pixel info obscured regions of window.

one strategy instruct windowing scheme bring window forwards top of window stack, render, perform glreadpixels() call. however, such approach still risks user intervention might obscure source window.

an approach might work applications render nonvisible window, such pixmap under x windows. type of drawing surface can't obscured user, , contents should pass pixel ownership test. reading such drawing surface should yield valid pixel data. unfortunately, rendering such drawing surfaces not accelerated graphics hardware.

look fbos or pbuffers larger-than-window and/or offscreen rendering.

there's libtr if can't/won't utilize fbos or pbuffers.

c# opengl bitmap screenshot glreadpixels

Comments

Popular posts from this blog

web services - java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer -

Accessing MATLAB's unicode strings from C -

javascript - mongodb won't find my schema method in nested container -