7天学习opengl入门

来源:互联网 发布:淘宝店注册 编辑:程序博客网 时间:2024/06/06 07:46

10月13号下午3:00队长给我开了一个会,10.14号开始学习opengl

今天10月21号,期间,虽然有时候课程很满,但每天都至少写一个程序。

当然,这些只是我7天来业余时间的学习,我觉得这个网址不错,大家如果也想学习opengl,并且具有一定的C语言C++基础,入门课程推荐大家去学习这个网址http://www.cnblogs.com/crazyxiaom/articles/2073586.html

我的这些代码等都是从这个网址学习的,推荐你还是去这个网址学习,那更全更准确。

PS:“今天”(发表文章的今天)把我入门学习的资料送给一块儿学习的同学了,看着那厚厚的一叠折折状状的资料,我穿越了,我很清晰的看到了我接下来的学习生活--将会更加投入,将会有更厚更厚的资料进入我的大脑!


10.14

今天写了15个程序。这些是画二维图形的基础。

开始的时候犯了一个错误,以为坐标范围是像素点呢,后来才知道坐标范围是-1~1;(0,0)在中心。

第三个程序到第15个程序都是在练习glBegin()的使用,最后可以画一个近似圆的多边形。

GL_POINTS,GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN

GL_POLYGON

1.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/GLUT.H>  
  2.   
  3. void myDisplay(void){  
  4.     glClear(GL_COLOR_BUFFER_BIT);  
  5.     glRectf(-0.5f, -0.4f, 0.5f, 0.5f);  
  6.     glFlush();  
  7. }  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.     glutInit(&argc,argv);  
  12.     glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);  
  13.     glutInitWindowPosition(100, 100);  
  14.     glutInitWindowSize(400, 400);  
  15.     glutCreateWindow("openglѧϰ1");  
  16.     glutDisplayFunc(&myDisplay);  
  17.     glutMainLoop();  
  18.     return 0;  
  19. }  
  20. </strong></span>  

2.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay(){  
  4.     glClearColor(1.0, 1.0, 1.0, 0.0);  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.     glColor3f(1.0, 0.0, 0.0);  
  7.     glRectf(-0.5f,-0.5f,0.5f,0.5f);  
  8.     glFlush();  
  9. }  
  10.   
  11. int main(int argc, char* argv[]){  
  12.     glutInit(&argc, argv);  
  13.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  14.   
  15.     glutInitWindowPosition(400, 400);  
  16.     glutInitWindowSize(200, 200);  
  17.     glutCreateWindow("独立");  
  18.   
  19.      glutDisplayFunc(myDisplay);  
  20.      glutMainLoop();  
  21.      return 0;  
  22.   
  23. }</strong></span>  

3.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay(){  
  4.     glClearColor(1.0,1.0,1.0,0.0);  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.     glBegin(GL_POINTS);  
  7.       glVertex2i(100, 100);  
  8.       glVertex2i(50, 50);  
  9.       glVertex2i(70, 70);  
  10.         
  11.       glVertex2f(0.3f, 0.3f);  
  12.       glVertex2f(-0.3f, -0.3f);  
  13.       glVertex2f(0.5f, 0.5f);  
  14.   
  15.       glVertex2d(0.2,0.5);  
  16.       glVertex2d(-0.4, -0.6);  
  17.       glVertex2d(0.3,0.6);  
  18.     glEnd();  
  19.   
  20.     glFlush();        
  21. }  
  22.   
  23. int main(int argc, char* argv[])  
  24. {  
  25.     glutInit(&argc, argv);  
  26.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  27.   
  28.     glutInitWindowPosition(400,400);  
  29.     glutInitWindowSize(400,400);  
  30.     glutCreateWindow("study02");  
  31.     glutDisplayFunc(&myDisplay);  
  32.     glutMainLoop();  
  33.     return 0;  
  34. }  
  35. </strong></span>  

4.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay(){  
  4.     glClearColor(1.0,1.0,1.0,0.0);  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.     glColor3f(1.0,0.0,0.0);  
  7.     glBegin(GL_LINES);  
  8.     //glVertex2i(100, 100);  
  9.     //glVertex2i(50, 50);  
  10.     //glVertex2i(70, 70);  
  11.       
  12.     glVertex2f(0.3f, 0.3f);  
  13.     glVertex2f(-0.3f, -0.3f);  
  14.     glVertex2f(0.5f, 0.5f);  
  15.       
  16.     glVertex2d(0.2,0.5);  
  17.     glVertex2d(-0.4, -0.6);  
  18.     glVertex2d(0.3,0.6);  
  19.     glEnd();  
  20.       
  21.     glFlush();        
  22. }  
  23.   
  24. int main(int argc, char* argv[])  
  25. {  
  26.     glutInit(&argc, argv);  
  27.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  28.       
  29.     glutInitWindowPosition(400,400);  
  30.     glutInitWindowSize(400,400);  
  31.     glutCreateWindow("study03");  
  32.     glutDisplayFunc(&myDisplay);  
  33.     glutMainLoop();  
  34.     return 0;  
  35. }  
  36. </strong></span>  

5.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_LINE_STRIP);  
  9.         glVertex2f(0.1f, 0.8f);  
  10.         glVertex2f(-0.1f, -0.8f);  
  11.         glVertex2f(0.1f, -0.8f);  
  12.         glVertex2f(-0.1f, 0.8f);  
  13.         glVertex2f(0.1f, 0.9f);  
  14.         glVertex2f(0.4f, 0.8f);  
  15.     glEnd();  
  16.     glFlush();  
  17. }  
  18.   
  19. int main(int argc, char* argv[])  
  20. {  
  21.     glutInit(&argc, argv);  
  22.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  23.     glutInitWindowPosition(400,400);  
  24.     glutInitWindowSize(400,400);  
  25.     glutCreateWindow("Study04");  
  26.     glutDisplayFunc(myDisplay);  
  27.     glutMainLoop();  
  28.     return 0;  
  29. }</strong></span>  

6.1

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_LINE_LOOP);  
  9.         glVertex2f(0.2f, 0.2f);  
  10.         glVertex2f(-0.2f, 0.2f);  
  11.         glVertex2f(-0.2f, -0.2f);  
  12.         glVertex2f(0.2f, -0.2f);  
  13.         //glVertex2f(0.1f, 0.9f);  
  14.         //glVertex2f(0.4f, 0.8f);  
  15.     glEnd();  
  16.     glFlush();  
  17. }  
  18.   
  19. int main(int argc, char* argv[])  
  20. {  
  21.     glutInit(&argc, argv);  
  22.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  23.     glutInitWindowPosition(400,400);  
  24.     glutInitWindowSize(400,400);  
  25.     glutCreateWindow("Study04");  
  26.     glutDisplayFunc(myDisplay);  
  27.     glutMainLoop();  
  28.     return 0;  
  29. }</strong></span>  

7

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_TRIANGLES);  
  9.         //glVertex2f(0.2f, 0.2f);  
  10.         //glVertex2f(-0.2f, 0.2f);  
  11.         //glVertex2f(-0.2f, -0.2f);  
  12.         glVertex2f(0.8f, 0.4f);  
  13.         glVertex2f(0.4f, 0.8f);  
  14.         glVertex2f(0.0f, 0.0f);  
  15.         //glVertex2f(0.1f, 0.9f);  
  16.         //glVertex2f(0.4f, 0.8f);  
  17.     glEnd();  
  18.     glFlush();  
  19. }  
  20.   
  21. int main(int argc, char* argv[])  
  22. {  
  23.     glutInit(&argc, argv);  
  24.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  25.     glutInitWindowPosition(400,400);  
  26.     glutInitWindowSize(400,400);  
  27.     glutCreateWindow("Study04");  
  28.     glutDisplayFunc(myDisplay);  
  29.     glutMainLoop();  
  30.     return 0;  
  31. }</strong></span>  

7.1

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_TRIANGLES);  
  9.         glVertex2f(0.2f, 0.2f);  
  10.         glVertex2f(-0.2f, 0.2f);  
  11.         glVertex2f(-0.2f, -0.2f);  
  12.     glEnd();  
  13.   
  14.     glBegin(GL_TRIANGLES);  
  15.         glVertex2f(0.8f, 0.4f);  
  16.         glVertex2f(0.4f, 0.8f);  
  17.         glVertex2f(0.0f, 0.0f);  
  18.         //glVertex2f(0.1f, 0.9f);  
  19.         //glVertex2f(0.4f, 0.8f);  
  20.     glEnd();  
  21.     glFlush();  
  22. }  
  23.   
  24. int main(int argc, char* argv[])  
  25. {  
  26.     glutInit(&argc, argv);  
  27.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  28.     glutInitWindowPosition(400,400);  
  29.     glutInitWindowSize(400,400);  
  30.     glutCreateWindow("Study04");  
  31.     glutDisplayFunc(myDisplay);  
  32.     glutMainLoop();  
  33.     return 0;  
  34. }</strong></span>  

7.2

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_TRIANGLES);  
  9.         glVertex2f(0.2f, 0.2f);  
  10.         glVertex2f(-0.2f, 0.2f);  
  11.         glVertex2f(-0.2f, -0.2f);  
  12.       
  13.         glVertex2f(0.8f, 0.4f);  
  14.         glVertex2f(0.4f, 0.8f);  
  15.         glVertex2f(0.0f, 0.0f);  
  16.         //glVertex2f(0.1f, 0.9f);  
  17.         //glVertex2f(0.4f, 0.8f);  
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("Study04");  
  29.     glutDisplayFunc(myDisplay);  
  30.     glutMainLoop();  
  31.     return 0;  
  32. }</strong></span>  

7.3

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_TRIANGLES);  
  9.         glVertex2f(0.2f, 0.2f);  
  10.         glVertex2f(-0.2f, 0.2f);  
  11.         glVertex2f(-0.2f, -0.2f);  
  12.       
  13.         glVertex2f(0.8f, 0.4f);  
  14.         glVertex2f(0.4f, 0.8f);  
  15.         glVertex2f(0.0f, 0.0f);  
  16.         glVertex2f(0.1f, 0.9f);  
  17.         glVertex2f(0.4f, 0.8f);  
  18.         glVertex2f(0.9f,0.3f);  
  19.     glEnd();  
  20.     glFlush();  
  21. }  
  22.   
  23. int main(int argc, char* argv[])  
  24. {  
  25.     glutInit(&argc, argv);  
  26.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  27.     glutInitWindowPosition(400,400);  
  28.     glutInitWindowSize(400,400);  
  29.     glutCreateWindow("Study04");  
  30.     glutDisplayFunc(myDisplay);  
  31.     glutMainLoop();  
  32.     return 0;  
  33. }</strong></span>  


8.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_TRIANGLE_STRIP);  
  9.         glVertex2f(0.0f,0.0f);  
  10.         glVertex2f(0.4f,0.8f);  
  11.         glVertex2f(0.8f,0.4f);  
  12.         glVertex2f(0.8f,0.5f);  
  13.         glVertex2f(-0.1f,0.9f);  
  14.     glEnd();  
  15.     glFlush();  
  16. }  
  17.   
  18. int main(int argc, char* argv[])  
  19. {  
  20.     glutInit(&argc, argv);  
  21.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  22.     glutInitWindowPosition(400,400);  
  23.     glutInitWindowSize(400,400);  
  24.     glutCreateWindow("Study04");  
  25.     glutDisplayFunc(myDisplay);  
  26.     glutMainLoop();  
  27.     return 0;  
  28. }</strong></span>  

9.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_TRIANGLE_FAN);  
  9.         glVertex2f(0.0f,0.0f);  
  10.         glVertex2f(0.4f,0.8f);  
  11.         glVertex2f(0.8f,0.4f);  
  12.         glVertex2f(0.8f,-0.5f);  
  13.         glVertex2f(0.1f,-0.9f);  
  14.     glEnd();  
  15.     glFlush();  
  16. }  
  17.   
  18. int main(int argc, char* argv[])  
  19. {  
  20.     glutInit(&argc, argv);  
  21.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  22.     glutInitWindowPosition(400,400);  
  23.     glutInitWindowSize(400,400);  
  24.     glutCreateWindow("Study04");  
  25.     glutDisplayFunc(myDisplay);  
  26.     glutMainLoop();  
  27.     return 0;  
  28. }</strong></span>  

10.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_POLYGON);  
  9.         glVertex2f(0.0f,0.0f);  
  10.           
  11.         glVertex2f(0.8f,0.4f);  
  12.         glVertex2f(0.4f,0.8f);  
  13.         glVertex2f(0.8f,-0.5f);  
  14.         glVertex2f(0.1f,-0.9f);  
  15.     glEnd();  
  16.     glFlush();  
  17. }  
  18.   
  19. int main(int argc, char* argv[])  
  20. {  
  21.     glutInit(&argc, argv);  
  22.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  23.     glutInitWindowPosition(400,400);  
  24.     glutInitWindowSize(400,400);  
  25.     glutCreateWindow("Study04");  
  26.     glutDisplayFunc(myDisplay);  
  27.     glutMainLoop();  
  28.     return 0;  
  29. }</strong></span>  

11.

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(1.0,0.0,0.0);  
  8.     glBegin(GL_QUADS);  
  9.           
  10.         glVertex2f(0.2f, 0.2f);  
  11.         glVertex2f(0.2f, -0.2f);  
  12.         glVertex2f(-0.2f,-0.2f);  
  13.         glVertex2f(-0.2f,0.2f);  
  14.   
  15.         glVertex2f(0.3f, 0.3f);  
  16.         glVertex2f(0.3f, 0.7f);  
  17.         glVertex2f(0.7f,1.0f);  
  18.         glVertex2f(0.7f,0.3f);  
  19.     glEnd();  
  20.     glFlush();  
  21. }  
  22.   
  23. int main(int argc, char* argv[])  
  24. {  
  25.     glutInit(&argc, argv);  
  26.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  27.     glutInitWindowPosition(400,400);  
  28.     glutInitWindowSize(400,400);  
  29.     glutCreateWindow("Study04");  
  30.     glutDisplayFunc(myDisplay);  
  31.     glutMainLoop();  
  32.     return 0;  
  33. }</strong></span>  

12

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3. const int n = 20;  
  4. const GLfloat R = 0.5f;  
  5. const GLfloat Pi = 3.14159265358979f;  
  6.   
  7. void myDisplay()  
  8. {  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(1.0,0.0,0.0);  
  12.     glBegin(GL_POLYGON);  
  13.         for(int i=0;i<n;++i)  
  14.         {  
  15.             glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));  
  16.         }  
  17.           
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("Study04");  
  29.     glutDisplayFunc(myDisplay);  
  30.     glutMainLoop();  
  31.     return 0;  
  32. }</strong></span>  

12.1

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3. const int n = 30;  
  4. const GLfloat R = 0.5f;  
  5. const GLfloat Pi = 3.14159265358979f;  
  6.   
  7. void myDisplay()  
  8. {  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(1.0,0.0,0.0);  
  12.     glBegin(GL_POLYGON);  
  13.         for(int i=0;i<n;++i)  
  14.         {  
  15.             glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));  
  16.         }  
  17.           
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("Study04");  
  29.     glutDisplayFunc(myDisplay);  
  30.     glutMainLoop();  
  31.     return 0;  
  32. }</strong></span>  

