#include #include #include #include #include #define WINDSIZEX 100 #define WINDSIZEY 100 #define SIZEW 4 #define SIZEH 4 // Draw function used by many test casses static void Draw() { GLfloat fragcolor [] = {0.4, 0.4, 0.4, 0.8}; int i, k; glColor4fv(fragcolor); glBegin(GL_POINTS); for(k=0; k < SIZEH; k++){ for(i=0; i < SIZEW; i++){ glVertex3f(i, k, 0.5); } } glEnd(); } void init(void) { glClearColor (1,1,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glShadeModel(GL_FLAT); glDisable (GL_DITHER); glBlendFunc(GL_ZERO, GL_SRC_ALPHA); } static void test(void) { GLfloat *buf; static char *cmd1 = "!!ARBfp1.0\nOUTPUT outcolor = result.color;\nATTRIB attrib_fragpos = fragment.position;\nTEMP temp_fpos;\nMUL temp_fpos, attrib_fragpos, {0.2, 0.1, 0.4, 0.7};\nMOV outcolor, temp_fpos;\nEND"; GLuint programName; glGenProgramsARB(1, &programName); // bind a program to the name glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, programName); glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLint) strlen(cmd1), cmd1); if(glGetError() == GL_INVALID_OPERATION) { printf("\nError loading program: check the error\n%s", glGetString(GL_PROGRAM_ERROR_STRING_ARB)); exit(1); } glEnable(GL_FRAGMENT_PROGRAM_ARB); glClear(GL_COLOR_BUFFER_BIT); Draw(); ////////////////////////////////////// buf = (GLfloat *)malloc(SIZEW * SIZEH *sizeof(GLfloat) * 3); glReadPixels(0, 0, SIZEW, SIZEH, GL_RGB, GL_FLOAT, buf); printf("get pixel at (0, 0): %f %f, %f\n", buf[0], buf[1], buf[2]); printf("should be: 0, 0, *\n"); } void display(void) { glViewport(0, 0, WINDSIZEX, WINDSIZEY); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, WINDSIZEX, 0, WINDSIZEY); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); test(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(WINDSIZEX, WINDSIZEY); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }