zoukankan      html  css  js  c++  java
  • 7天学习opengl入门

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

    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    1. <span style="font-size:18px;"><strong>//glEnable(GL_CULL_FACE);  
    2.     glCullFace(GL_FRONT);</strong></span>  
    [cpp] view plaincopy
     
    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 plaincopy
     
    1. <span style="font-size:18px;"><strong>//glEnable(GL_CULL_FACE);  
    2.     glCullFace(GL_FRONT);</strong></span>  
    [cpp] view plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    1. <span style="font-size:18px;"><strong><span style="white-space:pre">    </span>glEnable(GL_POLYGON_STIPPLE);激活多面体镂空模式  
    2.     glPolygonStipple(Mask); 镂空数组</strong></span>  
    [cpp] view plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    1. <span style="font-size:18px;"><strong>glShadeModel(GL_FLAT);采用平板展现模式---其对应光滑渐变模式</strong></span>  
    [cpp] view plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
    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 plaincopy
     
      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="https://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="https://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="https://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="https://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="https://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="https://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="https://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 ");  
      1104.     //  printf("使用glWindowPos函数 ");  
      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 ");  
      1112.         printf("使用glRasterPos函数 ");  
      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!='';++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="https://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!='';++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="https://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]!='';++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] = '';  
      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="https://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>  
  • 相关阅读:
    浙江省CIO协会钱塘江论坛近日在网易云创沙龙宣布成立
    用Python解析XMind
    Flask写web时cookie的处理
    一篇文章看懂Facebook和新浪微博的智能FEED
    改进网易云音乐的“音乐社交”构想
    移动端爬虫工具与方法介绍
    用供应链管理思路降低教培产品成本
    【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)
    网易严选的wkwebview测试之路
    linux多进程之间的文件锁
  • 原文地址:https://www.cnblogs.com/xuejinhui/p/4353032.html
Copyright © 2011-2022 走看看