12.2

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3. const int n = 50;  
  4. const GLfloat R = 0.5f;  
  5. const GLfloat Pi = 3.14159265358979f;  
  6.   
  7. void myDisplay()  
  8. {  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(1.0,0.0,0.0);  
  12.     glBegin(GL_POLYGON);  
  13.         for(int i=0;i<n;++i)  
  14.         {  
  15.             glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));  
  16.         }  
  17.           
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("Study04");  
  29.     glutDisplayFunc(myDisplay);  
  30.     glutMainLoop();  
  31.     return 0;  
  32. }</strong></span>  

13

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat R = 0.5f;  
  5. const GLfloat Pi = 3.14159265358979f;  
  6.   
  7. void myDisplay()  
  8. {  
  9.     GLfloat PointA[2] = {0,R};  
  10.     GLfloat PointB[2] = {R*cos(162*Pi/180),R*sin(162*Pi/180)};  
  11.     GLfloat PointC[2] = {R*cos(234*Pi/180),R*sin(234*Pi/180)};  
  12.     GLfloat PointD[2] = {R*cos(306*Pi/180),R*sin(306*Pi/180)};  
  13.     GLfloat PointE[2] = {R*cos(18*Pi/180),R*sin(18*Pi/180)};  
  14.     glClearColor(1.0,1.0,1.0,0.0);  
  15.     glClear(GL_COLOR_BUFFER_BIT);  
  16.     glColor3f(1.0,0.0,0.0);  
  17.     glBegin(GL_LINE_LOOP);  
  18.         glVertex2fv(PointA);  
  19.         glVertex2fv(PointC);  
  20.         glVertex2fv(PointE);  
  21.         glVertex2fv(PointB);  
  22.         glVertex2fv(PointD);  
  23.     glEnd();  
  24.     glFlush();  
  25. }  
  26.   
  27. int main(int argc, char* argv[])  
  28. {  
  29.     glutInit(&argc, argv);  
  30.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  31.     glutInitWindowPosition(400,400);  
  32.     glutInitWindowSize(400,400);  
  33.     glutCreateWindow("Study04");  
  34.     glutDisplayFunc(myDisplay);  
  35.     glutMainLoop();  
  36.     return 0;  
  37. }</strong></span>  


10.15

以下程序诸个描述

14.用很多线段的连线去模拟一个正玄函数线。用多条短的线段去模拟复杂的曲线或弧线似乎是一个很好的思维,在这思维下可以画出很多复杂的函数曲线

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. void myDisplay()  
  7. {  
  8.     GLfloat x;  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(0.0,0.0,1.0);  
  12.     glBegin(GL_LINES);  
  13.         glVertex2f(-1.0f, 0.0f);  
  14.         glVertex2f(1.0f, 0.0f);  
  15.         glVertex2f(0.0f, -1.0f);  
  16.         glVertex2f(0.0f, 1.0f);  
  17.     glEnd();  
  18.     glBegin(GL_LINE_STRIP);  
  19.         for(x=-1.0f/factor;x<1.0f/factor;x+=0.01)  
  20.         {  
  21.             glVertex2f(x*factor, sin(x)*factor);  
  22.         }  
  23.     glEnd();  
  24.     glFlush();  
  25. }  
  26.   
  27. int main(int argc, char* argv[])  
  28. {  
  29.     glutInit(&argc, argv);  
  30.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  31.     glutInitWindowPosition(400,400);  
  32.     glutInitWindowSize(400,400);  
  33.     glutCreateWindow("Study04");  
  34.     glutDisplayFunc(myDisplay);  
  35.     glutMainLoop();  
  36.     return 0;  
  37. }</strong></span>  

15.上周上机实验时设置点的大小总是不通过,今天发现设置点的大小不是那么难。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. void myDisplay()  
  7. {  
  8.     GLfloat x;  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(0.0,0.0,1.0);  
  12.     glPointSize(5.0f);  
  13.     glBegin(GL_POINTS);  
  14.         glVertex2f(0.0f, 0.0f);  
  15.         glVertex2f(0.4f, 0.4f);  
  16.         glVertex2f(-0.2f,0.3f);  
  17.     glEnd();  
  18.     glFlush();  
  19. }  
  20.   
  21. int main(int argc, char* argv[])  
  22. {  
  23.     glutInit(&argc, argv);  
  24.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  25.     glutInitWindowPosition(400,400);  
  26.     glutInitWindowSize(400,400);  
  27.     glutCreateWindow("Study04");  
  28.     glutDisplayFunc(myDisplay);  
  29.     glutMainLoop();  
  30.     return 0;  
  31. }</strong></span>  


15.1 这是一个点的大小设置的有点夸张的程序

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. void myDisplay()  
  7. {  
  8.     GLfloat x;  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(0.0,0.0,1.0);  
  12.     glPointSize(50.0f);  
  13.     glBegin(GL_POINTS);  
  14.         glVertex2f(0.0f, 0.0f);  
  15.         glVertex2f(0.4f, 0.4f);  
  16.         glVertex2f(-0.2f,0.3f);  
  17.     glEnd();  
  18.     glFlush();  
  19. }  
  20.   
  21. int main(int argc, char* argv[])  
  22. {  
  23.     glutInit(&argc, argv);  
  24.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  25.     glutInitWindowPosition(400,400);  
  26.     glutInitWindowSize(400,400);  
  27.     glutCreateWindow("Study04");  
  28.     glutDisplayFunc(myDisplay);  
  29.     glutMainLoop();  
  30.     return 0;  
  31. }</strong></span>  


16.设置了线宽

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. void myDisplay()  
  7. {  
  8.     GLfloat x;  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(0.0,0.0,1.0);  
  12.     glLineWidth(5.0f);  
  13.     glBegin(GL_LINE_STRIP);  
  14.         glVertex2f(0.0f, 0.0f);  
  15.         glVertex2f(0.4f, 0.4f);  
  16.         glVertex2f(-0.2f,0.3f);  
  17.     glEnd();  
  18.     glFlush();  
  19. }  
  20.   
  21. int main(int argc, char* argv[])  
  22. {  
  23.     glutInit(&argc, argv);  
  24.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  25.     glutInitWindowPosition(400,400);  
  26.     glutInitWindowSize(400,400);  
  27.     glutCreateWindow("Study04");  
  28.     glutDisplayFunc(myDisplay);  
  29.     glutMainLoop();  
  30.     return 0;  
  31. }</strong></span>  

16.1 设置了夸张的线宽

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. void myDisplay()  
  7. {  
  8.     GLfloat x;  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(0.0,0.0,1.0);  
  12.     glLineWidth(50.0f);  
  13.     glBegin(GL_LINE_STRIP);  
  14.         glVertex2f(0.0f, 0.0f);  
  15.         glVertex2f(0.4f, 0.4f);  
  16.         glVertex2f(-0.2f,0.3f);  
  17.     glEnd();  
  18.     glFlush();  
  19. }  
  20.   
  21. int main(int argc, char* argv[])  
  22. {  
  23.     glutInit(&argc, argv);  
  24.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  25.     glutInitWindowPosition(400,400);  
  26.     glutInitWindowSize(400,400);  
  27.     glutCreateWindow("Study04");  
  28.     glutDisplayFunc(myDisplay);  
  29.     glutMainLoop();  
  30.     return 0;  
  31. }</strong></span>  

17. 画圆。圆心和周长上的点的连线,线加粗。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. class screenPt  
  7. {  
  8.   private :  
  9.     GLint x,y;  
  10.   
  11.   public:  
  12.       screenPt()   
  13.       {  
  14.        x=y=0;  
  15.       }  
  16.   void setCoords(GLint xCoordValue,GLint yCoordValue)  
  17.   {  
  18.       x=xCoordValue;  
  19.       y=yCoordValue;  
  20.   }  
  21.   GLint getx() const  
  22.   {  
  23.       return x;  
  24.   }  
  25.  GLint gety() const  
  26.   {  
  27.       return y;  
  28.   }  
  29.   void incrementx()  
  30.   {  
  31.       x++;  
  32.   
  33.   }  
  34.   void decrementy()  
  35.   {  
  36.       y--;  
  37.   }  
  38. };  
  39.   
  40.  void line(GLint x1, GLint y1, GLint x2, GLint y2){  
  41.     glClearColor(1.0,1.0,1.0,0.0);  
  42.     glClear(GL_COLOR_BUFFER_BIT);  
  43.     glColor3f(1.0, 0.0, 0.0);  
  44.     glLineWidth(5.0f);  
  45.     glBegin(GL_LINES);  
  46.         glVertex2f(x1/200.0f, y1/200.0f);  
  47.         glVertex2f(x2/200.0f, y2/200.0f);  
  48.     //glEnd();  
  49.     glFlush();  
  50. }  
  51.   
  52. void circleMidpoint(GLint xc,GLint yc,GLint radius)  
  53. {  
  54.   
  55.     screenPt circPt;  
  56.   
  57.     GLint p=1-radius;  
  58.   
  59.     circPt.setCoords(0,radius);  
  60.   
  61.     void circlePlotPoints (GLint,GLint,screenPt);  
  62.     circlePlotPoints(xc, yc, circPt);  
  63.   
  64.   while(circPt.getx()<circPt.gety())  
  65.   {  
  66.       circPt.incrementx();  
  67.       if(p<0)  
  68.            p+=2*circPt.getx() +1;  
  69.       else   
  70.       {  
  71.           circPt.decrementy();  
  72.           p+=2*(circPt.getx()-circPt.gety())+1;  
  73.       }  
  74.   
  75.           circlePlotPoints(xc,yc,circPt);  
  76.        
  77.   }  
  78. }  
  79.   
  80. void circlePlotPoints(GLint xc,GLint yc,screenPt circPt)  
  81. {  
  82.   
  83.     line(xc, yc, xc+circPt.getx(),yc+circPt.gety());  
  84.   
  85.     line(xc, yc, xc-circPt.getx(),yc+circPt.gety());  
  86.   
  87.     line(xc, yc, xc+circPt.getx(),yc-circPt.gety());  
  88.   
  89.     line(xc, yc, xc-circPt.getx(),yc-circPt.gety());  
  90.   
  91.     line(xc, yc, xc+circPt.gety(),yc+circPt.getx());  
  92.           
  93.     line(xc, yc, xc-circPt.gety(),yc+circPt.getx());  
  94.   
  95.     line(xc, yc, xc+circPt.gety(),yc-circPt.getx());  
  96.   
  97.     line(xc, yc, xc-circPt.gety(),yc-circPt.getx());  
  98.   
  99. }  
  100.   
  101.   
  102.   
  103. void  Mycircle(void)  
  104. {  
  105.       circleMidpoint(100,80,50);  
  106.       glEnd();  
  107.       glFlush();  
  108.   
  109. }  
  110.   
  111.   
  112. int main(int argc, char* argv[])  
  113. {  
  114.     glutInit(&argc, argv);  
  115.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  116.     glutInitWindowPosition(400,400);  
  117.     glutInitWindowSize(400,400);  
  118.     glutCreateWindow("Study04");  
  119.     glutDisplayFunc(&Mycircle);  
  120.     glutMainLoop();  
  121.     return 0;  
  122. }  
  123. </strong></span>  

17.1 画圆。圆心和周长上的点的连线,线稍细。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. const GLfloat factor = 0.1f;  
  5.   
  6. class screenPt  
  7. {  
  8.   private :  
  9.     GLint x,y;  
  10.   
  11.   public:  
  12.       screenPt()   
  13.       {  
  14.        x=y=0;  
  15.       }  
  16.   void setCoords(GLint xCoordValue,GLint yCoordValue)  
  17.   {  
  18.       x=xCoordValue;  
  19.       y=yCoordValue;  
  20.   }  
  21.   GLint getx() const  
  22.   {  
  23.       return x;  
  24.   }  
  25.  GLint gety() const  
  26.   {  
  27.       return y;  
  28.   }  
  29.   void incrementx()  
  30.   {  
  31.       x++;  
  32.   
  33.   }  
  34.   void decrementy()  
  35.   {  
  36.       y--;  
  37.   }  
  38. };  
  39.   
  40.  void line(GLint x1, GLint y1, GLint x2, GLint y2){  
  41.     glClearColor(1.0,1.0,1.0,0.0);  
  42.     glClear(GL_COLOR_BUFFER_BIT);  
  43.     glColor3f(1.0, 0.0, 0.0);  
  44.     glLineWidth(1.0f);  
  45.     glBegin(GL_LINES);  
  46.         glVertex2f(x1/200.0f, y1/200.0f);  
  47.         glVertex2f(x2/200.0f, y2/200.0f);  
  48.     //glEnd();  
  49.     glFlush();  
  50. }  
  51.   
  52. void circleMidpoint(GLint xc,GLint yc,GLint radius)  
  53. {  
  54.   
  55.     screenPt circPt;  
  56.   
  57.     GLint p=1-radius;  
  58.   
  59.     circPt.setCoords(0,radius);  
  60.   
  61.     void circlePlotPoints (GLint,GLint,screenPt);  
  62.     circlePlotPoints(xc, yc, circPt);  
  63.   
  64.   while(circPt.getx()<circPt.gety())  
  65.   {  
  66.       circPt.incrementx();  
  67.       if(p<0)  
  68.            p+=2*circPt.getx() +1;  
  69.       else   
  70.       {  
  71.           circPt.decrementy();  
  72.           p+=2*(circPt.getx()-circPt.gety())+1;  
  73.       }  
  74.   
  75.           circlePlotPoints(xc,yc,circPt);  
  76.        
  77.   }  
  78. }  
  79.   
  80. void circlePlotPoints(GLint xc,GLint yc,screenPt circPt)  
  81. {  
  82.   
  83.     line(xc, yc, xc+circPt.getx(),yc+circPt.gety());  
  84.   
  85.     line(xc, yc, xc-circPt.getx(),yc+circPt.gety());  
  86.   
  87.     line(xc, yc, xc+circPt.getx(),yc-circPt.gety());  
  88.   
  89.     line(xc, yc, xc-circPt.getx(),yc-circPt.gety());  
  90.   
  91.     line(xc, yc, xc+circPt.gety(),yc+circPt.getx());  
  92.           
  93.     line(xc, yc, xc-circPt.gety(),yc+circPt.getx());  
  94.   
  95.     line(xc, yc, xc+circPt.gety(),yc-circPt.getx());  
  96.   
  97.     line(xc, yc, xc-circPt.gety(),yc-circPt.getx());  
  98.   
  99. }  
  100.   
  101.   
  102.   
  103. void  Mycircle(void)  
  104. {  
  105.       circleMidpoint(100,80,50);  
  106.       glEnd();  
  107.       glFlush();  
  108.   
  109. }  
  110.   
  111.   
  112. int main(int argc, char* argv[])  
  113. {  
  114.     glutInit(&argc, argv);  
  115.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  116.     glutInitWindowPosition(400,400);  
  117.     glutInitWindowSize(400,400);  
  118.     glutCreateWindow("Study04");  
  119.     glutDisplayFunc(&Mycircle);  
  120.     glutMainLoop();  
  121.     return 0;  
  122. }  
  123. </strong></span>  

