From: Scott L. <sc...@ma...> - 2003-03-02 06:53:17
|
Hi, I have a little problem. I am creating a context using: OSMesaCreateContextExt ( OSMESA_RGB_565, 16, 0, 0, NULL ); Then binding it using: OSMesaMakeCurrent ( ctx, frameBuffer, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT ) I can clear the screen but can't get anything to render and want to make sure that it can only be my code that is at fault. Does osmesa fully support RGB_5_6_5 mode? Thanks for your time, Scott. |
From: Scott L. <sc...@ma...> - 2003-03-02 12:18:16
|
This is the offending code. I can get some lines to draw when lighting is turned off while drawing them. If I try lighting off for the quads a blank screen results. Cheers, Scott. void doMesaStuff ( unsigned short* frameBuffer ) { OSMesaContext ctx; /* Create an RGB-mode context */ /* specify Z, stencil, accum sizes */ ctx = OSMesaCreateContextExt( OSMESA_RGB_565, 16, 0, 0, NULL ); if ( ! ctx ) { printf("OSMesaCreateContext failed!\n"); return; } /* Bind the buffer to the context and make it current */ if (!OSMesaMakeCurrent( ctx, frameBuffer, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT )) { printf("OSMesaMakeCurrent failed!\n"); return; } { int z, s, a; glGetIntegerv(GL_DEPTH_BITS, &z); glGetIntegerv(GL_STENCIL_BITS, &s); glGetIntegerv(GL_ACCUM_RED_BITS, &a); printf("Depth=%d Stencil=%d Accum=%d\n", z, s, a); } // The code from this point on is actually mine ;-P // Reset modelView matrix glMatrixMode ( GL_MODELVIEW ); glLoadIdentity(); // Turn on some lighting // --------------------- { GLfloat lightAmbient [4] = { 0.35, 0.35, 0.35, 1.0 }; GLfloat lightDiffuse [4] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat lightSpecular [4] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat lightPosition [4] = { 0.0, 0.0, 1.0, 0.0 }; GLfloat modelAmbient [4] = { 0.25, 0.25, 0.25, 1.0 }; GLint localViewer = GL_FALSE; GLint twoSideLight = GL_FALSE; glLightfv ( GL_LIGHT0, GL_AMBIENT, lightAmbient ); glLightfv ( GL_LIGHT0, GL_DIFFUSE, lightDiffuse ); glLightfv ( GL_LIGHT0, GL_SPECULAR, lightSpecular ); glLightfv ( GL_LIGHT0, GL_POSITION, lightPosition ); glLightModelfv ( GL_LIGHT_MODEL_AMBIENT, modelAmbient ); glLightModeli ( GL_LIGHT_MODEL_LOCAL_VIEWER, localViewer ); glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE, twoSideLight ); // Set light attenuation. Play with these values to make things // further away appear darker. glLightf ( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0 ); glLightf ( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0 ); glLightf ( GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0 ); } // Specify the way colour is blended across a polygon. GL_FLAT is faster but GL_SMOOTH looks better //glShadeModel ( GL_SMOOTH ); // Setup the viewport. Don't mess with this to change landscape / portrait settings. // Use the modelview matrix for that. glViewport ( 0, 0, ( GLsizei ) WIDTH, ( GLsizei ) HEIGHT ); glEnable ( GL_LIGHTING ); glEnable ( GL_LIGHT0 ); //glDisable ( GL_LIGHTING ); // Enable Depth Buffer glEnable ( GL_DEPTH_TEST ); // *** Assume everything is in millimetres *** // Translate model in -ve z direction. glTranslatef ( 0.0, 0.0, - 500.0 ); // Setup projection matrix for perspective. glMatrixMode ( GL_PROJECTION ); glLoadIdentity(); glFrustum ( - 38.0, 38.0, - 30.0, 30.0, 300.0, 700.0 ); // Go back to modelView mode. glMatrixMode ( GL_MODELVIEW ); { // Polished Gold GLfloat lightAmbient [4] = { 0.24725, 0.2245, 0.0645, 1.0 }; GLfloat lightDiffuse [4] = { 0.34615, 0.3143, 0.0903, 1.0 }; GLfloat lightSpecular [4] = { 0.797357, 0.723991, 0.208006, 1.0 }; GLfloat lightEmission [4] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat lightShininess = 83.2; // Ambient glMaterialfv ( GL_FRONT, GL_AMBIENT, lightAmbient ); // Diffuse glMaterialfv ( GL_FRONT, GL_DIFFUSE, lightDiffuse ); // Specular glMaterialfv ( GL_FRONT, GL_SPECULAR, lightSpecular ); // Shininess glMaterialf ( GL_FRONT, GL_SHININESS, lightShininess ); // Emission glMaterialfv ( GL_FRONT, GL_EMISSION, lightEmission ); } // Clear the screen. glClearColor( 0.0, 0.0, 0.0, 0.0 ); glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Draw some cross hairs. So that I know that glFrustum is working as planned. glDisable ( GL_LIGHTING ); glLineWidth( 2.0 ); glColor3f ( 1.0, 0.0, 0.0 ); // Red glBegin ( GL_LINES ); // X Axis glVertex3f ( - 100.0, 0.0, 0.0 ); glVertex3f ( 100.0, 0.0, 0.0 ); glVertex3f ( 0.0, - 100.0, 0.0 ); glVertex3f ( 0.0, 100.0, 0.0 ); glEnd (); glEnable ( GL_LIGHTING ); glColor3f ( 0.0, 0.0, 1.0 ); // Draw a box. Remember, right hand rule for outside polygon faces. glBegin(GL_QUADS); { float ctrlPtBoxSize = 10.0; // +ve z plane glNormal3f ( 0.0, 0.0, 1.0 ); glVertex3f ( - ctrlPtBoxSize,- ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, - ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, ctrlPtBoxSize, ctrlPtBoxSize ); // +ve y plane. glNormal3f ( 0.0, 1.0, 0.0 ); glVertex3f ( ctrlPtBoxSize, ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, ctrlPtBoxSize, - ctrlPtBoxSize); glVertex3f ( - ctrlPtBoxSize, ctrlPtBoxSize, ctrlPtBoxSize); // -ve z plane. glNormal3f ( 0.0, 0.0, - 1.0 ); glVertex3f ( ctrlPtBoxSize, ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, - ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, - ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, ctrlPtBoxSize,- ctrlPtBoxSize ); // -ve y plane. glNormal3f ( 0.0, - 1.0, 0.0); glVertex3f ( ctrlPtBoxSize, - ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, - ctrlPtBoxSize, ctrlPtBoxSize); glVertex3f ( - ctrlPtBoxSize, - ctrlPtBoxSize, - ctrlPtBoxSize); glVertex3f ( ctrlPtBoxSize, - ctrlPtBoxSize, - ctrlPtBoxSize); // +ve x plane. glNormal3f ( 1.0, 0.0, 0.0 ); glVertex3f ( ctrlPtBoxSize, - ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, - ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( ctrlPtBoxSize, ctrlPtBoxSize, ctrlPtBoxSize ); // -ve x plane. glNormal3f ( - 1.0, 0.0, 0.0 ); glVertex3f ( - ctrlPtBoxSize, - ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, ctrlPtBoxSize, ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, ctrlPtBoxSize, - ctrlPtBoxSize ); glVertex3f ( - ctrlPtBoxSize, - ctrlPtBoxSize, - ctrlPtBoxSize ); } glEnd(); // Some error detection code { GLenum error; if ( ( error = glGetError() ) != GL_NO_ERROR ) { printf ( "!!! An error has occured.\n" ); printf ( "Error Number: %x\n", error ); } } // Find max and min framebuffer values. { int index; unsigned min; unsigned max; int first = 1; max = 0; min = 0; for ( index = 0; index < ( WIDTH * HEIGHT ); index ++ ) { if ( first ) { min = frameBuffer [ index ]; max = frameBuffer [ index ]; first = 0; printf ( "FB Index: %u Val: %u\n", index, frameBuffer [ index ] ); } else { if ( frameBuffer [ index ] < min ) { min = frameBuffer [ index ]; printf ( "FB Index: %u Val: %u\n", index, frameBuffer [ index ] ); } if ( frameBuffer [ index ] > max ) { max = frameBuffer [ index ]; printf ( "FB Index: %u Val: %u\n", index, frameBuffer [ index ] ); } } } printf ( "Min: %u Max: %u\n", min, max ); } /* destroy the context */ OSMesaDestroyContext( ctx ); } |
From: Brian P. <br...@tu...> - 2003-03-02 19:49:59
|
Scott Lanham wrote: > Hi, > > I have a little problem. > > I am creating a context using: > > OSMesaCreateContextExt ( OSMESA_RGB_565, 16, 0, 0, NULL ); > > Then binding it using: > > OSMesaMakeCurrent ( ctx, frameBuffer, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT ) > > I can clear the screen but can't get anything to render and want to make sure > that it can only be my code that is at fault. > > Does osmesa fully support RGB_5_6_5 mode? I haven't tested it in a long time - I don't think many people use that mode. Can you try another color buffer format? That will tell us if the problem is really specific to RGB_5_6_5 or a more general bug. -Brian |
From: Scott L. <sc...@ma...> - 2003-03-02 21:53:04
|
> > Can you try another color buffer format? That will tell us if the problem > is really specific to RGB_5_6_5 or a more general bug. > That is a good idea. I am not assuming my code is correct so it will be a good test. The beauty of the RGB_5_6_5 mode is that it maps directly onto the Ipaqs framebuffer and I don't have to do any translation. Thanks, Scott. |
From: Scott L. <sc...@ma...> - 2003-03-02 23:22:35
|
> > Can you try another color buffer format? That will tell us if the problem > is really specific to RGB_5_6_5 or a more general bug. > Hi Brian, I tried OSMESA_RGB and OSMESA_RGBA modes and translated it to the 16 bit linux framebuffer on my Ipaq. I am getting no change to the output. A summary of the problem: # glClear is working properly using any colour. # GL_LINES draws properly with lighting off. # GL_QUADS does not draw with or without lighting on. # If I do not re-enable lighting before drawing the GL_QUADS, the GL_LINES then won't display. Just in case it matters, I am using arm-linux-gcc version 2.95.3 Thanks for your time, Scott. |
From: Brian P. <br...@tu...> - 2003-03-03 03:12:43
|
Scott Lanham wrote: >>Can you try another color buffer format? That will tell us if the problem >>is really specific to RGB_5_6_5 or a more general bug. >> > > > Hi Brian, > > I tried OSMESA_RGB and OSMESA_RGBA modes and translated it to the 16 bit linux > framebuffer on my Ipaq. I am getting no change to the output. > > A summary of the problem: > > # glClear is working properly using any colour. > > # GL_LINES draws properly with lighting off. > > # GL_QUADS does not draw with or without lighting on. > > # If I do not re-enable lighting before drawing the GL_QUADS, the GL_LINES > then won't display. > > Just in case it matters, I am using arm-linux-gcc version 2.95.3 > > Thanks for your time, Put a glFinish() call after your rendering. This ensures that any buffered rendering is completed before you read back the image. -Brian |
From: Scott L. <sc...@ma...> - 2003-03-03 06:45:11
|
> > Put a glFinish() call after your rendering. This ensures that any buffered > rendering is completed before you read back the image. > Thank you, thank you, thank you, you're a GL god. What a relief :-) That works for 5_6_5 mode. I have done heaps of opengl programming with my pc and have never had to use glFinish(). I suppose glx does it while swapping buffers. Another classic case of me getting into bad habbits through lazy programming ... sigh ... Now to see just how low the frame rate on the ipaq will drop >:-) Cheers, Scott. |
From: Eero P. <epa...@ko...> - 2003-03-03 21:25:48
|
Scott Lanham wrote: >>Put a glFinish() call after your rendering. This ensures that any buffered >>rendering is completed before you read back the image. >> > > > Thank you, thank you, thank you, you're a GL god. What a relief :-) > > That works for 5_6_5 mode. I have done heaps of opengl programming with my pc > and have never had to use glFinish(). I suppose glx does it while swapping > buffers. Another classic case of me getting into bad habbits through lazy > programming ... sigh ... > Not using glFinish in normal OpenGL programming is not lazy nor a bad habit it is the "correct way". All the swap/read buffer operations perform the needed synchronization without glFinish. It is only a problem when you do something nasty like access you frameBuffer as memory directly... Eero |
From: Scott L. <sc...@ma...> - 2003-03-03 23:04:16
|
> Not using glFinish in normal OpenGL programming is not lazy nor a bad > habit it is the "correct way". All the swap/read buffer operations > perform the needed synchronization without glFinish. > It is good to know that I don't have to use glFinish under normal circumstances. > It is only a problem when you do something nasty like access you > frameBuffer as memory directly... > I don't know about nasty, evil maybe but not nasty ;-) I am really enjoying having my Ipaq stripped down to just Linux, OpenGL and the framebuffer. It opens up the possibilities for play time :-) Cheers, Scott. |