Hello, I'm trying to make use of the PBO (pixel object buffer, not PBuffer) to make rendering a pattern (a console logging event) better. But the unpacked pbo will not render correctly.
I managed to pack() a stencil plane where it's drawn the pattern of some GLdrawString(x,y,str) calls on an area named ROI (a Rectangle.bounds). I use ARBPixelBufferObject.*.
/*
* {@link GLHandler.ext#PixelBufferObjects} must be available
*
*/
public void unpack() {
assert _pboItemR().data.capacity() == _pboItemW().data.capacity() : "bytes size are different on read and write buffers. Pack() first before to unpack!";
if (!ROI().isEmpty()) {
/** "decals" pattern drawing */
GL11.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glColorMask(false, false, false, false);
GL11.glEnable(GL11.GL_STENCIL_TEST);
GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 1);
GL11.glStencilOp(GL11.GL_REPLACE, GL11.GL_REPLACE, GL11.GL_REPLACE);
GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
ARBPixelBufferObject.glBindBufferARB(ARBPixelBufferObject.GL_PIXEL_UNPACK_BUFFER_ARB, pboBufferW());
if ((bstate & DIRTY) != 0) {
ARBPixelBufferObject.glBindBufferARB(ARBPixelBufferObject.GL_PIXEL_PACK_BUFFER_ARB, pboBufferR());
/** copy to the bytebuffer
length - the length of the mapped memory in bytes.
old_buffer - A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created.*/
_pboItemR().data = ARBPixelBufferObject.glMapBufferARB(ARBPixelBufferObject.GL_PIXEL_PACK_BUFFER_ARB, ARBPixelBufferObject.GL_READ_ONLY_ARB, null);
if (_pboItemR().data == null) {
if (DebugMap._getInstance().isDebugLevelEnabled(RenderingScene.DBUG_RENDER)) {
System.err.println(JXAenvUtils._JXAEnvOutput(StencilPBO.class.getSimpleName() + " : no pbobuffer read !!!", JXAenvUtils.SYS_ERROR));
}
_pboItemR().data = BufferIO._new(0);
} else {
if (DebugMap._getInstance().isDebugLevelEnabled(RenderingScene.DBUG_RENDER)) {
System.out.println("found a packed pbobuffer of " + FileUtils.byteCountToDisplaySize(_pboItemR().data.capacity()));
}
}
_pboItemW().data = new BufferIO<ByteBuffer>(_pboItemR().data).getData();
ARBPixelBufferObject.glBufferDataARB(ARBPixelBufferObject.GL_PIXEL_UNPACK_BUFFER_ARB, _pboItemW().data, ARBPixelBufferObject.GL_STREAM_DRAW_ARB);
ARBPixelBufferObject.glUnmapBufferARB(ARBPixelBufferObject.GL_PIXEL_PACK_BUFFER_ARB);
ARBPixelBufferObject.glBindBufferARB(ARBPixelBufferObject.GL_PIXEL_PACK_BUFFER_ARB, 0);
bstate = PACKED;
}
if ((bstate & CLEARED) == 0) {
if (DebugMap._getInstance().isDebugLevelEnabled(RenderingScene.DBUG_RENDER)) {
System.out.println("Unpacked Buffer " + FileUtils.byteCountToDisplaySize(GL15.glGetBufferParameter(ARBPixelBufferObject.GL_PIXEL_UNPACK_BUFFER_ARB, ARBPixelBufferObject.GL_BUFFER_SIZE_ARB)));
}
GLHandler._transformBegin(ROI, z, transform, scaleArgs, translateArgs, rotateArgs);
/** draw stored pbo stencil */
/** project depth bounds */
float scaleX = Math.round(ROI.width / ROIpack.width), scaleY = Math.round(ROI.height / ROIpack.height);
/** set rasterpos, and pixel scale*/
GL11.glPixelZoom(scaleX, scaleY);
GL11.glDrawPixels(ROIpack.width, ROIpack.height, GL11.GL_STENCIL_INDEX, GL11.GL_BITMAP, 0);
GL11.glPixelZoom(1, 1);
GLHandler._transformEnd();
}
ARBPixelBufferObject.glBindBufferARB(ARBPixelBufferObject.GL_PIXEL_UNPACK_BUFFER_ARB, 0);
GL11.glPopAttrib();
}
}[/tt]
I find this output in System.out :
Quotefound a packed pbobuffer of 600 bytes
Unpacked Buffer 600 bytes
found a packed pbobuffer of 54 bytes
Unpacked Buffer 54 bytes
found a packed pbobuffer of 72 bytes
Unpacked Buffer 72 bytes
found a packed pbobuffer of 72 bytes
Unpacked Buffer 72 bytes
found a packed pbobuffer of 176 KB
Unpacked Buffer 176 KB
found a packed pbobuffer of 176 KB
Unpacked Buffer 176 KB
found a packed pbobuffer of 1004 bytes
Unpacked Buffer 1004 bytes
But unpack operation looks weird see attached snapshot below (target layout is Capturepbo1 and when using pbo Capturepbo2) !!
:D
I had to pack and unpack with GL_FLOAT .... and also used glWindowPos to position the rasterPos for drawPixels. seems that rasterPos is not updated correctly by glRasterPos and modelview etc.
pack() {
// gluPROJECT ROI(bounds Rectangle)
GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);
Project.gluProject(ROI.x, ROI.y, z, mView = _GLgetTopOftheStackMX(GL11.GL_MODELVIEW_MATRIX), mProj = _GLgetTopOftheStackMX(GL11.GL_PROJECTION_MATRIX), viewport, pos);
int x = Math.round(pos.get()), y = Math.round(pos.get());
viewport.rewind();
pos.rewind();
Project.gluProject((float) ROI.getMaxX(), (float) ROI.getMaxY(), z, mView, mProj, viewport, pos);
/** window coordinates !*/
ROIpack.setFrameFromDiagonal(x, y, pos.get(), pos.get());
...
GL11.glReadPixels(ROIpack.x, ROIpack.y, ROIpack.width, ROIpack.height, GL11.GL_STENCIL_INDEX, GL11.GL_FLOAT, 0);}
unpack() {...
GL14.glWindowPos3d(ROIpack.x, ROIpack.y, z);
GL11.glDrawPixels(ROIpack.width, ROIpack.height, GL11.GL_STENCIL_INDEX, GL11.GL_FLOAT, 0);}