18. 设置线的模式
[cpp] view plain copy
  1. <span style="font-size:18px;"><strong><span style="white-space:pre">    </span>glEnable(GL_LINE_STIPPLE);//激活模式选择  
  2.     glLineStipple(2,0x3333);//单位线,虚实匹配</strong></span>  

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include <GL/glut.h>  
  2. #include<math.h>  
  3.   
  4. void myDisplay()  
  5. {  
  6.   
  7.     glClearColor(1.0,1.0,1.0,0.0);  
  8.     glClear(GL_COLOR_BUFFER_BIT);  
  9.     glColor3f(0.0,0.0,1.0);  
  10.     glEnable(GL_LINE_STIPPLE);  
  11.     glLineStipple(2,0x3333);  
  12.     glLineWidth(3.0f);  
  13.     glBegin(GL_LINES);  
  14.         glVertex2f(-1.0f, 0.0f);  
  15.         glVertex2f(1.0f, 0.0f);  
  16.         glVertex2f(0.0f, -1.0f);  
  17.         glVertex2f(0.0f, 1.0f);  
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("Study04");  
  29.     glutDisplayFunc(myDisplay);  
  30.     glutMainLoop();  
  31.     return 0;  
  32. }</strong></span>  

19.练习一下程序的基本流程。不能看书,自己敲完。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(0.0,0.0,1.0);  
  8.     glLineWidth(5.0f);  
  9.     glBegin(GL_LINES);  
  10.         glVertex2f(0.0f, 0.0f);  
  11.         glVertex2f(0.6f,0.8f);  
  12.     glEnd();  
  13.     glFlush();  
  14. }  
  15.   
  16. int main(int argc, char* argv[])  
  17. {  
  18.     glutInit(&argc, argv);  
  19.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  20.     glutInitWindowPosition(400,400);  
  21.     glutInitWindowSize(400,400);  
  22.     glutCreateWindow("study");  
  23.   
  24.     glutDisplayFunc(myDisplay);  
  25.     glutMainLoop();  
  26.     return 0;  
  27. }</strong></span>  


20.opengl中面是具有两面的,opengl画点的顺序不变,但从面的两个面来看这些点的相连顺序相反。设置不同的目标方向,出现的面就不同。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(0.0,0.0,1.0);  
  8.   
  9.     glPolygonMode(GL_FRONT,GL_FILL); //设置正面为填充模式  
  10.     glPolygonMode(GL_BACK,GL_LINE);  //设置反面为线性模式  
  11.     glFrontFace(GL_CCW);  
  12.   
  13.     glBegin(GL_POLYGON);  
  14.         glVertex2f(-0.5f, -0.5f);  
  15.         glVertex2f(0.0f,-0.5f);  
  16.         glVertex2f(0.0f,0.0f);  
  17.         glVertex2f(-0.5f,0.0f);  
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("study");  
  29.   
  30.     glutDisplayFunc(myDisplay);  
  31.     glutMainLoop();  
  32.     return 0;  
  33. }</strong></span>  

20.
[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>//glEnable(GL_CULL_FACE);  
  2.     glCullFace(GL_FRONT);</strong></span>  

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(0.0,0.0,1.0);  
  8.   
  9.     glPolygonMode(GL_FRONT,GL_FILL); //设置正面为填充模式  
  10.     glPolygonMode(GL_BACK,GL_LINE);  //设置反面为线性模式  
  11.     glFrontFace(GL_CW);  
  12.   
  13.     glBegin(GL_POLYGON);  
  14.         glVertex2f(-0.5f, -0.5f);  
  15.         glVertex2f(0.0f,-0.5f);  
  16.         glVertex2f(0.0f,0.0f);  
  17.         glVertex2f(-0.5f,0.0f);  
  18.     glEnd();  
  19.     glFlush();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc, argv);  
  25.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  26.     glutInitWindowPosition(400,400);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("study");  
  29.   
  30.     glutDisplayFunc(myDisplay);  
  31.     glutMainLoop();  
  32.     return 0;  
  33. }</strong></span>  

21 面具有两个面,可以剔除一个面,当面被挡着时可以剔除一个面。

glEnable(GL_CULL_FACE);//opengl是一个状态机,需要激活才能使用一些功能

glCullFace(GL_FRONT);//剔除正面

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>//glEnable(GL_CULL_FACE);  
  2.     glCullFace(GL_FRONT);</strong></span>  

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(0.0,0.0,1.0);  
  8.   
  9.     glPolygonMode(GL_FRONT,GL_FILL); //设置正面为填充模式  
  10.     glPolygonMode(GL_BACK,GL_LINE);  //设置反面为线性模式  
  11.     glFrontFace(GL_CCW);  
  12.       
  13.     glBegin(GL_POLYGON);  
  14.         glVertex2f(-0.5f, -0.5f);  
  15.         glVertex2f(0.0f,-0.5f);  
  16.         glVertex2f(0.0f,0.0f);  
  17.         glVertex2f(-0.5f,0.0f);  
  18.     glEnd();  
  19.       
  20.     glColor3f(1.0,0.0,0.0);  
  21.     //glEnable(GL_CULL_FACE);  
  22.     glCullFace(GL_FRONT);  
  23.     glBegin(GL_POLYGON);  
  24.         glVertex2f(-0.5f, -0.5f);  
  25.         glVertex2f(0.0f,-0.5f);  
  26.         glVertex2f(0.0f,0.0f);  
  27.         glVertex2f(-0.5f,0.0f);  
  28.     glEnd();  
  29.     glDisable(GL_CULL_FACE);  
  30.     glFlush();  
  31. }  
  32.   
  33. int main(int argc, char* argv[])  
  34. {  
  35.     glutInit(&argc, argv);  
  36.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  37.     glutInitWindowPosition(400,400);  
  38.     glutInitWindowSize(400,400);  
  39.     glutCreateWindow("study");  
  40.   
  41.     glutDisplayFunc(myDisplay);  
  42.     glutMainLoop();  
  43.     return 0;  
  44. }</strong></span>  

21.1剔除了一个面后,被挡的面出现

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClearColor(1.0,1.0,1.0,0.0);  
  6.     glClear(GL_COLOR_BUFFER_BIT);  
  7.     glColor3f(0.0,0.0,1.0);  
  8.   
  9.     glPolygonMode(GL_FRONT,GL_FILL); //设置正面为填充模式  
  10.     glPolygonMode(GL_BACK,GL_LINE);  //设置反面为线性模式  
  11.     glFrontFace(GL_CCW);  
  12.       
  13.     glBegin(GL_POLYGON);  
  14.         glVertex2f(-0.5f, -0.5f);  
  15.         glVertex2f(0.0f,-0.5f);  
  16.         glVertex2f(0.0f,0.0f);  
  17.         glVertex2f(-0.5f,0.0f);  
  18.     glEnd();  
  19.       
  20.     glColor3f(1.0,0.0,0.0);  
  21.     glEnable(GL_CULL_FACE);  
  22.     glCullFace(GL_FRONT);  
  23.     glBegin(GL_POLYGON);  
  24.         glVertex2f(-0.5f, -0.5f);  
  25.         glVertex2f(0.0f,-0.5f);  
  26.         glVertex2f(0.0f,0.0f);  
  27.         glVertex2f(-0.5f,0.0f);  
  28.     glEnd();  
  29.     glDisable(GL_CULL_FACE);  
  30.     glFlush();  
  31. }  
  32.   
  33. int main(int argc, char* argv[])  
  34. {  
  35.     glutInit(&argc, argv);  
  36.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  37.     glutInitWindowPosition(400,400);  
  38.     glutInitWindowSize(400,400);  
  39.     glutCreateWindow("study");  
  40.   
  41.     glutDisplayFunc(myDisplay);  
  42.     glutMainLoop();  
  43.     return 0;  
  44. }</strong></span>  

22 画板,镂空的实现
[cpp] view plain copy
  1. <span style="font-size:18px;"><strong><span style="white-space:pre">    </span>glEnable(GL_POLYGON_STIPPLE);激活多面体镂空模式  
  2.     glPolygonStipple(Mask); 镂空数组</strong></span>  

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2. #include<stdio.h>  
  3. #include<STDLIB.H>  
  4.   
  5. void myDisplay()  
  6. {  
  7.     static GLubyte Mask[128];  
  8.     FILE *fp;  
  9.     fp = fopen("mmmm.bmp""rb");  
  10.     if(!fp)  
  11.         exit(0);  
  12.     if(fseek(fp, -(int)sizeof(Mask),SEEK_END))  
  13.         exit(0);  
  14.     if(!fread(Mask,sizeof(Mask),1,fp))  
  15.         exit(0);  
  16.     fclose(fp);  
  17.   
  18.     glClearColor(1.0,1.0,1.0,0.0);  
  19.     glClear(GL_COLOR_BUFFER_BIT);  
  20.     glColor3f(0.0,0.0,1.0);  
  21.     glEnable(GL_POLYGON_STIPPLE);  
  22.     glPolygonStipple(Mask);  
  23.     glRectf(-0.5f,-0.5f,0.0f,0.0f);  
  24.     glDisable(GL_POLYGON_STIPPLE);  
  25.     glRectf(0.0f,0.0f,0.5f,0.5f);  
  26.     glFlush();  
  27. }  
  28.   
  29. int main(int argc, char* argv[])  
  30. {  
  31.     glutInit(&argc, argv);  
  32.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  33.     glutInitWindowPosition(400,400);  
  34.     glutInitWindowSize(400,400);  
  35.     glutCreateWindow("study");  
  36.   
  37.     glutDisplayFunc(myDisplay);  
  38.     glutMainLoop();  
  39.     return 0;  
  40. }</strong></span>  

23 默认光滑模式

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. #include<math.h>  
  4. const GLdouble Pi = 3.1415926536;  
  5. void myDisplay()  
  6. {  
  7.     int i;  
  8.     glClearColor(1.0,1.0,1.0,0.0);  
  9.     glClear(GL_COLOR_BUFFER_BIT);  
  10.       
  11.     glBegin(GL_TRIANGLE_FAN);  
  12.     glColor3f(0.0,0.0,1.0);  
  13.     glVertex2f(0.0f,0.0f);  
  14.     for(i=0;i<=8;++i)  
  15.     {  
  16.         glColor3f(i&0x04, i&0x02, i&0x01);  
  17.         glVertex2f((float)cos(i*Pi/4), (float)sin(i*Pi/4));  
  18.     }  
  19.     glEnd();  
  20.     glFlush();  
  21. }  
  22.   
  23. int main(int argv, char* argc[])  
  24. {  
  25.     glutInit(&argv, argc);  
  26.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  27.     glutInitWindowPosition(400,400);  
  28.     glutInitWindowSize(400,400);  
  29.     glutCreateWindow("study");  
  30.       
  31.     glutDisplayFunc(myDisplay);  
  32.     //Sleep(10*1000);  
  33.     glutMainLoop();  
  34.     return 0;  
  35. }</strong></span>  

23.1 设置了清除色

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. #include<math.h>  
  4. const GLdouble Pi = 3.1415926536;  
  5. void myDisplay()  
  6. {  
  7.     int i;  
  8.     glClearColor(1.0,1.0,1.0,0.0);  
  9.     glClear(GL_COLOR_BUFFER_BIT);  
  10.       
  11.     glBegin(GL_TRIANGLE_FAN);  
  12.     //glColor3f(0.0,0.0,1.0);  
  13.     glVertex2f(0.0f,0.0f);  
  14.     for(i=0;i<=8;++i)  
  15.     {  
  16.         glColor3f(i&0x04, i&0x02, i&0x01);  
  17.         glVertex2f((float)cos(i*Pi/4), (float)sin(i*Pi/4));  
  18.     }  
  19.     glEnd();  
  20.     glFlush();  
  21. }  
  22.   
  23. int main(int argv, char* argc[])  
  24. {  
  25.     glutInit(&argv, argc);  
  26.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  27.     glutInitWindowPosition(400,400);  
  28.     glutInitWindowSize(400,400);  
  29.     glutCreateWindow("study");  
  30.       
  31.     glutDisplayFunc(myDisplay);  
  32.     //Sleep(10*1000);  
  33.     glutMainLoop();  
  34.     return 0;  
  35. }</strong></span>  

