PRIM.C
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:11k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <GL/glut.h> #define PIXEL_CENTER(x) ((long)(x) + 0.5) #define GAP 10 #define ROWS 3 #define COLS 4 #define OPENGL_WIDTH 48 #define OPENGL_HEIGHT 13 GLenum rgb, doubleBuffer; GLint windW = 1000, windH = 800; GLenum mode1, mode2; GLint boxW, boxH; GLubyte OpenGL_bits[] = {    0x00, 0x03, 0x00, 0x00, 0x00, 0x00,     0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,     0x00, 0x03, 0x00, 0x00, 0x00, 0x00,    0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,     0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,    0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,     0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,    0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,     0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,     0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,    0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,  }; static void Init(void) {     mode1 = GL_TRUE;     mode2 = GL_TRUE; } static void Reshape(int width, int height) {     windW = width;     windH = height; } static void RotateColorMask(void) {     static GLint rotation = 0;          rotation = (rotation + 1) & 0x3;     switch (rotation) {       case 0: glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glIndexMask(0xff); break;       case 1: glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE); glIndexMask(0xFE); break;       case 2: glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE); glIndexMask(0xFD); break;       case 3: glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE); glIndexMask(0xFB); break;     } } //  设置绘图颜色 static void SetColor(int index) {     if (rgb) { switch (index) {   case 0:     glColor3f(0.0, 0.0, 0.0);     break;   case 1:     glColor3f(1.0, 0.0, 0.0);     break;   case 2:     glColor3f(0.0, 1.0, 0.0);     break;   case 3:     glColor3f(1.0, 1.0, 0.0);     break;   case 4:     glColor3f(0.0, 0.0, 1.0);     break;   case 5:     glColor3f(1.0, 0.0, 1.0);     break;   case 6:     glColor3f(0.0, 1.0, 1.0);     break;   case 7:     glColor3f(1.0, 1.0, 1.0);     break; }     } else { glIndexi(index);     } } //  键盘响应函数 static void Key(unsigned char key, int x, int y) {     switch (key) {       case '1': mode1 = !mode1; glutPostRedisplay(); break;       case '2': mode2 = !mode2; glutPostRedisplay(); break;       case '3': RotateColorMask(); glutPostRedisplay(); break;       case 27: exit(0);     } } static void Viewport(GLint row, GLint column) {     GLint x, y;     boxW = (windW - (COLS + 1) * GAP) / COLS;     boxH = (windH - (ROWS + 1) * GAP) / ROWS;     x = GAP + column * (boxW + GAP);     y = GAP + row * (boxH + GAP);     glViewport(x, y, boxW, boxH);     glMatrixMode(GL_PROJECTION);     glLoadIdentity();     glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);     glMatrixMode(GL_MODELVIEW);     glEnable(GL_SCISSOR_TEST);     glScissor(x, y, boxW, boxH); } //  绘制点 static void Point(void) {
  2. GLint i;     glBegin(GL_POINTS); for (i = 1; i < 8; i++) {     GLint j = i * 2;     SetColor(i);     glVertex2i(-j, -j);     glVertex2i(-j, 0);     glVertex2i(-j, j);     glVertex2i(0, j);     glVertex2i(j, j);     glVertex2i(j, 0);     glVertex2i(j, -j);     glVertex2i(0, -j); }     glEnd(); } //  绘制线 static void Lines(void) {     GLint i;     glPushMatrix();     glTranslatef(-12, 0, 0);     for (i = 1; i < 8; i++) { SetColor(i); glBegin(GL_LINES);     glVertex2i(-boxW/4, -boxH/4);     glVertex2i(boxW/4, boxH/4); glEnd(); glTranslatef(4, 0, 0);     }     glPopMatrix();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_LINES); glVertex2i(0, 0);     glEnd(); } //  绘制不闭合折线 static void LineStrip(void) {     glBegin(GL_LINE_STRIP); SetColor(1); glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4)); SetColor(2); glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4)); SetColor(3); glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4)); SetColor(4); glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_LINE_STRIP); glVertex2i(0, 0);     glEnd(); } //  绘制闭合折线 static void LineLoop(void) {     glBegin(GL_LINE_LOOP); SetColor(1); glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4)); SetColor(2); glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4)); SetColor(3); glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4)); SetColor(4); glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));     glEnd();     glEnable(GL_LOGIC_OP);     glLogicOp(GL_XOR);     glEnable(GL_BLEND);     glBlendFunc(GL_ONE, GL_ONE);     SetColor(5);     glBegin(GL_LINE_LOOP); glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8)); glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));     glEnd();     glBegin(GL_LINE_LOOP); glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5)); glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));     glEnd();     glDisable(GL_LOGIC_OP);     glDisable(GL_BLEND);     SetColor(6);     glBegin(GL_POINTS); glVertex2i(0, 0);     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_LINE_LOOP); glVertex2i(0, 0);     glEnd(); } //  绘制位图 static void Bitmap(void) {     glBegin(GL_LINES); SetColor(1); glVertex2i(-boxW/2, 0); glVertex2i(boxW/2, 0); glVertex2i(0, -boxH/2); glVertex2i(0, boxH/2); SetColor(2); glVertex2i(0, -3); glVertex2i(0, -3+OPENGL_HEIGHT); SetColor(3); glVertex2i(0, -3); glVertex2i(OPENGL_WIDTH, -3);     glEnd();     SetColor(4);     glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);     glRasterPos2i(0, 0);     glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits); } //  绘制三角形 static void Triangles(void) {     glBegin(GL_TRIANGLES); SetColor(1); glVertex2i(-boxW/4, -boxH/4); SetColor(2); glVertex2i(-boxW/8, -boxH/16); SetColor(3); glVertex2i(boxW/8, -boxH/16); SetColor(4); glVertex2i(-boxW/4, boxH/4); SetColor(5); glVertex2i(-boxW/8, boxH/16); SetColor(6); glVertex2i(boxW/8, boxH/16);     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_TRIANGLES); glVertex2i(0, 0); glVertex2i(-100, 100);     glEnd(); } //  绘制线形的连线三角形串 static void TriangleStrip(void) {     glBegin(GL_TRIANGLE_STRIP); SetColor(1); glVertex2i(-boxW/4, -boxH/4); SetColor(2); glVertex2i(-boxW/4, boxH/4); SetColor(3); glVertex2i(0, -boxH/4); SetColor(4); glVertex2i(0, boxH/4); SetColor(5); glVertex2i(boxW/4, -boxH/4); SetColor(6); glVertex2i(boxW/4, boxH/4);     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_TRIANGLE_STRIP); glVertex2i(0, 0); glVertex2i(-100, 100);     glEnd(); } //  绘制扇形的连线三角形串 static void TriangleFan(void) {     GLint vx[8][2];     GLint x0, y0, x1, y1, x2, y2, x3, y3;     GLint i;     y0 = -boxH/4;     y1 = y0 + boxH/2/3;     y2 = y1 + boxH/2/3;     y3 = boxH/4;     x0 = -boxW/4;     x1 = x0 + boxW/2/3;     x2 = x1 + boxW/2/3;     x3 = boxW/4;     vx[0][0] = x0; vx[0][1] = y1;     vx[1][0] = x0; vx[1][1] = y2;     vx[2][0] = x1; vx[2][1] = y3;     vx[3][0] = x2; vx[3][1] = y3;     vx[4][0] = x3; vx[4][1] = y2;     vx[5][0] = x3; vx[5][1] = y1;     vx[6][0] = x2; vx[6][1] = y0;     vx[7][0] = x1; vx[7][1] = y0;     glBegin(GL_TRIANGLE_FAN);     SetColor(7); glVertex2i(0, 0); for (i = 0; i < 8; i++) {     SetColor(7-i);     glVertex2iv(vx[i]); }     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_TRIANGLE_FAN); glVertex2i(0, 0); glVertex2i(-100, 100);     glEnd(); } //  绘制矩形 static void Rect(void) {     (rgb) ? glColor3f(1.0, 0.0, 1.0) : glIndexi(5);     glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4); } //  绘制连线多边形 static void Polygons(void) {     GLint vx[8][2];     GLint x0, y0, x1, y1, x2, y2, x3, y3;     GLint i;     y0 = -boxH/4;     y1 = y0 + boxH/2/3;     y2 = y1 + boxH/2/3;     y3 = boxH/4;     x0 = -boxW/4;     x1 = x0 + boxW/2/3;     x2 = x1 + boxW/2/3;     x3 = boxW/4;     vx[0][0] = x0; vx[0][1] = y1;     vx[1][0] = x0; vx[1][1] = y2;     vx[2][0] = x1; vx[2][1] = y3;     vx[3][0] = x2; vx[3][1] = y3;     vx[4][0] = x3; vx[4][1] = y2;     vx[5][0] = x3; vx[5][1] = y1;     vx[6][0] = x2; vx[6][1] = y0;     vx[7][0] = x1; vx[7][1] = y0;     glBegin(GL_POLYGON); for (i = 0; i < 8; i++) {     SetColor(7-i);     glVertex2iv(vx[i]); }     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_POLYGON); glVertex2i(0, 0); glVertex2i(100, 100);     glEnd(); } //  绘制多个独立的连线四边形 static void Quads(void) {     glBegin(GL_QUADS); SetColor(1); glVertex2i(-boxW/4, -boxH/4); SetColor(2); glVertex2i(-boxW/8, -boxH/16); SetColor(3); glVertex2i(boxW/8, -boxH/16); SetColor(4); glVertex2i(boxW/4, -boxH/4); SetColor(5); glVertex2i(-boxW/4, boxH/4); SetColor(6); glVertex2i(-boxW/8, boxH/16); SetColor(7); glVertex2i(boxW/8, boxH/16); SetColor(0); glVertex2i(boxW/4, boxH/4);     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_QUADS); glVertex2i(0, 0); glVertex2i(100, 100); glVertex2i(-100, 100);     glEnd(); } //  绘制连续的连线四边形串 static void QuadStrip(void) {     glBegin(GL_QUAD_STRIP); SetColor(1); glVertex2i(-boxW/4, -boxH/4); SetColor(2); glVertex2i(-boxW/4, boxH/4); SetColor(3); glVertex2i(0, -boxH/4); SetColor(4); glVertex2i(0, boxH/4); SetColor(5); glVertex2i(boxW/4, -boxH/4); SetColor(6); glVertex2i(boxW/4, boxH/4);     glEnd();     (rgb) ? glColor3f(1.0, 1.0, 1.0) : glIndexi(7);     glBegin(GL_QUAD_STRIP); glVertex2i(0, 0); glVertex2i(100, 100); glVertex2i(-100, 100);     glEnd(); } static void Draw(void) {     glViewport(0, 0, windW, windH);     glDisable(GL_SCISSOR_TEST);     glPushAttrib(GL_COLOR_BUFFER_BIT);     glColorMask(1, 1, 1, 1);     glIndexMask(~0);     glClearColor(0.0, 0.0, 0.0, 0.0);     glClear(GL_COLOR_BUFFER_BIT);     glPopAttrib(); //  设置两种不同的阴影模式     if (mode1) { glShadeModel(GL_SMOOTH);     } else { glShadeModel(GL_FLAT);     } //  设置多边形绘制模式     if (mode2) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);     } else { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);     } //  在各自的位置上绘制图形     Viewport(0, 0); Point();     Viewport(0, 1); Lines();     Viewport(0, 2); LineStrip();     Viewport(0, 3); LineLoop();     Viewport(1, 0); Bitmap();     Viewport(1, 1); TriangleFan();     Viewport(1, 2); Triangles();     Viewport(1, 3); TriangleStrip();     Viewport(2, 0); Rect();     Viewport(2, 1); Polygons();     Viewport(2, 2); Quads();     Viewport(2, 3); QuadStrip();     if (doubleBuffer) { glutSwapBuffers();     } else { glFlush();     } } static void Args(int argc, char **argv) {     GLint i;     rgb = GL_TRUE;     doubleBuffer = GL_FALSE;     for (i = 1; i < argc; i++) 
  3. { if (strcmp(argv[i], "-ci") == 0)
  4. {     rgb = GL_FALSE; } else if (strcmp(argv[i], "-rgb") == 0) {     rgb = GL_TRUE; } else if (strcmp(argv[i], "-sb") == 0) {     doubleBuffer = GL_FALSE; } else if (strcmp(argv[i], "-db") == 0) {     doubleBuffer = GL_TRUE; }     } } int main(int argc, char **argv) {     GLenum type;     glutInit(&argc, argv);     Args(argc, argv);     type = (rgb) ? GLUT_RGB : GLUT_INDEX;     type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;     glutInitDisplayMode(type);     glutInitWindowSize(windW, windH);     glutCreateWindow("Primitive Test");     Init();     glutReshapeFunc(Reshape);     glutKeyboardFunc(Key);     glutDisplayFunc(Draw);     glutMainLoop(); }