#include #include #include #include #define WINDSIZEX 100 #define WINDSIZEY 100 void Draw() { GLint size =64; GLint trueSize = size+2; glBegin(GL_POLYGON); glTexCoord2f(-1.0/(GLfloat)size, -1.0/(GLfloat)size); glVertex2i(0, 0); glTexCoord2f(-1.0/(GLfloat)size, 1.0+1.0/(GLfloat)size); glVertex2i(0, trueSize); glTexCoord2f(1.0+1.0/(GLfloat)size, 1.0+1.0/(GLfloat)size); glVertex2i(trueSize, trueSize); glTexCoord2f(1.0+1.0/(GLfloat)size, -1.0/(GLfloat)size); glVertex2i(trueSize, 0); glEnd(); } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glDisable(GL_DITHER); glBlendFunc (GL_ZERO, GL_SRC_ALPHA); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } static void test(void) { GLfloat buf[4]; GLfloat bcolor [] = {0.5, 0.8, 0.6, 0.4 }; GLfloat *texBuf, *readBuf; int i; texBuf = (GLfloat *)malloc(66*66*4*sizeof(GLfloat)); readBuf = (GLfloat *)malloc(66*66*4*sizeof(GLfloat)); for (i = 0; i < 64*64; i++) { texBuf[i*4] = 0.6; texBuf[i*4+1] = 0.7; texBuf[i*4+2] = 0.6; texBuf[i*4+3] = 0.6; } glEnable(GL_TEXTURE_1D); glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE, 64, 0, GL_RGBA, GL_FLOAT, (unsigned char *)texBuf); glTexParameterfv(GL_TEXTURE_1D, GL_TEXTURE_BORDER_COLOR, bcolor); Draw(); glReadPixels(0, 0, 66, 66, GL_RGB, GL_FLOAT, readBuf); printf ("pixels at border: %f %f %f \n", readBuf[0], readBuf[1], readBuf[2]); printf ("it should be: 0.5, 0.5, 0.5\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; }