23.2 
[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>glShadeModel(GL_FLAT);采用平板展现模式---其对应光滑渐变模式</strong></span>  

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. #include<math.h>  
  4. const GLdouble Pi = 3.1415926536;  
  5. void myDisplay()  
  6. {  
  7.     int i;  
  8.     glShadeModel(GL_FLAT);  
  9.     glClearColor(1.0,1.0,1.0,0.0);  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.       
  12.     glBegin(GL_TRIANGLE_FAN);  
  13.     //glColor3f(0.0,0.0,1.0);  
  14.     glVertex2f(0.0f,0.0f);  
  15.     for(i=0;i<=8;++i)  
  16.     {  
  17.         glColor3f(i&0x04, i&0x02, i&0x01);  
  18.         glVertex2f((float)cos(i*Pi/4), (float)sin(i*Pi/4));  
  19.     }  
  20.     glEnd();  
  21.     glFlush();  
  22. }  
  23.   
  24. int main(int argv, char* argc[])  
  25. {  
  26.     glutInit(&argv, argc);  
  27.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  28.     glutInitWindowPosition(400,400);  
  29.     glutInitWindowSize(400,400);  
  30.     glutCreateWindow("study");  
  31.       
  32.     glutDisplayFunc(myDisplay);  
  33.     //Sleep(10*1000);  
  34.     glutMainLoop();  
  35.     return 0;  
  36. }</strong></span>  

24 今天是周一,明天周二,计算机图形学上机实验,不能太给老是丢人,就勉强自己写了个三维的,借用隔壁同学的方法使它旋转起来了,发现这方法竟然是下一天的课程,呵呵

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2. #include<windows.h>  
  3. #include<math.h>  
  4. static int day = 200;  
  5.   
  6. void myDisplay()  
  7. {  
  8.   
  9.     glEnable(GL_DEPTH_TEST); //启动深度测试  
  10.   
  11.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空深度缓冲和颜色缓冲  
  12.     glMatrixMode(GL_PROJECTION); //操作投影矩阵  
  13.     glLoadIdentity(); //进行变换前通常把当前矩阵设置为单位矩阵  
  14.     gluPerspective(75,1,1,400000000); //设置可视空间,得到透视效果(可视角,高宽比,最近可视距离,最远可视距离)  
  15.     glMatrixMode(GL_MODELVIEW); //设置当前操作的矩阵为“模型视图矩阵”  
  16.     glLoadIdentity(); //把当前矩阵设置为单位矩阵  
  17.     gluLookAt(0,-200000000,200000000,0,0,0,0,0,1); //设定观察点位置(观察点位置,目标位置,观察者上方向)  
  18.   
  19.   
  20.     glColor3f(1.0f,0.0f,0.0f);  
  21.     //glRotatef(day/360.0*360.0, 0.0f,0.0f,-1.0f);  
  22.     glutSolidSphere(69600000,50,50);  
  23.   
  24.     glColor3f(0.0f,0.0f,1.0f);  
  25.     glRotatef(day, 0.0f,0.0f,-1.0f);  
  26.     glTranslatef(150000000,0.0f,0.0f);  
  27.     glutSolidSphere(15945000,50,50);  
  28.       
  29.     glColor3f(1.0f,1.0f,0.0f);  
  30.     glRotatef(day/30.0*360.0-day,0.0f,0.0f,-1.0f);  
  31.     glTranslatef(38000000,0.0f,0.0f);  
  32.     glutSolidSphere(4345000,50,50);  
  33.   
  34.     glutSwapBuffers();  
  35. }  
  36.   
  37. void play()  
  38. {  
  39.     day++;  
  40.     if(day >= 360)  
  41.         day = 0;  
  42.     myDisplay();  
  43.     Sleep(100);  
  44.     glutPostRedisplay();  
  45. }  
  46.   
  47.   
  48. int main(int argv, char* argc[])  
  49. {  
  50.     glutInit(&argv, argc);  
  51.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  52.     glutInitWindowPosition(400,400);  
  53.     glutInitWindowSize(400,400);  
  54.     glutCreateWindow("study");  
  55.       
  56.     glutDisplayFunc(play);  
  57.       
  58.     glutMainLoop();  
  59.     return 0;  
  60. }</strong></span>  


10.16

今天只有晚上有时间了,白天都满课

25 光照,材质等,不是很懂,光照必须要会用!

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. #define WIDTH 400  
  4. #define HEIGHT 400  
  5.   
  6. static GLfloat angle = 0.0f;  
  7.   
  8. void myDisplay()  
  9. {  
  10.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  11.       
  12.     //创建透视效果视图  
  13.     glMatrixMode(GL_PROJECTION); //操作投影矩阵  
  14.     glLoadIdentity();  //当前矩阵设置为单位矩阵  
  15.     gluPerspective(90.0f, 1.0f,1.0f,20.0f);  //得到透视效果  
  16.     glMatrixMode(GL_MODELVIEW); //操作“模型视图”矩阵  
  17.     glLoadIdentity();  
  18.     gluLookAt(0.0,0.0,-10.0,0.0,0.0,0.0,0.0,1.0,0.0);  
  19.       
  20.     //定义太阳光源,它是一种白色光源  
  21.     {  
  22.         GLfloat sun_light_position[] = {0.0f,0.0f,0.0f,1.0f};  
  23.         GLfloat sun_light_ambient[] = {0.0f,0.0f,0.0f,1.0f};  
  24.         GLfloat sun_light_diffuse[] = {1.0f,1.0f,1.0f,1.0f};  
  25.         GLfloat sun_light_specular[] = {1.0f,1.0f,1.0f,1.0f};  
  26.           
  27.         glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);  
  28.         glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);  
  29.         glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);  
  30.         glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);  
  31.           
  32.         glEnable(GL_LIGHT0);  
  33.         glEnable(GL_LIGHTING);  
  34.         glEnable(GL_DEPTH_TEST);  
  35.     }  
  36.       
  37.     //定义太阳的材质并绘制太阳  
  38.     {  
  39.         GLfloat sun_mat_ambient[] = {0.0f,0.0f,0.0f,1.0f};  
  40.         GLfloat sun_mat_diffuse[] = {0.0f,0.0f,0.0f,1.0f};  
  41.         GLfloat sun_mat_specular[] = {0.0f,0.0f,0.0f,1.0f};  
  42.         GLfloat sun_mat_emission[] = {0.5f,0.0f,0.0f,1.0f};  
  43.         GLfloat sun_mat_shininess = 0.0f;  
  44.           
  45.         glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient); //环境变量  
  46.         glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse); //散射模式  
  47.         glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular); //镜面反射  
  48.         glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission); //发射,散发喷射  
  49.         glMaterialf(GL_FRONT, GL_SHININESS, sun_mat_shininess);   
  50.           
  51.         glutSolidSphere(2.0,40,32);  
  52.     }  
  53.       
  54.     //定义地球材质并绘制地球  
  55.     {  
  56.         GLfloat earth_mat_ambient[] = {0.0f,0.0f,0.5f,1.0f};  
  57.         GLfloat earth_mat_diffuse[] = {0.0f,0.0f,0.5f,1.0f};  
  58.         GLfloat earth_mat_specular[] = {0.0f,0.0f,1.0f,1.0f};  
  59.         GLfloat earth_mat_emission[] = {0.0f,0.0f,0.0f,1.0f};  
  60.         GLfloat earth_mat_shininess = 30.0f;  
  61.           
  62.         glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient); //环境变量  
  63.         glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse); //散射模式  
  64.         glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular); //镜面反射  
  65.         glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission); //发射,散发喷射  
  66.         glMaterialf(GL_FRONT, GL_SHININESS, earth_mat_shininess);   
  67.           
  68.         glRotatef(angle,0.0f,-1.0f,0.0f);  
  69.         glTranslatef(5.0f,0.0f,0.0f);  
  70.         glutSolidSphere(1.5,40,32);  
  71.     }  
  72.     glutSwapBuffers();  
  73. }  
  74.   
  75. void myIdle()  
  76. {  
  77.     angle += 1.0f;  
  78.     if(angle >= 360.0f)  
  79.         angle = 0.0f;  
  80.     myDisplay();  
  81. }  
  82.   
  83. int main(int argc, char* argv[])  
  84. {  
  85.     glutInit(&argc, argv);  
  86.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  87.     glutInitWindowPosition(200,200);  
  88.     glutInitWindowSize(WIDTH, HEIGHT);  
  89.     glutCreateWindow("opengl光照演示");  
  90.     glutDisplayFunc(&myDisplay);  
  91.     glutIdleFunc(&myIdle); //回调  
  92.     glutMainLoop();  
  93.     return 0;  
  94. }</strong></span>  

10.17

今天周三,满课,且晚上还有数据库上机实验,自己电脑不能用,中午看过这课后借同学的手机敲了代码练习

26 列表的使用(一次编译,多次使用,节省效率)、glutIdleFunc(&myIdle)调用cpu空闲资源且控制旋转角度,注意矩阵的push和pop

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2. #include<math.h>  
  3. #include<windows.h>  
  4.   
  5. #define WIDTH 400  
  6. #define HEIGHT 400  
  7.   
  8. #define ColoredVertex(c,v) do{glColor3fv(c);glVertex3fv(v);}while(0)  
  9.   
  10. GLfloat angle=0.0f;  
  11.   
  12. void myDisplay()  
  13. {  
  14.     static int list = 0;  
  15.     if(list == 0)  
  16.     {  
  17.         GLfloat  
  18.             PointA[] = {0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},  
  19.             PointB[] = {-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},  
  20.             PointC[] = {0.0f,-sqrt(6.0f)/12,sqrt(3.0f)/3},  
  21.             PointD[] = {0.0f,sqrt(6.0f)/4,0};  
  22.         GLfloat  
  23.             ColorR[] = {1,0,0},  
  24.             ColorG[] = {0,1,0},  
  25.             ColorB[] = {0,0,1},  
  26.             ColorY[] = {1,1,0};  
  27.   
  28.         list = glGenLists(1);  
  29.         glNewList(list,GL_COMPILE);  
  30.         glBegin(GL_TRIANGLES);  
  31.             ColoredVertex(ColorR,PointA);  
  32.             ColoredVertex(ColorG,PointB);  
  33.             ColoredVertex(ColorB,PointC);  
  34.   
  35.             ColoredVertex(ColorR,PointA);  
  36.             ColoredVertex(ColorB,PointC);  
  37.             ColoredVertex(ColorY,PointD);  
  38.   
  39.             ColoredVertex(ColorB,PointC);  
  40.             ColoredVertex(ColorG,PointB);  
  41.             ColoredVertex(ColorY,PointD);  
  42.   
  43.             ColoredVertex(ColorG,PointB);  
  44.             ColoredVertex(ColorR,PointA);  
  45.             ColoredVertex(ColorY,PointD);  
  46.         glEnd();  
  47.         glEndList();  
  48.         glEnable(GL_DEPTH_TEST);  
  49.     }  
  50.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  51.     glPushMatrix();  
  52.     glRotatef(angle,1,0.5,0);  
  53.     glCallList(list);  
  54.     glPopMatrix();  
  55.     glutSwapBuffers();  
  56. }  
  57.   
  58. void myIdle()  
  59. {  
  60.     ++angle;  
  61.     if(angle >= 360.0f)  
  62.         angle = 0.0f;  
  63.     Sleep(1000/10);  
  64.     myDisplay();  
  65. }  
  66.   
  67. int main(int argc, char* argv[])  
  68. {  
  69.     glutInit(&argc,argv);  
  70.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  71.     glutInitWindowPosition(200,200);  
  72.     glutInitWindowSize(400,400);  
  73.     glutCreateWindow("study");  
  74.     glutDisplayFunc(&myDisplay);  
  75.     glutIdleFunc(&myIdle);  
  76.     glutMainLoop();  
  77.     return 0;  
  78. }</strong></span>  

10.18

今天学颜色的混合,会有半透明的效果

27. glBlendFunc(GL_ONE,GL_ZERO);完全使用源色

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.     glEnable(GL_BLEND);  
  7.     glBlendFunc(GL_ONE,GL_ZERO);  
  8.   
  9.     glColor4f(1,0,0,0.5);  
  10.     glRectf(-1,-1,0.5,0.5);  
  11.     glColor4f(0,1,0,0.5);  
  12.     glRectf(-0.5,-0.5,1,1);  
  13.   
  14.     glutSwapBuffers();  
  15. }  
  16.   
  17. void myIdle()  
  18. {  
  19.     myDisplay();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc,argv);  
  25.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  26.     glutInitWindowPosition(200,200);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("study");  
  29.   
  30.     myDisplay();  
  31.     glutDisplayFunc(&myDisplay);  
  32.     glutIdleFunc(&myIdle);  
  33.     glutMainLoop();  
  34.     return 0;  
  35.   
  36. }</strong></span>  

27.1两种颜色混合

glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.     glEnable(GL_BLEND);  
  7.     glBlendFunc(GL_ONE,GL_ONE);  //改动  
  8.   
  9.     glColor4f(1,0,0,0.5);  
  10.     glRectf(-1,-1,0.5,0.5);  
  11.     glColor4f(0,1,0,0.5);  
  12.     glRectf(-0.5,-0.5,1,1);  
  13.   
  14.     glutSwapBuffers();  
  15. }  
  16.   
  17. void myIdle()  
  18. {  
  19.     myDisplay();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc,argv);  
  25.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  26.     glutInitWindowPosition(200,200);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("study");  
  29.   
  30.     myDisplay();  
  31.     glutDisplayFunc(&myDisplay);  
  32.     glutIdleFunc(&myIdle);  
  33.     glutMainLoop();  
  34.     return 0;  
  35.   
  36. }</strong></span>  


27.2

GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. void myDisplay()  
  4. {  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.     glEnable(GL_BLEND);  
  7.     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);  //改动  
  8.   
  9.     glColor4f(1,0,0,0.5);  
  10.     glRectf(-1,-1,0.5,0.5);  
  11.     glColor4f(0,1,0,0.5);  
  12.     glRectf(-0.5,-0.5,1,1);  
  13.   
  14.     glutSwapBuffers();  
  15. }  
  16.   
  17. void myIdle()  
  18. {  
  19.     myDisplay();  
  20. }  
  21.   
  22. int main(int argc, char* argv[])  
  23. {  
  24.     glutInit(&argc,argv);  
  25.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  26.     glutInitWindowPosition(200,200);  
  27.     glutInitWindowSize(400,400);  
  28.     glutCreateWindow("study");  
  29.   
  30.     myDisplay();  
  31.     glutDisplayFunc(&myDisplay);  
  32.     glutIdleFunc(&myIdle);  
  33.     glutMainLoop();  
  34.     return 0;  
  35.   
  36. }  
  37. </strong></span>  

28 光源,绘制半透明物体,注意深度测试的控制

在进行三维混合时,不仅要考虑源因子和目标因子,还应该考虑深度缓冲区。必须先绘制所有不透明的物体,再绘制半透明的物体。在绘制半透明物体时前,还需要将深度缓冲区设置为只读形式,否则可能出现画面错误。

[cpp] view plain copy
  1. <span style="font-size:18px;"><strong>#include<GL/glut.h>  
  2.   
  3. //在1,1,-1处设置白色的光源  
  4. void setLight()  
  5. {  
  6.     static const GLfloat light_position[] = {1.0f,1.0f,-1.0f,1.0f};  
  7.     static const GLfloat light_ambient[] = {0.2f,0.2f,0.2f,1.0f};  
  8.     static const GLfloat light_diffuse[] = {1.0f,1.0f,1.0f,1.0f};  
  9.     static const GLfloat light_specular[] = {1.0f,1.0f,1.0f,1.0f};  
  10.       
  11.     glLightfv(GL_LIGHT0,GL_POSITION, light_position);  
  12.     glLightfv(GL_LIGHT0,GL_AMBIENT, light_ambient);  
  13.     glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse);  
  14.     glLightfv(GL_LIGHT0,GL_SPECULAR, light_specular);  
  15.       
  16.     glEnable(GL_LIGHT0);  
  17.     glEnable(GL_LIGHTING);  
  18.     glEnable(GL_DEPTH_TEST);  
  19. }  
  20.   
  21. //设置材质  
  22. void setMatirial(const GLfloat mat_diffuse[4], GLfloat mat_shininess)  
  23. {  
  24.     static const GLfloat mat_specular[] = {0.0f,0.0f,0.0f,1.0f};  
  25.     static const GLfloat mat_emission[] = {0.0f,0.0f,0.0f,1.0f};  
  26.       
  27.     glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diffuse);  
  28.     glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);  
  29.     glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);  
  30.     glMaterialf(GL_FRONT,GL_SHININESS,mat_shininess);  
  31. }  
  32.   
  33.   
  34. void myDisplay()  
  35. {  
  36.     //定义一些材质颜色  
  37.     const static GLfloat red_color[] = {1.0f,0.0f,0.0f,1.0f};  
  38.     const static GLfloat green_color[] = {0.0f,1.0f,0.0f,0.3333f};  
  39.     const static GLfloat blue_color[] = {0.0f,0.0f,1.0f,0.5f};  
  40.       
  41.     //清除屏幕  
  42.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  43.       
  44.       
  45.       
  46.     //设置光源  
  47.     setLight();  
  48.   
  49.     //启动混合并设置混合因子  
  50.     glEnable(GL_BLEND);  
  51.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  
  52.       
  53.     //以(0,0,0.5)为中心,绘制一个半径为0.3的不透明红色球体(离观察者最远)  
  54.     setMatirial(red_color, 30.0);  
  55.     glPushMatrix();  
  56.     glTranslatef(0.0f,0.0f,0.5f);  
  57.     glutSolidSphere(0.3,30,30);   
  58.     glPopMatrix();  
  59.       
  60.     //绘制半透明物体  
  61.     glDepthMask(GL_FALSE);  
  62.       
  63.     //以(0.2,0,-0.5)为中心,绘制一个半径为0.2的半透明蓝色球体(离观察者最近)  
  64.     setMatirial(blue_color, 30.0);  
  65.     glPushMatrix();  
  66.     glTranslatef(0.2f,0.0f,-0.5f);  
  67.     glutSolidSphere(0.2,30,30);  
  68.     glPopMatrix();    
  69.   
  70.   
  71.   
  72.   
  73.     //以(0.1,0,0)为中心,绘制一个半径为0.15的半透明绿色球体(在两球体之间)  
  74.     setMatirial(green_color, 30.0);  
  75.     glPushMatrix();  
  76.     glTranslatef(0.1,0,0);  
  77.     glutSolidSphere(0.15,30,30);  
  78.     glPopMatrix();    
  79.       
  80.       
  81.     //深度缓冲区恢复为可读可写模式  
  82.     glDepthMask(GL_TRUE);  
  83.       
  84.     glutSwapBuffers();  
  85.       
  86. }  
  87.   
  88. void myIdle()  
  89. {  
  90.     myDisplay();  
  91. }  
  92.   
  93. int main(int argc, char* argv[])  
  94. {  
  95.     glutInit(&argc,argv);  
  96.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  97.     glutInitWindowPosition(200,200);  
  98.     glutInitWindowSize(400,400);  
  99.     glutCreateWindow("study");  
  100.       
  101.     myDisplay();  
  102.     glutDisplayFunc(&myDisplay);  
  103.     //glutIdleFunc(&myIdle);  
  104.     glutMainLoop();  
  105.     return 0;  
  106.       
  107. }</strong></span>  

