#include #include #include #include #define PIXEL_COLOR 0.8 GLfloat normal[3], position[4], direction[3]; void init(void) { GLfloat buf[4]; glClearColor(0.0, 0.0, 0.0, 0.0); glDisable(GL_DITHER); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 80); // Setup polymode and twoSided switch. glPolygonMode (GL_FRONT_AND_BACK, GL_POINT); glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); direction[0] = 0; direction[1] = 0; direction[2] = -1; glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction); // Setup light position. position[0] = sqrt(1.0 - PIXEL_COLOR*PIXEL_COLOR); position[1] = 0.0; position[2] = PIXEL_COLOR; position[3] = 0.0; glLightfv(GL_LIGHT0, GL_POSITION, position); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 1); buf[0] = 1.0; buf[1] = 1.0; buf[2] = 1.0; buf[3] = 1.0; glMaterialfv(GL_LIGHT0, GL_AMBIENT, buf); glLightfv(GL_FRONT, GL_AMBIENT, buf); buf[0] = 0.0; buf[1] = 0.0; buf[2] = 0.0; buf[3] = 1.0; glMaterialfv(GL_FRONT, GL_DIFFUSE, buf); glMaterialfv(GL_FRONT, GL_SPECULAR, buf); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, buf); } static void test(void) { glBegin(GL_POINTS); glVertex2f(0.5, 0.5); glEnd(); } void display(void) { GLfloat buf[3]; glViewport(0, 0, 10, 10); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 10, 0, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); test(); glReadPixels(0, 0, 1, 1, GL_RGB, GL_FLOAT, (GLvoid *)buf); printf ("actual buf[0]: %f, expected: %f\n", buf[0], PIXEL_COLOR); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(10, 10); glutInitWindowPosition(20, 20); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }