|  | 
 
| µÚÒ»¿Î£¬±àдµÚÒ»¸öOpenGL³ÌÐò µÚ¶þ¿Î£¬»æÖƼ¸ºÎͼÐÎ
 µÚÈý¿Î£¬»æÖƼ¸ºÎͼÐεÄһЩϸ½ÚÎÊÌâ ¡ª¡ª¡ú ±¾´Î¿Î³ÌµÄÄÚÈÝ
 
 ÔÚµÚ¶þ¿ÎÖУ¬ÎÒÃÇѧϰÁËÈçºÎ»æÖƼ¸ºÎͼÐΣ¬µ«´ó¼ÒÈç¹û¶àд¼¸¸ö³ÌÐò£¬¾Í»á·¢ÏÖÆäʵ»¹ÊÇÓÐЩÓôÃÆÖ®´¦¡£ÀýÈ磺µã̫С£¬ÄÑÒÔ¿´Çå³þ£»Ö±ÏßҲ̫ϸ£¬²»Êæ·þ£»»òÕßÏë»ÐéÏߣ¬µ«²»ÖªµÀ·½·¨Ö»ÄÜÓÃÐí¶à¶ÌÖ±Ïߣ¬ÉõÖÁÓõã×éºÏ¶ø³É¡£
 ÕâЩÎÊÌ⽫ÔÚ±¾¿ÎÖб»½â¾ö¡£
 
 ÏÂÃæ¾Íµã¡¢Ö±Ïß¡¢¶à±ßÐηֱðÌÖÂÛ¡£
 
 ==========================================
 
 1¡¢¹ØÓÚµã
 µãµÄ´óСĬÈÏΪ1¸öÏñËØ£¬µ«Ò²¿ÉÒԸıäÖ®¡£¸Ä±äµÄÃüÁîΪglPointSize£¬Æäº¯ÊýÔÐÍÈçÏ£º
 void glPointSize(GLfloat size);
 size±ØÐë´óÓÚ0.0f£¬Ä¬ÈÏֵΪ1.0f£¬µ¥Î»Îª¡°ÏñËØ¡±¡£
 Çë×ÔÐбàд³ÌÐò²¢¹Û²ìЧ¹û¡£
 
 2¡¢¹ØÓÚÖ±Ïß
 £¨1£©Ö±Ïß¿ÉÒÔÖ¸¶¨¿í¶È£º
 void glLineWidth(GLfloat width);
 ÆäÓ÷¨¸úglPointSizeÀàËÆ¡£
 £¨2£©»ÐéÏß¡£
 Ê×ÏÈ£¬Ê¹ÓÃglEnable(GL_LINE_STIPPLE);À´Æô¶¯ÐéÏßģʽ£¨Ê¹ÓÃglDisable(GL_LINE_STIPPLE)¿ÉÒԹرÕÖ®£©¡£
 È»ºó£¬Ê¹ÓÃglLineStippleÀ´ÉèÖÃÐéÏßµÄÑùʽ¡£
 void glLineStipple(GLint factor, GLushort pattern);
 patternÊÇÓÉ1ºÍ0×é³ÉµÄ³¤¶ÈΪ16µÄÐòÁУ¬´Ó×îµÍλ¿ªÊ¼¿´£¬Èç¹ûΪ1£¬ÔòÖ±ÏßÉϽÓÏÂÀ´Ó¦¸Ã»µÄfactor¸öµã½«±»»ÎªÊµµÄ£»Èç¹ûΪ0£¬ÔòÖ±ÏßÉϽÓÏÂÀ´Ó¦¸Ã»µÄfactor¸öµã½«±»»ÎªÐéµÄ¡£
 ÒÔÏÂÊÇһЩÀý×Ó£º
 
  screen.width-255) {this.width=screen.width-255;this.alt='±¾Í¼Æ¬Òѱ»ËõС£¬µã»÷²é¿´Ô´óСͼƬ¡£';}" border=0>screen.width-255) {this.width=screen.width-255;this.alt='±¾Í¼Æ¬Òѱ»ËõС£¬µã»÷²é¿´Ô´óСͼƬ¡£';}" border=0> ÉùÃ÷£º¸ÃͼƬÀ´×Ôwww.opengl.org£¬¸ÃͼƬÊÇ¡¶OpenGL ... »Óд¥¼°µ½°æÈ¨ÎÊÌâ¡£
 Çë×ÔÐбàд³ÌÐò²¢¹Û²ìЧ¹û¡£
 
 ==========================================
 
 3¡¢¹ØÓÚ¶à±ßÐÎ
 ¶à±ßÐεÄÄÚÈݽ϶࣬ÎÒÃǽ«½²ÊöÒÔÏÂËĸö·½Ãæ¡£
 £¨1£©¶à±ßÐεÄÁ½ÃæÒÔ¼°»æÖÆ·½Ê½¡£
 ËäÈ»ÎÒÃÇĿǰ»¹Ã»ÓÐÕæÕýµÄʹÓÃÈýÎ¬×ø±êÀ´»Í¼£¬µ«Êǽ¨Á¢Ò»Ð©ÈýάµÄ¸ÅÄÊDZØÒªµÄ¡£
 ´ÓÈýάµÄ½Ç¶ÈÀ´¿´£¬Ò»¸ö¶à±ßÐξßÓÐÁ½¸öÃæ¡£Ã¿Ò»¸öÃæ¶¼¿ÉÒÔÉèÖò»Í¬µÄ»æÖÆ·½Ê½£ºÌî³ä¡¢Ö»»æÖƱßÔµÂÖÀªÏß¡¢Ö»»æÖƶ¥µã£¬ÆäÖС°Ìî³ä¡±ÊÇĬÈϵķ½Ê½¡£¿ÉÒÔΪÁ½¸öÃæ·Ö±ðÉèÖò»Í¬µÄ·½Ê½¡£
 glPolygonMode(GL_FRONT, GL_FILL); // ÉèÖÃÕýÃæÎªÌî³ä·½Ê½
 glPolygonMode(GL_BACK, GL_LINE); // ÉèÖ÷´ÃæÎª±ßÔµ»æÖÆ·½Ê½
 glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // ÉèÖÃÁ½Ãæ¾ùΪ¶¥µã»æÖÆ·½Ê½
 
 ==========================================
 
 £¨2£©·´×ª
 Ò»°ãÔ¼¶¨Îª¡°¶¥µãÒÔÄæÊ±Õë˳Ðò³öÏÖÔÚÆÁÄ»ÉϵÄÃæ¡±Îª¡°ÕýÃæ¡±£¬ÁíÒ»¸öÃæ¼´³ÉΪ¡°·´Ã桱¡£Éú»îÖг£¼ûµÄÎïÌå±íÃæ£¬Í¨³£¶¼¿ÉÒÔÓÃÕâÑùµÄ¡°ÕýÃæ¡±ºÍ¡°·´Ã桱£¬¡°ºÏÀíµÄ¡±±»±íÏÖ³öÀ´£¨ÇëÕÒÒ»¸ö±È½Ï͸Ã÷µÄ¿óȪˮƿ×Ó£¬ÔÚÕý¶ÔÄãµÄÒ»ÃæÑØÄæÊ±Õë»Ò»¸öÔ²£¬²¢±êÃ÷»µÄ·½Ïò£¬È»ºó½«±³Ãæ×ªÎªÕýÃæ£¬»Ò»¸öÀàËÆµÄÔ²£¬Ìå»áһϡ°ÕýÃæ¡±ºÍ¡°·´Ã桱¡£Äã»á·¢ÏÖÕý¶ÔÄãµÄ·½Ïò£¬Æ¿µÄÍâ²àÊÇÕýÃæ£¬¶ø±³¶ÔÄãµÄ·½Ïò£¬Æ¿µÄÄÚ²à²ÅÊÇÕýÃæ¡£Õý¶ÔÄãµÄÄÚ²àºÍ±³¶ÔÄãµÄÍâ²àÔòÊÇ·´Ãæ¡£ÕâÑùÒ»À´£¬Í¬ÑùÊôÓÚ¡°Æ¿µÄÍâ²à¡±Õâ¸ö±íÃæ£¬µ«Ä³Ð©µØ·½ËãÊÇÕýÃæ£¬Ä³Ð©µØ·½È´ËãÊÇ·´ÃæÁË£©¡£
 µ«Ò²ÓÐһЩ±íÃæ±È½ÏÌØÊâ¡£ÀýÈç¡°Âó±ÈÎÚ˹´ø¡±£¨Çë×Ô¼ºGoogleһϣ©£¬¿ÉÒÔÈ«²¿Ê¹Óá°ÕýÃæ¡±»òÈ«²¿Ê¹Óá°±³Ã桱À´±íʾ¡£
 ¿ÉÒÔͨ¹ýglFrontFaceº¯ÊýÀ´½»»»¡°ÕýÃæ¡±ºÍ¡°·´Ã桱µÄ¸ÅÄî¡£
 glFrontFace(GL_CCW); // ÉèÖÃCCW·½ÏòΪ¡°ÕýÃæ¡±£¬CCW¼´CounterClockWise£¬ÄæÊ±Õë
 glFrontFace(GL_CW); // ÉèÖÃCW·½ÏòΪ¡°ÕýÃæ¡±£¬CW¼´ClockWise£¬Ë³Ê±Õë
 ÏÂÃæÊÇÒ»¸öʾÀý³ÌÐò£¬ÇëÓÃËüÌæ»»µÚÒ»¿ÎÖеÄmyDisplayº¯Êý£¬²¢½«glFrontFace(GL_CCW)ÐÞ¸ÄΪglFrontFace(GL_CW)£¬²¢¹Û²ì½á¹ûµÄ±ä»¯¡£
 void myDisplay(void)
 {
 glClear(GL_COLOR_BUFFER_BIT);
 glPolygonMode(GL_FRONT, GL_FILL); // ÉèÖÃÕýÃæÎªÌî³äģʽ
 glPolygonMode(GL_BACK, GL_LINE); // ÉèÖ÷´ÃæÎªÏßÐÎģʽ
 glFrontFace(GL_CCW); // ÉèÖÃÄæÊ±Õë·½ÏòΪÕýÃæ
 glBegin(GL_POLYGON); // °´ÄæÊ±Õë»æÖÆÒ»¸öÕý·½ÐΣ¬ÔÚ×óÏ·½
 glVertex2f(-0.5f, -0.5f);
 glVertex2f(0.0f, -0.5f);
 glVertex2f(0.0f, 0.0f);
 glVertex2f(-0.5f, 0.0f);
 glEnd();
 glBegin(GL_POLYGON); // °´Ë³Ê±Õë»æÖÆÒ»¸öÕý·½ÐΣ¬ÔÚÓÒÉÏ·½
 glVertex2f(0.0f, 0.0f);
 glVertex2f(0.0f, 0.5f);
 glVertex2f(0.5f, 0.5f);
 glVertex2f(0.5f, 0.0f);
 glEnd();
 glFlush();
 }
 
 ==========================================
 
 £¨3£©ÌÞ³ý¶à±ßÐαíÃæ
 ÔÚÈýά¿Õ¼äÖУ¬Ò»¸ö¶à±ßÐÎËäÈ»ÓÐÁ½¸öÃæ£¬µ«ÎÒÃÇÎÞ·¨¿´¼û±³ÃæµÄÄÇЩ¶à±ßÐΣ¬¶øÒ»Ð©¶à±ßÐÎËäÈ»ÊÇÕýÃæµÄ£¬µ«±»ÆäËû¶à±ßÐÎËùÕÚµ²¡£Èç¹û½«ÎÞ·¨¿´¼ûµÄ¶à±ßÐκͿɼûµÄ¶à±ßÐÎͬµÈ¶Ô´ý£¬ÎÞÒɻήµÍÎÒÃÇ´¦ÀíͼÐεÄЧÂÊ¡£ÔÚÕâÖÖʱºò£¬¿ÉÒÔ½«²»±ØÒªµÄÃæÌÞ³ý¡£
 Ê×ÏÈ£¬Ê¹ÓÃglEnable(GL_CULL_FACE);À´Æô¶¯ÌÞ³ý¹¦ÄÜ£¨Ê¹ÓÃglDisable(GL_CULL_FACE)¿ÉÒԹرÕÖ®£©
 È»ºó£¬Ê¹ÓÃglCullFaceÀ´½øÐÐÌÞ³ý¡£
 glCullFaceµÄ²ÎÊý¿ÉÒÔÊÇGL_FRONT£¬GL_BACK»òÕßGL_FRONT_AND_BACK£¬·Ö±ð±íʾÌÞ³ýÕýÃæ¡¢ÌÞ³ý·´Ãæ¡¢ÌÞ³ýÕý·´Á½ÃæµÄ¶à±ßÐΡ£
 ×¢Ò⣺ÌÞ³ý¹¦ÄÜÖ»Ó°Ïì¶à±ßÐΣ¬¶ø¶ÔµãºÍÖ±ÏßÎÞÓ°Ïì¡£ÀýÈ磬ʹÓÃglCullFace(GL_FRONT_AND_BACK)ºó£¬ËùÓеĶà±ßÐζ¼½«±»ÌÞ³ý£¬ËùÒÔ¿´¼ûµÄ¾ÍÖ»ÓеãºÍÖ±Ïß¡£
 
 £¨4£©ïοնà±ßÐÎ
 Ö±Ïß¿ÉÒÔ±»»³ÉÐéÏߣ¬¶ø¶à±ßÐÎÔò¿ÉÒÔ½øÐÐïοա£
 Ê×ÏÈ£¬Ê¹ÓÃglEnable(GL_POLYGON_STIPPLE);À´Æô¶¯ïοÕģʽ£¨Ê¹ÓÃglDisable(GL_POLYGON_STIPPLE)¿ÉÒԹرÕÖ®£©¡£
 È»ºó£¬Ê¹ÓÃglPolygonStippleÀ´ÉèÖÃïοյÄÑùʽ¡£
 void glPolygonStipple(const GLubyte *mask);
 ÆäÖеIJÎÊýmaskÖ¸ÏòÒ»¸ö³¤¶ÈΪ128×ֽڵĿռ䣬Ëü±íʾÁËÒ»¸ö32*32µÄ¾ØÐÎÓ¦¸ÃÈçºÎïοա£ÆäÖУºµÚÒ»¸ö×Ö½Ú±íʾÁË×î×óÏ·½µÄ´Ó×óµ½ÓÒ£¨Ò²¿ÉÒÔÊÇ´ÓÓÒµ½×ó£¬Õâ¸ö¿ÉÒÔÐ޸ģ©8¸öÏñËØÊÇ·ñïοգ¨1±íʾ²»ïοգ¬ÏÔʾ¸ÃÏñËØ£»0±íʾïοգ¬ÏÔʾÆäºóÃæµÄÑÕÉ«£©£¬×îºóÒ»¸ö×Ö½Ú±íʾÁË×îÓÒÉÏ·½µÄ8¸öÏñËØÊÇ·ñïοա£
 µ«ÊÇ£¬Èç¹ûÎÒÃÇÖ±½Ó¶¨ÒåÕâ¸ömaskÊý×飬ÏñÕâÑù£º
 static GLubyte Mask[128] =
 {
 0x00, 0x00, 0x00, 0x00, // ÕâÊÇ×îÏÂÃæµÄÒ»ÐÐ
 0x00, 0x00, 0x00, 0x00,
 0x03, 0x80, 0x01, 0xC0, // Âé
 0x06, 0xC0, 0x03, 0x60, // ·³
 0x04, 0x60, 0x06, 0x20, // µÄ
 0x04, 0x30, 0x0C, 0x20, // ³õ
 0x04, 0x18, 0x18, 0x20, // ʼ
 0x04, 0x0C, 0x30, 0x20, // »¯
 0x04, 0x06, 0x60, 0x20, // £¬
 0x44, 0x03, 0xC0, 0x22, // ²»
 0x44, 0x01, 0x80, 0x22, // ½¨
 0x44, 0x01, 0x80, 0x22, // Òé
 0x44, 0x01, 0x80, 0x22, // ʹ
 0x44, 0x01, 0x80, 0x22, // ÓÃ
 0x44, 0x01, 0x80, 0x22,
 0x44, 0x01, 0x80, 0x22,
 0x66, 0x01, 0x80, 0x66,
 0x33, 0x01, 0x80, 0xCC,
 0x19, 0x81, 0x81, 0x98,
 0x0C, 0xC1, 0x83, 0x30,
 0x07, 0xE1, 0x87, 0xE0,
 0x03, 0x3F, 0xFC, 0xC0,
 0x03, 0x31, 0x8C, 0xC0,
 0x03, 0x3F, 0xFC, 0xC0,
 0x06, 0x64, 0x26, 0x60,
 0x0C, 0xCC, 0x33, 0x30,
 0x18, 0xCC, 0x33, 0x18,
 0x10, 0xC4, 0x23, 0x08,
 0x10, 0x63, 0xC6, 0x08,
 0x10, 0x30, 0x0C, 0x08,
 0x10, 0x18, 0x18, 0x08,
 0x10, 0x00, 0x00, 0x08 // ÕâÊÇ×îÉÏÃæµÄÒ»ÐÐ
 };
 ÕâÑùÒ»¶ÑÊý¾Ý·Ç³£È±·¦Ö±¹ÛÐÔ£¬ÎÒÃÇÐèÒªºÜ·Ñ¾¢µÄÈ¥·ÖÎö£¬²Å»á·¢ÏÖËü±íʾµÄ¾¹È»ÊÇÒ»Ö»²ÔÓ¬¡£
 Èç¹û½«ÕâÑùµÄÊý¾Ý±£´æ³ÉͼƬ£¬²¢ÓÃרÃŵŤ¾ß½øÐб༣¬ÏÔÈ»»á·½±ãºÜ¶à¡£ÏÂÃæ½éÉÜÈçºÎ×öµ½ÕâÒ»µã¡£
 
 ==========================================
 
 Ê×ÏÈ£¬ÓÃWindows×Ô´øµÄ»±Ê³ÌÐòн¨Ò»¸±Í¼Æ¬£¬È¡ÃûΪmask.bmp£¬×¢Òâ±£´æÊ±£¬Ó¦¸ÃÑ¡Ôñ¡°µ¥É«Î»Í¼¡±¡£ÔÚ¡°Í¼Ïó¡±->¡°ÊôÐÔ¡±¶Ô»°¿òÖУ¬ÉèÖÃͼƬµÄ¸ß¶ÈºÍ¿í¶È¾ùΪ32¡£
 Ó÷Ŵ󾵹۲ìͼƬ£¬²¢±à¼Ö®¡£ºÚÉ«¶ÔÓ¦¶þ½øÖÆÁ㣨ïοգ©£¬°×É«¶ÔÓ¦¶þ½øÖÆÒ»£¨²»ïοգ©£¬±à¼Íê±Ïºó±£´æ¡£
 È»ºó£¬¾Í¿ÉÒÔʹÓÃÒÔÏ´úÂëÀ´»ñµÃÕâ¸öMaskÊý×éÁË¡£
 static GLubyte Mask[128];
 FILE *fp;
 fp = fopen("mask.bmp", "rb");
 if( !fp )
 exit(0);
 // ÒÆ¶¯ÎļþÖ¸Õëµ½Õâ¸öλÖã¬Ê¹µÃÔÙ¶Ásizeof(Mask)¸ö×ֽھͻáÓöµ½Îļþ½áÊø
 // ×¢Òâ-(int)sizeof(Mask)ËäÈ»²»ÊÇʲôºÃµÄд·¨£¬µ«ÕâÀïËüȷʵÊÇÕýÈ·ÓÐЧµÄ
 // Èç¹ûÖ±½Óд-sizeof(Mask)µÄ»°£¬ÒòΪsizeofÈ¡µÃµÄÊÇÒ»¸öÎÞ·ûºÅÊý£¬È¡¸ººÅ»áÓÐÎÊÌâ
 if( fseek(fp, -(int)sizeof(Mask), SEEK_END) )
 exit(0);
 // ¶ÁÈ¡sizeof(Mask)¸ö×Ö½Úµ½Mask
 if( !fread(Mask, sizeof(Mask), 1, fp) )
 exit(0);
 fclose(fp);
 
 ºÃµÄ£¬ÏÖÔÚÇë×Ô¼º±à¼Ò»¸öͼƬ×÷Ϊmask£¬²¢ÓÃÉÏÊö·½·¨È¡µÃMaskÊý×飬ÔËÐкó¹Û²ìЧ¹û¡£
 ˵Ã÷£º»æÖÆÐéÏßʱ¿ÉÒÔÉèÖÃfactorÒò×Ó£¬µ«¶à±ßÐεÄïοÕÎÞ·¨ÉèÖÃfactorÒò×Ó¡£ÇëÓÃÊó±ê¸Ä±ä´°¿ÚµÄ´óС£¬¹Û²ìïοÕЧ¹ûµÄ±ä»¯Çé¿ö¡£
 #include <stdio.h>
 #include <stdlib.h>
 void myDisplay(void)
 {
 static GLubyte Mask[128];
 FILE *fp;
 fp = fopen("mask.bmp", "rb");
 if( !fp )
 exit(0);
 if( fseek(fp, -(int)sizeof(Mask), SEEK_END) )
 exit(0);
 if( !fread(Mask, sizeof(Mask), 1, fp) )
 exit(0);
 fclose(fp);
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0f, 1.0f, 0.0f);
 glEnable(GL_POLYGON_STIPPLE);
 glPolygonStipple(Mask);
 glRectf(-0.5f, -0.5f, 0.0f, 0.0f); // ÔÚ×óÏ·½»æÖÆÒ»¸öÓÐïοÕЧ¹ûµÄÕý·½ÐÎ
 glDisable(GL_POLYGON_STIPPLE);
 glRectf(0.0f, 0.0f, 0.5f, 0.5f); // ÔÚÓÒÉÏ·½»æÖÆÒ»¸öÎÞïοÕЧ¹ûµÄÕý·½ÐÎ
 glFlush();
 }
 
 ==========================================
 
 С½á
 ±¾¿ÎѧϰÁË»æÖƼ¸ºÎͼÐεÄһЩϸ½Ú¡£
 µã¿ÉÒÔÉèÖôóС¡£
 Ö±Ïß¿ÉÒÔÉèÖÿí¶È£»¿ÉÒÔ½«Ö±Ïß»³ÉÐéÏß¡£
 ¶à±ßÐεÄÁ½¸öÃæµÄ»æÖÆ·½·¨¿ÉÒÔ·Ö±ðÉèÖã»ÔÚÈýά¿Õ¼äÖУ¬²»¿É¼ûµÄ¶à±ßÐοÉÒÔ±»ÌÞ³ý£»¿ÉÒÔ½«Ìî³ä¶à±ßÐλæÖƳÉïοյÄÑùʽ¡£
 Á˽âÕâЩϸ½Ú»áʹÎÒÃÇÔÚһЩͼÏó»æÖÆÖиü¼ÓµÃÐÄÓ¦ÊÖ¡£
 ÁíÍ⣬°ÑһЩÊý¾Ýдµ½³ÌÐòÖ®ÍâµÄÎļþÖУ¬ÓÐʱ¿ÉÒÔÏԵøü·½±ã¡£
 
 ÈëÃÅѧϰµÚÈý¿Î£¬µ½´Ë½áÊø¡£
 
 TO BE CONTINUED
 | 
 |