10.19

29 读取bmp图片的宽度和高度值,代码跟下一个程序开头类似

主代码:

[cpp] view plain copy
  1. <pre name="code" class="cpp"><span style="font-size:18px;"><strong>static GLint ImageWidth;  
  2. static GLint ImageHeight;</strong></span></pre>  
  3. <pre></pre>  
  4. <p></p>  
  5. <pre></pre>  
  6. <pre name="code" class="cpp"><span style="font-size:18px;"><strong>//打开文件  
  7.     FILE* pFile = fopen("1234.bmp""rb");  
  8.     if(pFile == 0)  
  9.         exit(0);  
  10.   
  11.     //读取图象的大小信息  
  12.     fseek(pFile, 0x0012, SEEK_SET);  
  13.     fread(&ImageWidth,sizeof(ImageWidth),1,pFile);  
  14.     fread(&ImageHeight,sizeof(ImageHeight),1,pFile);</strong></span></pre><br>  
  15. <p></p>  
  16. <p><span style="font-size:18px"><strong><img src="http://img.my.csdn.net/uploads/201210/27/1351343996_9120.png" alt=""><br>  
  17. </strong></span></p>  
  18. <p><span style="font-size:18px"><strong><br>  
  19. </strong></span></p>  
  20. <p><span style="font-size:18px"><strong>30 读取bmp图片文件--存像素数值,画出来</strong></span></p>  
  21. <p><span style="font-size:18px"><strong></strong></span></p>  
  22. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#include<GL/glut.h>  
  23. #include<stdio.h>  
  24. #include<stdlib.h>  
  25.   
  26. #define FileName "1234.bmp"  
  27.   
  28. static GLint ImageWidth;  
  29. static GLint ImageHeight;  
  30. static GLint PixelLength;  
  31. static GLubyte* PixelData;  
  32.   
  33. void display()  
  34. {  
  35.     /*清除屏幕并不必要 
  36.     * 每次绘制时,画面都覆盖整个屏幕 
  37.     * 因此无论是否清除屏幕,结果都一样 
  38.     */  
  39.     //glClear(GL_COLOR_BUFFER_BIT);  
  40.   
  41.     //绘制像素  
  42.     glDrawPixels(ImageWidth,ImageHeight,  
  43.         GL_BGR_EXT,GL_UNSIGNED_BYTE,PixelData);  
  44.     //完成绘制  
  45.     glutSwapBuffers();  
  46. }  
  47.   
  48. int main(int argc, char* argv[])  
  49. {  
  50.     //打开文件  
  51.     FILE* pFile = fopen("1234.bmp""rb");  
  52.     if(pFile == 0)  
  53.         exit(0);  
  54.   
  55.     //读取图象的大小信息  
  56.     fseek(pFile, 0x0012, SEEK_SET);  
  57.     fread(&ImageWidth,sizeof(ImageWidth),1,pFile);  
  58.     fread(&ImageHeight,sizeof(ImageHeight),1,pFile);  
  59.   
  60.     //计算像素数据长度  
  61.     PixelLength = ImageWidth*3;  
  62.     while(PixelLength%4 != 0)  
  63.         ++PixelLength;  
  64.     PixelLength *= ImageHeight;  
  65.   
  66.     //读取像素数据  
  67.     PixelData = (GLubyte*)malloc(PixelLength);  
  68.     if(PixelData == 0)  
  69.         exit(0);  
  70.   
  71.     fseek(pFile,54,SEEK_SET);  
  72.     fread(PixelData,PixelLength,1,pFile);  
  73.   
  74.     //关闭文件  
  75.     fclose(pFile);  
  76.   
  77.     //初始化GLUT并运行  
  78.     glutInit(&argc,argv);  
  79.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  80.     glutInitWindowPosition(200,200);  
  81.     glutInitWindowSize(ImageWidth,ImageHeight);  
  82.     glutCreateWindow(FileName);  
  83.     glutDisplayFunc(&display);  
  84.     glutMainLoop();  
  85.     free(PixelData);  
  86.     return 0;  
  87. }</span></strong></pre>  
  88. <p></p>  
  89. <p><img src="http://img.my.csdn.net/uploads/201210/27/1351343956_5014.png" alt=""><br>  
  90. </p>  
  91. <p><strong><span style="font-size:18px"><br>  
  92. </span></strong></p>  
  93. <p><strong><span style="font-size:18px">31 像素的拷贝<span style="color:rgb(0,0,255); font-family:georgia,Verdana,Helvetica,Arial; line-height:19px; text-indent:26px">glCopyPixels()--坐标点坐标,宽度值、高度值、GL_COLOR</span></span></strong></p>  
  94. <p></p>  
  95. <pre name="code" class="cpp"><span style="font-size:18px;"><strong>#include<GL/glut.h>  
  96. #include<iostream>  
  97. using namespace std;  
  98.   
  99. #define WindowWidth 400  
  100. #define WindowHeight 400  
  101.   
  102. /*函数grab 
  103. * 抓取窗口中的像素 
  104. * 假设窗口宽度为WindowWidth,高度为WindowHeight 
  105. */  
  106.   
  107. #define BMP_Header_Length 54  
  108.   
  109. void grap()  
  110. {  
  111.     FILE* pDummyFile;  
  112.     FILE* pWritingFile;  
  113.     GLubyte* pPixelData;  
  114.     GLubyte BMP_Header[BMP_Header_Length];  
  115.     GLint i, j;  
  116.     GLint PixelDataLength;  
  117.       
  118.     //计算像素数据的实际长度  
  119.     i = WindowWidth * 3;  //得到每一行的像素数据长度  
  120.     while(i%4 != 0)   //补充数据知道i是4的倍数  
  121.         ++i;          //本来还有更快的算法,但这里追求直观,对速度没有太高要求  
  122.     PixelDataLength = i*WindowHeight; //内存字节大小  
  123.       
  124.     //分配内存和打开文件  
  125.     pPixelData = (GLubyte*)malloc(PixelDataLength);  
  126.     if(pPixelData == 0)  
  127.         exit(0);  
  128.       
  129.     pDummyFile = fopen("dummy.bmp""rb");  
  130.     if(pDummyFile == 0)  
  131.         exit(0);  
  132.       
  133.     pWritingFile = fopen("grab.bmp""wb");  
  134.     if(pWritingFile == 0)  
  135.         exit(0);  
  136.       
  137.     //读取像素  
  138.     glPixelStorei(GL_UNPACK_ALIGNMENT, 4);  
  139.     glReadPixels(0,0,WindowWidth, WindowHeight,  
  140.         GL_BGR_EXT,GL_UNSIGNED_BYTE,pPixelData);  
  141.       
  142.     //把dummy.bmp的头文件复制为新文件的文件头  
  143.     fread(BMP_Header,sizeof(BMP_Header),1,pDummyFile);  
  144.     fwrite(BMP_Header,sizeof(BMP_Header),1,pWritingFile);  
  145.     fseek(pWritingFile,0x0012,SEEK_SET);  
  146.     i = WindowWidth;  
  147.     j = WindowHeight;  
  148.     fwrite(&i,sizeof(i),1,pWritingFile);  
  149.     fwrite(&j,sizeof(j),1,pWritingFile);  
  150.       
  151.     //写入像素数据  
  152.     fseek(pWritingFile,0,SEEK_END);  
  153.     fwrite(pPixelData,PixelDataLength,1,pWritingFile);  
  154.       
  155.     //释放内存和关闭文件  
  156.     fclose(pDummyFile);  
  157.     fclose(pWritingFile);  
  158.     free(pPixelData);  
  159. }  
  160.   
  161.   
  162. void myDisplay()  
  163. {  
  164.   
  165.     glClear(GL_COLOR_BUFFER_BIT);  
  166.     glBegin(GL_TRIANGLES);  
  167.             glColor3f(1.0,0.0,0.0); glVertex2f(0.0f,0.0f);  
  168.             glColor3f(0.0,1.0,0.0); glVertex2f(1.0f,0.0f);  
  169.             glColor3f(0.0,0.0,1.0); glVertex2f(0.5f,1.0f);    
  170.     glEnd();  
  171.     glPixelZoom(-0.5f,-0.5f);  
  172.     glRasterPos2i(1,1);  
  173.     glCopyPixels(WindowWidth/2,WindowHeight/2,  
  174.         WindowWidth/2,WindowHeight/2,GL_COLOR);  
  175.     glutSwapBuffers();  
  176.     grap();  
  177. }  
  178.   
  179. void myIdle()  
  180. {  
  181.     cout<<"doing"<<endl;  
  182.     grap();  
  183.     return;  
  184. }  
  185.   
  186. int main(int argc, char* argv[])  
  187. {  
  188.     glutInit(&argc, argv);  
  189.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  190.     glutInitWindowPosition(400,400);  
  191.     glutInitWindowSize(400,400);  
  192.     glutCreateWindow("Study04");  
  193.     glutDisplayFunc(&myDisplay);  
  194.   
  195.     glutMainLoop();  
  196.       
  197.     cout<<"ok"<<endl;  
  198.     return 0;  
  199. }</strong></span></pre>  
  200. <p></p>  
  201. <p><span style="font-size:18px"><strong><img src="http://img.my.csdn.net/uploads/201210/27/1351343928_8023.png" alt=""></strong></span></p>  
  202. <p><span style="font-size:18px"><strong>10.20 纹理测试</strong></span></p>  
  203. <p><span style="font-size:18px"><strong>32.1<span style="font-family:georgia,Verdana,Helvetica,Arial; line-height:19px; text-indent:26px; background-color:rgb(255,255,255)">纹理的使用方法,只要指定每一个顶点在纹理图象中所对应的像素位置,OpenGL就会自动计算顶点以外的其它点在纹理图象中所对应的像素位置</span></strong></span></p>  
  204. <p><span style="font-size:18px"><strong></strong></span></p>  
  205. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#define WindowWidth 400  
  206. #define WindowHeight 400  
  207. #define WindowTitle "OpenGL纹理测试"  
  208.   
  209. #include<GL/glut.h>  
  210. #include<stdio.h>  
  211. #include<stdlib.h>  
  212.   
  213. /*函数grap 
  214.  *抓取窗口中的像素 
  215.  *假设窗口宽度为WindowWidth,高度为WindowHeight 
  216.  */  
  217.   
  218. #define BMP_Header_Length 54  
  219. void grap()  
  220. {  
  221.     FILE* pDummyFile;  
  222.     FILE* pWritingFile;  
  223.     GLubyte* pPixelData;  
  224.     GLubyte BMP_Header[BMP_Header_Length];  
  225.     GLint i,j;  
  226.     GLint PixelDataLength;  
  227.   
  228.     //计算像素数据的实际长度  
  229.     i = WindowWidth * 3;  //得到每一行的像素数据长度  
  230.     while(i%4 == 0)  
  231.         ++i;  
  232.     PixelDataLength = i * WindowHeight;  
  233.   
  234.     //分配内存和打开文件  
  235.     pPixelData = (GLubyte*)malloc(PixelDataLength);  
  236.     if(pPixelData == 0)  
  237.         exit(0);  
  238.   
  239.     pDummyFile = fopen("dummy.bmp","rb");  
  240.     if(pDummyFile == 0)  
  241.         exit(0);  
  242.   
  243.     pWritingFile = fopen("grap.bmp","wb");  
  244.     if(pWritingFile == 0)  
  245.         exit(0);  
  246.   
  247.     //读取像素  
  248.     glPixelStorei(GL_UNPACK_ALIGNMENT,4);  
  249.   
  250.     glReadPixels(0,0,WindowWidth,WindowHeight,  
  251.         GL_BGR_EXT,GL_UNSIGNED_BYTE,pPixelData);  
  252.   
  253.     //把dummy.bmp的文件头复制为新文件的文件头  
  254.     fread(BMP_Header,sizeof(BMP_Header),1,pDummyFile);  
  255.     fwrite(BMP_Header,sizeof(BMP_Header),1,pWritingFile);  
  256.     fseek(pWritingFile,0x0012,SEEK_SET);  
  257.     i = WindowWidth;  
  258.     j = WindowHeight;  
  259.     fwrite(&i,sizeof(i),1,pWritingFile);  
  260.     fwrite(&j,sizeof(j),1,pWritingFile);  
  261.   
  262.     //写入像素数据  
  263.     fseek(pWritingFile,54,SEEK_SET);  
  264.     fwrite(pPixelData,PixelDataLength,1,pWritingFile);  
  265.   
  266.     //释放内存并关闭文件  
  267.     fclose(pDummyFile);  
  268.     fclose(pWritingFile);  
  269.     free(pPixelData);  
  270. }  
  271.   
  272. /* 函数power_of_two 
  273.  * 检查一个整数是否为2的整数次方,如果是,返回1,否则返回0 
  274.  * 实际上只要查看其二进制位中有多少个1,如果正好有1个,返回1,否则返回0 
  275.  * 在“查看其二进制位中有多少个”时使用了一个小技巧 
  276.  * 使用n &= (n-1)可以使得n中的减少一个 
  277. */  
  278. int power_of_two(int n)  
  279. {  
  280.     if(n <= 0)  
  281.         return 0;  
  282.     return (n&(n-1)) == 0;  
  283. }  
  284.   
  285. /* 函数load_texture 
  286.  * 读取一个BMP文件作为纹理 
  287.  * 如果失败,返回0,如果成功,返回纹理编号 
  288. */  
  289. GLuint load_texture(const char* file_name)  
  290. {  
  291.     GLint width,height,total_bytes;  
  292.     GLubyte* pixels=0;  
  293.     GLuint last_texture_ID,texture_ID=0;  
  294.   
  295.     //打开文件,如果失败,返回  
  296.     FILE* pFile=fopen(file_name,"rb");  
  297.     if(pFile == 0)  
  298.         return 0;  
  299.   
  300.     //读取文件中图像的宽度和高度  
  301.     fseek(pFile,0x0012,SEEK_SET);  
  302.     fread(&width,4,1,pFile);  
  303.     fread(&height,4,1,pFile);  
  304.     fseek(pFile,BMP_Header_Length,SEEK_SET);  
  305.   
  306.     //计算每行像素所占的字节数,并根据此数据计算总像素字节数  
  307.     {  
  308.         GLint line_bytes = width*3;  
  309.         while(line_bytes % 4  !=  0)  
  310.             ++line_bytes;  
  311.         total_bytes = line_bytes*height;  
  312.     }  
  313.   
  314.     //根据总像素字节数分配内存  
  315.     pixels = (GLubyte*)malloc(total_bytes);  
  316.     if(pixels == 0)  
  317.     {  
  318.         fclose(pFile);  
  319.         return 0;  
  320.     }  
  321.   
  322.     //读取像素数据  
  323.     if(fread(pixels,total_bytes,1,pFile) <= 0)  
  324.     {  
  325.         free(pixels);  
  326.         fclose(pFile);  
  327.         return 0;  
  328.     }  
  329.   
  330.     //在旧版本的OpenGL中  
  331.     //如果图像宽度和高度不是2的整数次方,则需要进行缩放  
  332.     //这里并没有检查openGL版本,出于对版本兼容性的考虑,按旧版本处理  
  333.     //另外,无论是旧版本还是新版本  
  334.     //当图像的宽度和高度超过当前openGL实现所支持的最大值时,也要进行缩放  
  335.     {  
  336.         GLint max;  
  337.         glGetIntegerv(GL_MAX_TEXTURE_SIZE,&max);  
  338.         if(!power_of_two(width) || !power_of_two(height) || width>max || height>max)  
  339.         {  
  340.             const GLint new_width = 256;  
  341.             const GLint new_height = 256; //规定缩放后新的大小为256的正方形  
  342.             GLint new_line_bytes,new_total_bytes;  
  343.             GLubyte* new_pixels=0;  
  344.   
  345.             //计算每行所需要的字节数和总字节数  
  346.             new_line_bytes = new_width * 3;  
  347.             while(new_line_bytes % 4  != 0)  
  348.                 ++new_line_bytes;  
  349.             new_total_bytes = new_line_bytes * new_height;  
  350.   
  351.             //分配内存  
  352.             new_pixels = (GLubyte*)malloc(new_total_bytes);  
  353.             if(new_pixels == 0)  
  354.             {  
  355.                 free(pixels);  
  356.                 fclose(pFile);  
  357.                 return 0;  
  358.             }  
  359.   
  360.             //进行像素缩放  
  361.             gluScaleImage(GL_RGB,  
  362.                  width,height,GL_UNSIGNED_BYTE,pixels,  
  363.                  new_width,new_height,GL_UNSIGNED_BYTE,new_pixels);  
  364.   
  365.             //释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height  
  366.             free(pixels);  
  367.             pixels = new_pixels;  
  368.             width = new_width;  
  369.             height = new_height;  
  370.         }  
  371.     }  
  372.   
  373.     //分配一个新的纹理编号  
  374.     glGenTextures(1,&texture_ID);  
  375.     if(texture_ID == 0)  
  376.     {  
  377.         free(pixels);  
  378.         fclose(pFile);  
  379.         return 0;  
  380.     }  
  381.   
  382.     //绑定新的纹理,载入纹理并设置纹理参数  
  383.     //在绑定前,先获得原来绑定的纹理编号,以便在最后进行恢复  
  384.     glGetIntegerv(GL_TEXTURE_BINDING_2D,(int*)&last_texture_ID);  
  385.     glBindTexture(GL_TEXTURE_2D,texture_ID);  
  386.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);  
  387.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);  
  388.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);  
  389.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);  
  390.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,  
  391.         GL_BGR_EXT,GL_UNSIGNED_BYTE,pixels);  
  392.     glBindTexture(GL_TEXTURE_2D,last_texture_ID);  
  393.   
  394.   
  395.     //之前为pixels分配的内存可在使用glTexImage2D后释放  
  396.     //因为此时像素数据已经被openGL另行保存了一份(可能被保存在专门的图形硬件中)  
  397.     free(pixels);  
  398.     return texture_ID;  
  399. }  
  400.   
  401.   
  402. /* 两个纹理对象的编号 
  403. */  
  404. GLuint texGround;  
  405. GLuint texWall;  
  406.   
  407. void display()  
  408. {  
  409.     //清除屏幕  
  410.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  411.       
  412.     //设置视角  
  413.     glMatrixMode(GL_PROJECTION);  
  414.     glLoadIdentity();  
  415.     gluPerspective(75,1,1,21);  
  416.     glMatrixMode(GL_MODELVIEW);  
  417.     glLoadIdentity();  
  418.     gluLookAt(1,5,5,0,0,0,0,0,1);  
  419.   
  420.     //使用“地”纹理绘制土地  
  421.     glBindTexture(GL_TEXTURE_2D,texWall);  
  422.     glBegin(GL_QUADS);  
  423.         glTexCoord2f(0.0f,0.0f); glVertex3f(-8.0f,-8.0f,0.0f);  
  424.         glTexCoord2f(0.0f,5.0f); glVertex3f(-8.0f,8.0f,0.0f);  
  425.         glTexCoord2f(5.0f,5.0f); glVertex3f(8.0f,8.0f,0.0f);  
  426.         glTexCoord2f(5.0f,0.0f); glVertex3f(8.0f,-8.0f,0.0f);  
  427.     glEnd();  
  428.   
  429.     //使用“墙”纹理绘制栅栏  
  430.     glBindTexture(GL_TEXTURE_2D,texWall);  
  431.     glBegin(GL_QUADS);  
  432.         glTexCoord2f(0.0f,0.0f); glVertex3f(-6.0f,-3.0f,0.0f);  
  433.         glTexCoord2f(0.0f,1.0f); glVertex3f(-6.0f,-3.0f,1.5f);  
  434.         glTexCoord2f(5.0f,1.0f); glVertex3f(6.0f,-3.0f,1.5f);  
  435.         glTexCoord2f(5.0f,0.0f); glVertex3f(6.0f,-3.0f,0.0f);  
  436.     glEnd();  
  437.   
  438.     //旋转后再绘制一个  
  439.     glRotatef(-90,0,0,1);  
  440.     glBegin(GL_QUADS);  
  441.         glTexCoord2f(0.0f,0.0f); glVertex3f(-6.0f,-3.0f,0.0f);  
  442.         glTexCoord2f(0.0f,1.0f); glVertex3f(-6.0f,-3.0f,1.5f);  
  443.         glTexCoord2f(5.0f,1.0f); glVertex3f(6.0f,-3.0f,1.5f);  
  444.         glTexCoord2f(5.0f,0.0f); glVertex3f(6.0f,-3.0f,0.0f);         
  445.     glEnd();  
  446.   
  447.     //交换缓冲区,并保存像素数据到文件  
  448.     glutSwapBuffers();  
  449.     grap();  
  450. }  
  451.   
  452. int main(int argc, char* argv[])  
  453. {  
  454.     glutInit(&argc,argv);  
  455.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  456.     glutInitWindowPosition(200,200);  
  457.     glutInitWindowSize(WindowWidth,WindowHeight);  
  458.     glutCreateWindow(WindowTitle);  
  459.     glutDisplayFunc(&display);  
  460.   
  461.     //在这里做一些初始化  
  462.     glEnable(GL_DEPTH_TEST);  
  463.     glEnable(GL_TEXTURE_2D);  
  464.     texGround = load_texture("ground.bmp");  
  465.     texWall = load_texture("wall.bmp");  
  466.   
  467.     //开始显示  
  468.     glutMainLoop();  
  469.     return 0;  
  470. }</span></strong></pre><img src="http://img.my.csdn.net/uploads/201210/27/1351344610_2938.png" alt=""><br>  
  471. <p><br>  
  472. </p>  
  473. <p><strong><span style="font-size:18px">32 跟上个程序原理一样,上一个载入的都是墙的坐标,所以图像也不是很正确</span></strong></p>  
  474. <p></p>  
  475. <p><span style="font-size:18px"><strong></strong></span></p>  
  476. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#define WindowWidth 400  
  477. #define WindowHeight 400  
  478. #define WindowTitle "OpenGL纹理测试"  
  479.   
  480. #include<GL/glut.h>  
  481. #include<stdio.h>  
  482. #include<stdlib.h>  
  483.   
  484. /*函数grap 
  485.  *抓取窗口中的像素 
  486.  *假设窗口宽度为WindowWidth,高度为WindowHeight 
  487.  */  
  488.   
  489. #define BMP_Header_Length 54  
  490. void grap()  
  491. {  
  492.     FILE* pDummyFile;  
  493.     FILE* pWritingFile;  
  494.     GLubyte* pPixelData;  
  495.     GLubyte BMP_Header[BMP_Header_Length];  
  496.     GLint i,j;  
  497.     GLint PixelDataLength;  
  498.   
  499.     //计算像素数据的实际长度  
  500.     i = WindowWidth * 3;  //得到每一行的像素数据长度  
  501.     while(i%4 == 0)  
  502.         ++i;  
  503.     PixelDataLength = i * WindowHeight;  
  504.   
  505.     //分配内存和打开文件  
  506.     pPixelData = (GLubyte*)malloc(PixelDataLength);  
  507.     if(pPixelData == 0)  
  508.         exit(0);  
  509.   
  510.     pDummyFile = fopen("dummy.bmp","rb");  
  511.     if(pDummyFile == 0)  
  512.         exit(0);  
  513.   
  514.     pWritingFile = fopen("grap.bmp","wb");  
  515.     if(pWritingFile == 0)  
  516.         exit(0);  
  517.   
  518.     //读取像素  
  519.     glPixelStorei(GL_UNPACK_ALIGNMENT,4);  
  520.   
  521.     glReadPixels(0,0,WindowWidth,WindowHeight,  
  522.         GL_BGR_EXT,GL_UNSIGNED_BYTE,pPixelData);  
  523.   
  524.     //把dummy.bmp的文件头复制为新文件的文件头  
  525.     fread(BMP_Header,sizeof(BMP_Header),1,pDummyFile);  
  526.     fwrite(BMP_Header,sizeof(BMP_Header),1,pWritingFile);  
  527.     fseek(pWritingFile,0x0012,SEEK_SET);  
  528.     i = WindowWidth;  
  529.     j = WindowHeight;  
  530.     fwrite(&i,sizeof(i),1,pWritingFile);  
  531.     fwrite(&j,sizeof(j),1,pWritingFile);  
  532.   
  533.     //写入像素数据  
  534.     fseek(pWritingFile,54,SEEK_SET);  
  535.     fwrite(pPixelData,PixelDataLength,1,pWritingFile);  
  536.   
  537.     //释放内存并关闭文件  
  538.     fclose(pDummyFile);  
  539.     fclose(pWritingFile);  
  540.     free(pPixelData);  
  541. }  
  542.   
  543. /* 函数power_of_two 
  544.  * 检查一个整数是否为2的整数次方,如果是,返回1,否则返回0 
  545.  * 实际上只要查看其二进制位中有多少个1,如果正好有1个,返回1,否则返回0 
  546.  * 在“查看其二进制位中有多少个”时使用了一个小技巧 
  547.  * 使用n &= (n-1)可以使得n中的减少一个 
  548. */  
  549. int power_of_two(int n)  
  550. {  
  551.     if(n <= 0)  
  552.         return 0;  
  553.     return (n&(n-1)) == 0;  
  554. }  
  555.   
  556. /* 函数load_texture 
  557.  * 读取一个BMP文件作为纹理 
  558.  * 如果失败,返回0,如果成功,返回纹理编号 
  559. */  
  560. GLuint load_texture(const char* file_name)  
  561. {  
  562.     GLint width,height,total_bytes;  
  563.     GLubyte* pixels=0;  
  564.     GLuint last_texture_ID,texture_ID=0;  
  565.   
  566.     //打开文件,如果失败,返回  
  567.     FILE* pFile=fopen(file_name,"rb");  
  568.     if(pFile == 0)  
  569.         return 0;  
  570.   
  571.     //读取文件中图像的宽度和高度  
  572.     fseek(pFile,0x0012,SEEK_SET);  
  573.     fread(&width,4,1,pFile);  
  574.     fread(&height,4,1,pFile);  
  575.     fseek(pFile,BMP_Header_Length,SEEK_SET);  
  576.   
  577.     //计算每行像素所占的字节数,并根据此数据计算总像素字节数  
  578.     {  
  579.         GLint line_bytes = width*3;  
  580.         while(line_bytes % 4  !=  0)  
  581.             ++line_bytes;  
  582.         total_bytes = line_bytes*height;  
  583.     }  
  584.   
  585.     //根据总像素字节数分配内存  
  586.     pixels = (GLubyte*)malloc(total_bytes);  
  587.     if(pixels == 0)  
  588.     {  
  589.         fclose(pFile);  
  590.         return 0;  
  591.     }  
  592.   
  593.     //读取像素数据  
  594.     if(fread(pixels,total_bytes,1,pFile) <= 0)  
  595.     {  
  596.         free(pixels);  
  597.         fclose(pFile);  
  598.         return 0;  
  599.     }  
  600.   
  601.     //在旧版本的OpenGL中  
  602.     //如果图像宽度和高度不是2的整数次方,则需要进行缩放  
  603.     //这里并没有检查openGL版本,出于对版本兼容性的考虑,按旧版本处理  
  604.     //另外,无论是旧版本还是新版本  
  605.     //当图像的宽度和高度超过当前openGL实现所支持的最大值时,也要进行缩放  
  606.     {  
  607.         GLint max;  
  608.         glGetIntegerv(GL_MAX_TEXTURE_SIZE,&max);  
  609.         if(!power_of_two(width) || !power_of_two(height) || width>max || height>max)  
  610.         {  
  611.             const GLint new_width = 256;  
  612.             const GLint new_height = 256; //规定缩放后新的大小为256的正方形  
  613.             GLint new_line_bytes,new_total_bytes;  
  614.             GLubyte* new_pixels=0;  
  615.   
  616.             //计算每行所需要的字节数和总字节数  
  617.             new_line_bytes = new_width * 3;  
  618.             while(new_line_bytes % 4  != 0)  
  619.                 ++new_line_bytes;  
  620.             new_total_bytes = new_line_bytes * new_height;  
  621.   
  622.             //分配内存  
  623.             new_pixels = (GLubyte*)malloc(new_total_bytes);  
  624.             if(new_pixels == 0)  
  625.             {  
  626.                 free(pixels);  
  627.                 fclose(pFile);  
  628.                 return 0;  
  629.             }  
  630.   
  631.             //进行像素缩放  
  632.             gluScaleImage(GL_RGB,  
  633.                  width,height,GL_UNSIGNED_BYTE,pixels,  
  634.                  new_width,new_height,GL_UNSIGNED_BYTE,new_pixels);  
  635.   
  636.             //释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height  
  637.             free(pixels);  
  638.             pixels = new_pixels;  
  639.             width = new_width;  
  640.             height = new_height;  
  641.         }  
  642.     }  
  643.   
  644.     //分配一个新的纹理编号  
  645.     glGenTextures(1,&texture_ID);  
  646.     if(texture_ID == 0)  
  647.     {  
  648.         free(pixels);  
  649.         fclose(pFile);  
  650.         return 0;  
  651.     }  
  652.   
  653.     //绑定新的纹理,载入纹理并设置纹理参数  
  654.     //在绑定前,先获得原来绑定的纹理编号,以便在最后进行恢复  
  655.     glGetIntegerv(GL_TEXTURE_BINDING_2D,(int*)&last_texture_ID);  
  656.     glBindTexture(GL_TEXTURE_2D,texture_ID);  
  657.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);  
  658.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);  
  659.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);  
  660.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);  
  661.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,  
  662.         GL_BGR_EXT,GL_UNSIGNED_BYTE,pixels);  
  663.     glBindTexture(GL_TEXTURE_2D,last_texture_ID);  
  664.   
  665.   
  666.     //之前为pixels分配的内存可在使用glTexImage2D后释放  
  667.     //因为此时像素数据已经被openGL另行保存了一份(可能被保存在专门的图形硬件中)  
  668.     free(pixels);  
  669.     return texture_ID;  
  670. }  
  671.   
  672.   
  673. /* 两个纹理对象的编号 
  674. */  
  675. GLuint texGround;  
  676. GLuint texWall;  
  677.   
  678. void display()  
  679. {  
  680.     //清除屏幕  
  681.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  682.       
  683.     //设置视角  
  684.     glMatrixMode(GL_PROJECTION);  
  685.     glLoadIdentity();  
  686.     gluPerspective(75,1,1,21);  
  687.     glMatrixMode(GL_MODELVIEW);  
  688.     glLoadIdentity();  
  689.     gluLookAt(1,5,5,0,0,0,0,0,1);  
  690.   
  691.     //使用“地”纹理绘制土地  
  692.     glBindTexture(GL_TEXTURE_2D,texGround);  
  693.     glBegin(GL_QUADS);  
  694.         glTexCoord2f(0.0f,0.0f); glVertex3f(-8.0f,-8.0f,0.0f);  
  695.         glTexCoord2f(0.0f,5.0f); glVertex3f(-8.0f,8.0f,0.0f);  
  696.         glTexCoord2f(5.0f,5.0f); glVertex3f(8.0f,8.0f,0.0f);  
  697.         glTexCoord2f(5.0f,0.0f); glVertex3f(8.0f,-8.0f,0.0f);  
  698.     glEnd();  
  699.   
  700.     //使用“墙”纹理绘制栅栏  
  701.     glBindTexture(GL_TEXTURE_2D,texWall);  
  702.     glBegin(GL_QUADS);  
  703.         glTexCoord2f(0.0f,0.0f); glVertex3f(-6.0f,-3.0f,0.0f);  
  704.         glTexCoord2f(0.0f,1.0f); glVertex3f(-6.0f,-3.0f,1.5f);  
  705.         glTexCoord2f(5.0f,1.0f); glVertex3f(6.0f,-3.0f,1.5f);  
  706.         glTexCoord2f(5.0f,0.0f); glVertex3f(6.0f,-3.0f,0.0f);  
  707.     glEnd();  
  708.   
  709.     //旋转后再绘制一个  
  710.     glRotatef(-90,0,0,1);  
  711.     glBegin(GL_QUADS);  
  712.         glTexCoord2f(0.0f,0.0f); glVertex3f(-6.0f,-3.0f,0.0f);  
  713.         glTexCoord2f(0.0f,1.0f); glVertex3f(-6.0f,-3.0f,1.5f);  
  714.         glTexCoord2f(5.0f,1.0f); glVertex3f(6.0f,-3.0f,1.5f);  
  715.         glTexCoord2f(5.0f,0.0f); glVertex3f(6.0f,-3.0f,0.0f);         
  716.     glEnd();  
  717.   
  718.     //交换缓冲区,并保存像素数据到文件  
  719.     glutSwapBuffers();  
  720.     grap();  
  721. }  
  722.   
  723. int main(int argc, char* argv[])  
  724. {  
  725.     glutInit(&argc,argv);  
  726.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  727.     glutInitWindowPosition(200,200);  
  728.     glutInitWindowSize(WindowWidth,WindowHeight);  
  729.     glutCreateWindow(WindowTitle);  
  730.     glutDisplayFunc(&display);  
  731.   
  732.     //在这里做一些初始化  
  733.     glEnable(GL_DEPTH_TEST);  
  734.     glEnable(GL_TEXTURE_2D);  
  735.     texGround = load_texture("ground.bmp");  
  736.     texWall = load_texture("wall.bmp");  
  737.   
  738.     //开始显示  
  739.     glutMainLoop();  
  740.     return 0;  
  741. }</span></strong></pre><img src="http://img.my.csdn.net/uploads/201210/27/1351344918_9096.png" alt=""><br>  
  742. <p><br>  
  743. </p>  
  744. <p><strong><span style="font-size:18px">33.alpha测试</span></strong></p>  
  745. <p></p>  
  746. <p></p>  
  747. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#define WindowWidth 400  
  748. #define WindowHeight 400  
  749. #define WindowTitle "OpenGL纹理测试"  
  750.   
  751. #include<GL/glut.h>  
  752. #include<stdio.h>  
  753. #include<stdlib.h>  
  754.   
  755. /*函数grap 
  756.  *抓取窗口中的像素 
  757.  *假设窗口宽度为WindowWidth,高度为WindowHeight 
  758.  */  
  759.   
  760. #define BMP_Header_Length 54  
  761.   
  762.   
  763. /* 函数power_of_two 
  764.  * 检查一个整数是否为2的整数次方,如果是,返回1,否则返回0 
  765.  * 实际上只要查看其二进制位中有多少个1,如果正好有1个,返回1,否则返回0 
  766.  * 在“查看其二进制位中有多少个”时使用了一个小技巧 
  767.  * 使用n &= (n-1)可以使得n中的减少一个 
  768. */  
  769. int power_of_two(int n)  
  770. {  
  771.     if(n <= 0)  
  772.         return 0;  
  773.     return (n&(n-1)) == 0;  
  774. }  
  775.   
  776. /* 函数load_texture 
  777.  * 读取一个BMP文件作为纹理 
  778.  * 如果失败,返回0,如果成功,返回纹理编号 
  779. */  
  780. GLuint load_texture(const char* file_name)  
  781. {  
  782.     GLint width,height,total_bytes;  
  783.     GLubyte* pixels=0;  
  784.     GLuint last_texture_ID,texture_ID=0;  
  785.   
  786.     //打开文件,如果失败,返回  
  787.     FILE* pFile=fopen(file_name,"rb");  
  788.     if(pFile == 0)  
  789.         return 0;  
  790.   
  791.     //读取文件中图像的宽度和高度  
  792.     fseek(pFile,0x0012,SEEK_SET);  
  793.     fread(&width,4,1,pFile);  
  794.     fread(&height,4,1,pFile);  
  795.     fseek(pFile,BMP_Header_Length,SEEK_SET);  
  796.   
  797.     //计算每行像素所占的字节数,并根据此数据计算总像素字节数  
  798.     {  
  799.         GLint line_bytes = width*3;  
  800.         while(line_bytes % 4  !=  0)  
  801.             ++line_bytes;  
  802.         total_bytes = line_bytes*height;  
  803.     }  
  804.   
  805.     //根据总像素字节数分配内存  
  806.     pixels = (GLubyte*)malloc(total_bytes);  
  807.     if(pixels == 0)  
  808.     {  
  809.         fclose(pFile);  
  810.         return 0;  
  811.     }  
  812.   
  813.     //读取像素数据  
  814.     if(fread(pixels,total_bytes,1,pFile) <= 0)  
  815.     {  
  816.         free(pixels);  
  817.         fclose(pFile);  
  818.         return 0;  
  819.     }  
  820.   
  821.     //在旧版本的OpenGL中  
  822.     //如果图像宽度和高度不是2的整数次方,则需要进行缩放  
  823.     //这里并没有检查openGL版本,出于对版本兼容性的考虑,按旧版本处理  
  824.     //另外,无论是旧版本还是新版本  
  825.     //当图像的宽度和高度超过当前openGL实现所支持的最大值时,也要进行缩放  
  826.     {  
  827.         GLint max;  
  828.         glGetIntegerv(GL_MAX_TEXTURE_SIZE,&max);  
  829.         if(!power_of_two(width) || !power_of_two(height) || width>max || height>max)  
  830.         {  
  831.             const GLint new_width = 256;  
  832.             const GLint new_height = 256; //规定缩放后新的大小为256的正方形  
  833.             GLint new_line_bytes,new_total_bytes;  
  834.             GLubyte* new_pixels=0;  
  835.   
  836.             //计算每行所需要的字节数和总字节数  
  837.             new_line_bytes = new_width * 3;  
  838.             while(new_line_bytes % 4  != 0)  
  839.                 ++new_line_bytes;  
  840.             new_total_bytes = new_line_bytes * new_height;  
  841.   
  842.             //分配内存  
  843.             new_pixels = (GLubyte*)malloc(new_total_bytes);  
  844.             if(new_pixels == 0)  
  845.             {  
  846.                 free(pixels);  
  847.                 fclose(pFile);  
  848.                 return 0;  
  849.             }  
  850.   
  851.             //进行像素缩放  
  852.             gluScaleImage(GL_RGB,  
  853.                  width,height,GL_UNSIGNED_BYTE,pixels,  
  854.                  new_width,new_height,GL_UNSIGNED_BYTE,new_pixels);  
  855.   
  856.             //释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height  
  857.             free(pixels);  
  858.             pixels = new_pixels;  
  859.             width = new_width;  
  860.             height = new_height;  
  861.         }  
  862.     }  
  863.   
  864.     //分配一个新的纹理编号  
  865.     glGenTextures(1,&texture_ID);  
  866.     if(texture_ID == 0)  
  867.     {  
  868.         free(pixels);  
  869.         fclose(pFile);  
  870.         return 0;  
  871.     }  
  872.   
  873.     //绑定新的纹理,载入纹理并设置纹理参数  
  874.     //在绑定前,先获得原来绑定的纹理编号,以便在最后进行恢复  
  875.     glGetIntegerv(GL_TEXTURE_BINDING_2D,(int*)&last_texture_ID);  
  876.     glBindTexture(GL_TEXTURE_2D,texture_ID);  
  877.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);  
  878.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);  
  879.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);  
  880.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);  
  881.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,  
  882.         GL_BGR_EXT,GL_UNSIGNED_BYTE,pixels);  
  883.     glBindTexture(GL_TEXTURE_2D,last_texture_ID);  
  884.   
  885.   
  886.     //之前为pixels分配的内存可在使用glTexImage2D后释放  
  887.     //因为此时像素数据已经被openGL另行保存了一份(可能被保存在专门的图形硬件中)  
  888.     free(pixels);  
  889.     return texture_ID;  
  890. }  
  891.   
  892. /* 将当前纹理BGR格式转换为BGRA格式 
  893.  * 纹理中像素的RGB值如果与指定rgb相差不超过absolute,则将Alpha设置为0.0,否则设置为1.0 
  894. */  
  895. void texture_colorKey(GLubyte r,GLubyte g,GLubyte b,GLubyte absolute)  
  896. {  
  897.     GLint width,height;  
  898.     GLubyte* pixels=0;  
  899.   
  900.     //获得纹理的大小信息  
  901.     glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_WIDTH,&width);  
  902.     glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_HEIGHT,&height);  
  903.   
  904.     //分配空间并获得纹理像素  
  905.     pixels = (GLubyte*)malloc(width*height*4);  
  906.     if(pixels == 0)  
  907.         return;  
  908.     glGetTexImage(GL_TEXTURE_2D,0,GL_BGRA_EXT,GL_UNSIGNED_BYTE,pixels);  
  909.   
  910.     //修改像素中的Alpha值  
  911.     //其中pixels[i*4],pixels[i*4+1],pixels[i*4+2],pixels[i*4+3]  
  912.     //分别表示第i个像素的蓝、绿、红、Alpha四种分量,0表示最小,255表示最大  
  913.     {  
  914.         GLint i;  
  915.         GLint count = width*height;  
  916.         for(i=0;i<count;++i)  
  917.         {  
  918.             if(abs(pixels[i*4]-b) <= absolute  
  919.                 && abs(pixels[i*4+1]-g) <= absolute  
  920.                 && abs(pixels[i*4+2]-r) <= absolute)  
  921.                 pixels[i*4+3] = 0;  
  922.             else  
  923.                 pixels[i*4+3] = 255;  
  924.         }  
  925.     }  
  926.       
  927.     //将修改后的像素重新设置到纹理中,释放内存  
  928.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,  
  929.         GL_BGRA_EXT,GL_UNSIGNED_BYTE,pixels);  
  930.     free(pixels);  
  931. }  
  932.   
  933. void display()  
  934. {  
  935.     static int initialized=0;  
  936.     static GLuint texWindow=0;  
  937.     static GLuint texPicture=0;  
  938.   
  939.     //执行初始化操作,包括:读取相片,读取相框,将相框由BGR颜色转换为BGRA,  
  940.     //启用二维纹理  
  941.     if(!initialized)  
  942.     {  
  943.         texPicture = load_texture("picture.bmp");  
  944.         texWindow = load_texture("window.bmp");  
  945.         glBindTexture(GL_TEXTURE_2D,texWindow);  
  946.         texture_colorKey(255,255,255,10);  
  947.   
  948.         glEnable(GL_TEXTURE_2D);  
  949.           
  950.         initialized = 1;  
  951.     }  
  952.   
  953.     glClear(GL_COLOR_BUFFER_BIT);  
  954.   
  955.     //绘制相片,此时不需要进行Alpha测试,所有的像素都进行绘制  
  956.     glBindTexture(GL_TEXTURE_2D,texPicture);  
  957.     glDisable(GL_ALPHA_TEST);  
  958.     glBegin(GL_QUADS);  
  959.         glTexCoord2f(0,0);  glVertex2f(-1.0f,-1.0f);  
  960.         glTexCoord2f(0,1);  glVertex2f(-1.0f,1.0f);  
  961.         glTexCoord2f(1,1);  glVertex2f(1.0f,1.0f);  
  962.         glTexCoord2f(1,0);  glVertex2f(1.0f,-1.0f);  
  963.     glEnd();  
  964.   
  965.     //绘制相框,此时进行Alpha测试,只绘制不透明部分的像素  
  966.     glBindTexture(GL_TEXTURE_2D,texWindow);  
  967.     glEnable(GL_ALPHA_TEST);  
  968.     glAlphaFunc(GL_GREATER,0.5f);  
  969.       
  970.     glBegin(GL_QUADS);  
  971.         glTexCoord2f(0,0);  glVertex2f(-1.0f,-1.0f);  
  972.         glTexCoord2f(0,1);  glVertex2f(-1.0f,1.0f);  
  973.         glTexCoord2f(1,1);  glVertex2f(1.0f,1.0f);  
  974.         glTexCoord2f(1,0);  glVertex2f(1.0f,-1.0f);  
  975.     glEnd();  
  976.   
  977.   
  978.     //交换缓冲  
  979.     glutSwapBuffers();  
  980. }  
  981.   
  982.   
  983. int main(int argc, char* argv[])  
  984. {  
  985.     glutInit(&argc,argv);  
  986.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  987.     glutInitWindowPosition(200,200);  
  988.     glutInitWindowSize(WindowWidth,WindowHeight);  
  989.     glutCreateWindow("alpha-test");  
  990.   
  991.   
  992.   
  993.   
  994.     glutDisplayFunc(&display);  
  995.   
  996.   
  997.     //开始显示  
  998.     glutMainLoop();  
  999.     return 0;  
  1000. }</span></strong></pre><span style="font-size:18px"><strong><img src="http://img.my.csdn.net/uploads/201210/27/1351345099_4328.png" alt=""><br>  
  1001. </strong></span>  
  1002. <p></p>  
  1003. <p></p>  
  1004. <p><span style="font-size:18px"><strong>10.21</strong></span></p>  
  1005. <p><span style="font-size:18px"><strong>34. 模版测试。我的测试失败,具体的写法可以参考开头给的网址。</strong></span></p>  
  1006. <p><span style="font-size:18px"><strong></strong></span></p>  
  1007. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#include<GL/glut.h>  
  1008.   
  1009. void draw_sphere()  
  1010. {  
  1011.     //设置光源  
  1012.     glEnable(GL_LIGHTING);  
  1013.     glEnable(GL_LIGHT0);  
  1014.     {  
  1015.         GLfloat  
  1016.             pos[] = {5.0f,5.0f,0.0f,1.0f},  
  1017.             ambient[] = {0.0f,0.0f,1.0f,1.0f};  
  1018.         glLightfv(GL_LIGHT0,GL_POSITION,pos);  
  1019.         glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);  
  1020.     }  
  1021.       
  1022.     //绘制一个球体  
  1023.     glColor3f(1,0,0);  
  1024.     glPushMatrix();  
  1025.     glTranslatef(0,0,2);  
  1026.     glutSolidSphere(0.5,20,20);  
  1027.     glPopMatrix();  
  1028. }  
  1029.   
  1030. void display()  
  1031. {  
  1032.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  1033.       
  1034.     //设置观察点  
  1035.     glMatrixMode(GL_PROJECTION);  //采用投影矩阵  
  1036.     glLoadIdentity();  
  1037.     gluPerspective(60,1,5,25);  //投影区域,角度,宽高比,近距离,远距离  
  1038.     glMatrixMode(GL_MODELVIEW); //采用模型矩阵  
  1039.     glLoadIdentity();  
  1040.     gluLookAt(5,0,6.5,0,0,0,0,1,0);  
  1041.       
  1042.     glEnable(GL_DEPTH_TEST);  
  1043.       
  1044.     //绘制球体  
  1045.     //glDisable(GL_STENCIL_TEST);  
  1046.     draw_sphere();  
  1047.       
  1048.     //绘制一个平面镜。在绘制的同时注意设置模版缓冲  
  1049.     //另外,为了保证平面镜之后的镜像能够正确绘制,在绘制平面  
  1050.     //镜像时需要将深度缓冲区设置为只读的。  
  1051.     //在绘制时暂时关闭光照效果  
  1052.     glClearStencil(0);  
  1053.     glClear(GL_STENCIL_BUFFER_BIT);  
  1054.     glStencilFunc(GL_ALWAYS,1,0xFF);  
  1055.     glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);  
  1056.     glEnable(GL_STENCIL_TEST);  
  1057.       
  1058.     glDisable(GL_LIGHTING);  
  1059.     glColor3f(0.5f,0.5f,0.5f);  
  1060.     glDepthMask(GL_FALSE);  
  1061.     glRectf(-1.5f,-1.5f,1.5f,1.5f);  
  1062.     glDepthMask(GL_TRUE);  
  1063.       
  1064.     //绘制一个与先前球体关于平面镜对称的球体,注意光源的位置也要发生对称改变  
  1065.     //因为平面镜是在X轴和Y轴所确定的平面,所以只要Z坐标取反即可实现对称  
  1066.     //为了保证球体的绘制范围被限制在平面镜内部,使用模版测试  
  1067.     glEnable(GL_STENCIL_TEST);  
  1068.     glStencilFunc(GL_EQUAL,1,0xFF);  
  1069.     glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);  
  1070.     glScalef(1.0f,1.0f,-1.0f);  
  1071.     draw_sphere();  
  1072.       
  1073.     //交换缓冲  
  1074.     glutSwapBuffers();  
  1075. }   
  1076.   
  1077. int main(int argc, char* argv[])  
  1078. {  
  1079.     glutInit(&argc,argv);  
  1080.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);  
  1081.     glutInitWindowPosition(200,200);  
  1082.     glutInitWindowSize(400,400);  
  1083.     glutCreateWindow("study");  
  1084.     glutDisplayFunc(&display);  
  1085.     glutMainLoop();  
  1086.     return 0;  
  1087. }</span></strong></pre><img src="http://img.my.csdn.net/uploads/201210/27/1351345241_6397.png" alt=""><br>  
  1088. <p></p>  
  1089. <p><span style="font-size:18px"><strong>35 这题只敲了代码,没插件就没有运行,也没有图,具体大家可以看开头的网址</strong></span></p>  
  1090. <p></p>  
  1091. <pre name="code" class="cpp"><span style="font-size:18px;"><strong>//#include"GLee.h"  
  1092. #include<GL/glut.h>  
  1093. #include<stdio.h>  
  1094.   
  1095. void display()  
  1096. {  
  1097.     glClear(GL_COLOR_BUFFER_BIT);  
  1098.   
  1099.     //if(GLEE_ARB_window_pos)  
  1100.     //{//如果支持GL_ARB_window_pos  
  1101.         //则使用glWindowPos2iARB函数,指定绘制位置  
  1102.           
  1103.     //  printf("支持GL_ARB_window_pos\n");  
  1104.     //  printf("使用glWindowPos函数\n");  
  1105.     //  glWindowPos2iARB(100,100);  
  1106. //  }else{  
  1107.         GLint viewport[4];  
  1108.         GLdouble modelview[16],projection[16];  
  1109.         GLdouble x, y, z;  
  1110.           
  1111.         printf("不支持GL_ARB_window_pos\n");  
  1112.         printf("使用glRasterPos函数\n");  
  1113.           
  1114.         glGetIntegerv(GL_VIEWPORT,viewport);  
  1115.         glGetDoublev(GL_MODELVIEW_MATRIX,modelview);  
  1116.         glGetDoublev(GL_PROJECTION_MATRIX,projection);  
  1117.         gluUnProject(100,100,0.5,modelview,projection,viewport,&x,&y,&z);  
  1118.         glRasterPos3d(x,y,z);  
  1119. //  }  
  1120.       
  1121.     {//绘制一个5*5的像素块  
  1122.         GLubyte pixels[5][4][4];  
  1123.         //把像素中的所有像素都设置为红色  
  1124.         int i,j;  
  1125.         for(i=0;i<5;++i)  
  1126.             for(j=0;j<5;++j)  
  1127.             {  
  1128.                 pixels[i][j][0] = 255;  
  1129.                 pixels[i][j][1] = 0;  
  1130.                 pixels[i][j][2] = 0;  
  1131.                 pixels[i][j][3] = 255;  
  1132.             }  
  1133.             glDrawPixels(5,5,GL_RGBA,GL_UNSIGNED_BYTE,pixels);  
  1134.     }  
  1135.     glutSwapBuffers();  
  1136. }  
  1137.   
  1138. int main(int argc,char* argv[])  
  1139. {  
  1140.     glutInit(&argc,argv);  
  1141.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  1142.     glutInitWindowPosition(100,100);  
  1143.     glutInitWindowSize(512,512);  
  1144.     glutCreateWindow("OpenGL");  
  1145.     glutDisplayFunc(&display);  
  1146.     glutMainLoop();  
  1147.     return 0;  
  1148. }</strong></span></pre>  
  1149. <p></p>  
  1150. <p><span style="font-size:18px"><strong>36 显示字体 用的显示列表</strong></span></p>  
  1151. <p><span style="font-size:18px"><strong></strong></span></p>  
  1152. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#include<GL/glut.h>  
  1153. #include<windows.h>  
  1154.   
  1155. //ASCII字符总共只有0到127,一共128种字符  
  1156. #define MAX_CHAR 128  
  1157.   
  1158.   
  1159. void drawString(const char* str)  
  1160. {  
  1161.     static int isFirstCall = 1;  
  1162.     static GLuint lists;  
  1163.   
  1164.     if(isFirstCall){//如果是第一次调用,执行初始化  
  1165.                     //为每一个ASCII字符产生一个显示列表  
  1166.         isFirstCall = 0;  
  1167.           
  1168.         //申请MAX_CHAR个连续的显示列表编号  
  1169.         lists = glGenLists(MAX_CHAR);  
  1170.   
  1171.         //把每个字符的绘制命令都装到对应的显示列表中  
  1172.         wglUseFontBitmaps(wglGetCurrentDC(),0,MAX_CHAR,lists);  
  1173.   
  1174.         //调用每个字符对应的显示列表,绘制每个字符  
  1175.         for(;*str!='\0';++str)  
  1176.             glCallList(lists + *str);  
  1177.     }  
  1178. }  
  1179.   
  1180. void display()  
  1181. {  
  1182.     glClear(GL_COLOR_BUFFER_BIT);  
  1183.     glColor3f(1.0f,0.0f,0.0f);  
  1184.     glRasterPos2f(0.0f,0.0f);  
  1185.     drawString("hello,world");  
  1186.   
  1187.     glutSwapBuffers();  
  1188. }  
  1189.   
  1190.   
  1191. int main(int argc,char* argv[])  
  1192. {  
  1193.     glutInit(&argc,argv);  
  1194.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  1195.     glutInitWindowPosition(100,100);  
  1196.     glutInitWindowSize(512,512);  
  1197.     glutCreateWindow("OpenGL");  
  1198.     glutDisplayFunc(&display);  
  1199.     glutMainLoop();  
  1200.     return 0;  
  1201. }</span></strong></pre><img src="http://img.my.csdn.net/uploads/201210/27/1351345370_9989.png" alt=""><br>  
  1202. <p></p>  
  1203. <p><span style="font-size:18px"><strong>37 字体设置</strong></span></p>  
  1204. <p><span style="font-size:18px"><strong></strong></span></p>  
  1205. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#include<GL/glut.h>  
  1206. #include<windows.h>  
  1207.   
  1208. //ASCII字符总共只有0到127,一共128种字符  
  1209. #define MAX_CHAR 128  
  1210.   
  1211. void drawString(const char* str)  
  1212. {  
  1213.     static int isFirstCall = 1;  
  1214.     static GLuint lists;  
  1215.   
  1216.     if(isFirstCall){//如果是第一次调用,执行初始化  
  1217.                     //为每一个ASCII字符产生一个显示列表  
  1218.         isFirstCall = 0;  
  1219.           
  1220.         //申请MAX_CHAR个连续的显示列表编号  
  1221.         lists = glGenLists(MAX_CHAR);  
  1222.   
  1223.         //把每个字符的绘制命令都装到对应的显示列表中  
  1224.         wglUseFontBitmaps(wglGetCurrentDC(),0,MAX_CHAR,lists);  
  1225.   
  1226.         //调用每个字符对应的显示列表,绘制每个字符  
  1227.         for(;*str!='\0';++str)  
  1228.             glCallList(lists + *str);  
  1229.     }  
  1230. }  
  1231.   
  1232. void selectFont(int size,int charset,const char* face){  
  1233.     HFONT hFont=CreateFontA(size,0,0,0,FW_MEDIUM,0,0,0,  
  1234.         charset,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,  
  1235.         DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,face);  
  1236.     HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(),hFont);  
  1237.     DeleteObject(hOldFont);  
  1238. }  
  1239.   
  1240. void display()  
  1241. {  
  1242.     selectFont(48,ANSI_CHARSET,"Comic Sans MS");  
  1243.     glClear(GL_COLOR_BUFFER_BIT);  
  1244.     glColor3f(1.0f,0.0f,0.0f);  
  1245.     glRasterPos2f(0.0f,0.0f);  
  1246.     drawString("Hello,World!");  
  1247.   
  1248.     glutSwapBuffers();  
  1249. }  
  1250.   
  1251.   
  1252. int main(int argc,char* argv[])  
  1253. {  
  1254.     glutInit(&argc,argv);  
  1255.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  1256.     glutInitWindowPosition(100,100);  
  1257.     glutInitWindowSize(512,512);  
  1258.     glutCreateWindow("OpenGL");  
  1259.     glutDisplayFunc(&display);  
  1260.     glutMainLoop();  
  1261.     return 0;  
  1262. }</span></strong></pre><img src="http://img.my.csdn.net/uploads/201210/27/1351345437_6278.png" alt=""><br>  
  1263. <p></p>  
  1264. <p><span style="font-size:18px"><strong>38 显示汉字</strong></span></p>  
  1265. <p><span style="font-size:18px"><strong></strong></span></p>  
  1266. <pre name="code" class="cpp"><strong><span style="font-size:18px;">#include<GL/glut.h>  
  1267. #include<windows.h>  
  1268.   
  1269. //ASCII字符总共只有0到127,一共128种字符  
  1270. #define MAX_CHAR 128  
  1271.   
  1272. void drawCNString(const char* str)  
  1273. {  
  1274.     int len,i;  
  1275.     wchar_t* wstring;  
  1276.     HDC hDC=wglGetCurrentDC();  
  1277.     GLuint list = glGenLists(1);  
  1278.   
  1279.     //计算字符个数  
  1280.     //如果是双字节字符的(比如中文字符),两个字节才算一个字符  
  1281.     //否则一个字节算一个字符  
  1282.     len=0;  
  1283.     for(i=0;str[i]!='\0';++i)  
  1284.     {  
  1285.         if(IsDBCSLeadByte(str[i]))  
  1286.             ++i;  
  1287.         ++len;  
  1288.     }  
  1289.   
  1290.     //将混合字符转化为宽字符  
  1291.     wstring = (wchar_t*)malloc((len+1)*sizeof(wchar_t));  
  1292.     MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,str,-1,wstring,len);  
  1293.     wstring[len] = '\0';  
  1294.   
  1295.     //逐个输出字符  
  1296.     for(i=0;i<len;++i)  
  1297.     {  
  1298.         wglUseFontBitmapsW(hDC,wstring[i],1,list);  
  1299.         glCallList(list);  
  1300.     }  
  1301.   
  1302.     //回收所有临时资源  
  1303.     free(wstring);  
  1304.     glDeleteLists(list,1);  
  1305. }  
  1306.   
  1307. void selectFont(int size,int charset,const char* face){  
  1308.     HFONT hFont=CreateFontA(size,0,0,0,FW_MEDIUM,0,0,0,  
  1309.         charset,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,  
  1310.         DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,face);  
  1311.     HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(),hFont);  
  1312.     DeleteObject(hOldFont);  
  1313. }  
  1314.   
  1315. void display()  
  1316. {  
  1317.   
  1318.     glClear(GL_COLOR_BUFFER_BIT);  
  1319.   
  1320.     selectFont(48,ANSI_CHARSET,"Comic Sans MS");  
  1321.     glColor3f(1.0f,0.0f,0.0f);  
  1322.     glRasterPos2f(-0.7f,0.4f);  
  1323.     drawCNString("Hello,World!");  
  1324.       
  1325.     selectFont(48,GB2312_CHARSET,"楷体_GB2312");  
  1326.     glColor3f(1.0f,1.0f,0.0f);  
  1327.     glRasterPos2f(-0.7f,-0.1f);  
  1328.     drawCNString("当代中国汉字");  
  1329.       
  1330.     selectFont(48,GB2312_CHARSET,"华文仿宋");  
  1331.     glColor3f(0.0f,1.0f,0.0f);  
  1332.     glRasterPos2f(-0.7f,-0.6f);  
  1333.     drawCNString("傳統中國漢字");  
  1334.       
  1335.     glutSwapBuffers();  
  1336. }  
  1337.   
  1338.   
  1339. int main(int argc,char* argv[])  
  1340. {  
  1341.     glutInit(&argc,argv);  
  1342.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  1343.     glutInitWindowPosition(100,100);  
  1344.     glutInitWindowSize(512,512);  
  1345.     glutCreateWindow("OpenGL");  
  1346.     glutDisplayFunc(&display);  
  1347.     glutMainLoop();  
  1348.     return 0;  
  1349. }</span></strong></pre><img src="http://img.my.csdn.net/uploads/201210/27/1351345485_1205.png" alt=""><br>  
  1350. <p></p>  
  1351. <p><span style="font-size:18px; color:#ff0000"><strong>OVER!</strong></span></p>  
  1352. <p><br>  
  1353. </p>  
  1354.      

FROM:  http://blog.csdn.net/slience_perseverance/article/details/8096233




0 0