• OpenGL的学习之路-3


    前面1、2介绍的都是glut编程

    下面就进行opengl正是部分啦。

    1.绘制点

    1. #include
    2. #include
    3. #include
    4. #include
    5. void myMainWinDraw();
    6. int main(int argc,char** argv) {
    7. glutInit(&argc,argv);
    8. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    9. glutInitWindowSize(400, 400);
    10. glutInitWindowPosition(0, 0);
    11. glutCreateWindow("Hello");
    12. glutDisplayFunc(myMainWinDraw);
    13. glutMainLoop();
    14. return 0;
    15. }
    16. void myMainWinDraw(){
    17. glClearColor(0.0,0.0,0.0,0.0);//设置清除色
    18. glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区
    19. float a[2];
    20. glGetFloatv(GL_POINT_SIZE_RANGE,a);
    21. std::cout<0]<<"---"<1]<<"\n"; //输出的是,点大小的范围(不过没有这么严格)
    22. glPointSize(10); //设置点的大小
    23. glBegin(GL_POINTS);
    24. #if 0
    25. (0.5f,0.4f);
    26. (-0.5f,0.4f,0.0f);
    27. (0.0f,-0.4f,0.0f);
    28. #else
    29. glColor3f(1.0f,0.0f,0.0f); //为点设置颜色
    30. glVertex3f(0.5f,0.4f,0.0f); //该语句可绘制
    31. glColor3f(0.0f,0.0f,1.0f);
    32. glVertex3f(-0.5f,0.4f,0.0f);
    33. glColor3f(0.0f,1.0f,0.0f);
    34. glVertex3f(0.0f,-0.4f,0.0f);
    35. #endif // 0
    36. glEnd();
    37. glFlush();
    38. }

    这里留下小思考题:

    掷骰子是随机事件,现在平面上有三个点A、B、C,还有一个点P,位置可随机。令点A代表骰子的点数为1、4,点B代表骰子的点数为2、5,点C代表骰子的点数为3、6。现在开始扔,如果扔的点数为1或者4,那么取AP的中点作为新的P;如果扔到2或者5,则取BP的中点作为新的P;如果扔到的点数为3,6,则同理取CP的中点作为新的P。同时,要把每次取得的新的P绘制出来,并保持与相应的A或B或C同色。前面一定次数(如前20次),我们先不画点(还未进入稳态),后面再开始绘制。看看最终得到的图形是什么样子。

    结果很奇妙!

    明明是随机的,却呈现了规律性。赞叹数学、赞叹科学?是的,但我也想赞叹让我知道这个的我的老师。

    2.绘制线

    1. #include
    2. #include
    3. #include
    4. #include
    5. void myMainWinDraw();
    6. int main(int argc,char** argv) {
    7. glutInit(&argc,argv);
    8. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    9. glutInitWindowSize(400, 400);
    10. glutInitWindowPosition(0, 0);
    11. glutCreateWindow("Hello");
    12. glutDisplayFunc(myMainWinDraw);
    13. glutMainLoop();
    14. return 0;
    15. }
    16. void myMainWinDraw(){
    17. glClearColor(0.0,0.0,0.0,0.0);
    18. glClear(GL_COLOR_BUFFER_BIT);
    19. glLineWidth(2);
    20. glBegin(GL_LINES);
    21. #if 0
    22. glVertex3f(0.5f,0.0f,0.0f);
    23. glVertex3f(0.5f,0.4f,0.0f);
    24. glVertex3f(0.0f,0.4f,0.0f);
    25. glVertex3f(0.0f,-0.4f,0.0f);
    26. #else
    27. glColor3f(1.0f,0.0f,0.0f);
    28. glVertex3f(0.5f,0.0f,0.0f);
    29. glColor3f(0.0f,1.0f,0.0f);
    30. glVertex3f(0.5f,0.4f,0.0f);
    31. glColor3f(1.0f,0.0f,0.0f);
    32. glVertex3f(0.0f,0.4f,0.0f);
    33. glColor3f(0.0f,0.0f,1.0f);
    34. glVertex3f(0.0f,-0.4f,0.0f);
    35. #endif
    36. glEnd();
    37. glFlush();
    38. }

    两点连成一条直线。点和点之间是配对的,如果给的点的个数是奇数,那么最后一个点没有找到和他配对的点,会不起作用。

    关于颜色:

    默认状态,是两边点颜色的线性插值,结果如下:

    如果不想这样,就需要 glShadeModel(GL_FLAT) 变成:

    glShadeModel(GL_SMOOTH) 和 glShadeModel(GL_FLAT) !!

    联系:绘制环

    glBegin(GL_LINES_LOOP) :给出的两个相邻的点首尾相连,最后一个点和第一个点相连,构成环。两种颜色模式下:

    3.绘制三角形

    1. #include
    2. #include
    3. #include
    4. #include
    5. void myMainWinDraw();
    6. int main(int argc,char** argv) {
    7. glutInit(&argc,argv);
    8. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    9. glutInitWindowSize(400, 400);
    10. glutInitWindowPosition(0, 0);
    11. glutCreateWindow("Hello");
    12. glutDisplayFunc(myMainWinDraw);
    13. glutMainLoop();
    14. return 0;
    15. }
    16. void myMainWinDraw(){
    17. glClearColor(0.0,0.0,0.0,0.0);
    18. glClear(GL_COLOR_BUFFER_BIT);
    19. //glShadeModel(GL_FLAT); //GL_SMOOTH
    20. glBegin(GL_TRIANGLES);
    21. #if 0
    22. glVertex3f(0.5f,0.0f,0.0f);
    23. glVertex3f(0.5f,0.4f,0.0f);
    24. glVertex3f(0.0f,0.4f,0.0f);
    25. glVertex3f(0.0f,-0.4f,0.0f);
    26. glVertex3f(0.3f,-0.4f,0.0f);
    27. glVertex3f(0.0f,-0.2f,0.0f);
    28. #else
    29. glColor3f(1.0f,0.0f,0.0f);
    30. glVertex3f(0.5f,0.0f,0.0f);
    31. glColor3f(0.0f,1.0f,0.0f);
    32. glVertex3f(0.5f,0.4f,0.0f);
    33. glColor3f(1.0f,0.0f,0.0f);
    34. glVertex3f(0.0f,0.4f,0.0f);
    35. glColor3f(0.0f,0.0f,1.0f);
    36. glVertex3f(0.0f,-0.4f,0.0f);
    37. glColor3f(1.0f,0.0f,1.0f);
    38. glVertex3f(0.3f,-0.4f,0.0f);
    39. glColor3f(0.0f,1.0f,1.0f);
    40. glVertex3f(0.0f,-0.2f,0.0f);
    41. #endif
    42. glEnd();
    43. glFlush();
    44. }

    三个点一组,绘制一个三角形。

    推广:

    (后面几个平时用不太到) 

    4.绘制的线型

    1. #include
    2. #include
    3. #include
    4. #include
    5. void myMainWinDraw();
    6. int main(int argc,char** argv)
    7. {
    8. glutInit(&argc,argv);
    9. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    10. glutInitWindowSize(400, 400);
    11. glutInitWindowPosition(0, 0);
    12. glutCreateWindow("Hello");
    13. glutDisplayFunc(myMainWinDraw);
    14. glutMainLoop();
    15. return 0;
    16. }
    17. void myMainWinDraw(){
    18. glClearColor(0.0,0.0,0.0,0.0);
    19. glClear(GL_COLOR_BUFFER_BIT);
    20. glLineWidth(2);
    21. glEnable(GL_LINE_STIPPLE);
    22. glLineStipple(1,0xF0F0); //第一个参数是重复度、第二个参数代表线型
    23. glBegin(GL_LINES);
    24. glVertex3f(0.5f, 0.4f ,0.0f);
    25. glVertex3f(-0.5f, 0.4f ,0.0f);
    26. glEnd();
    27. glLineWidth(10);
    28. glLineStipple(5,0xF0F0);
    29. glColor3f(1.0f,0.0f,0.0f);
    30. glBegin(GL_LINES);
    31. glVertex3f(0.5f, 0.0f, 0.0f);
    32. glVertex3f(-0.5f, 0.0f,0.0f);
    33. glEnd();
    34. glLineWidth(20);
    35. glLineStipple(3,0x7555);
    36. glColor3f(1.0f,1.0f,0.0f);
    37. glBegin(GL_LINES);
    38. glVertex3f(0.5f, -0.4f, 0.0f);
    39. glVertex3f(-0.5f, -0.8f,0.0f);
    40. glEnd();
    41. glLineWidth(5);
    42. glBegin(GL_LINE_LOOP);
    43. glVertex3f(-0.8f, 0.8f, 0.0f);
    44. glVertex3f(-0.8f, -0.8f, 0.0f);
    45. glVertex3f( 0.8f, -0.8f, 0.0f);
    46. glVertex3f( 0.8f, 0.8f, 0.0f);
    47. glEnd();
    48. glFlush();
    49. }

    新的知识点:

    1. glEnable(GL_LINE_STIPPLE) :将开关打开

    2. glLineStipple(1,0xF0F0):第一个参数是重复度,第二个参数是线型。这里是,1111000011110000。如果将第一个参数改为2,那么将变成1111111100000000...这个样子。

    绘制结果:

    5.多边形绘制的模式(填充/线框)

    1. #include
    2. #include
    3. #include
    4. #include
    5. void myMainWinDraw();
    6. int main(int argc,char** argv)
    7. {
    8. glutInit(&argc,argv);
    9. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    10. glutInitWindowSize(400, 400);
    11. glutInitWindowPosition(0, 0);
    12. glutCreateWindow("Hello");
    13. glutDisplayFunc(myMainWinDraw);
    14. glutMainLoop();
    15. return 0;
    16. }
    17. void myMainWinDraw(){
    18. glClearColor(0.0,0.0,0.0,0.0);
    19. glClear(GL_COLOR_BUFFER_BIT);
    20. glDisable(GL_LIGHTING);
    21. glPolygonMode(GL_FRONT,GL_FILL);
    22. glPolygonMode(GL_BACK,GL_LINE);
    23. glBegin(GL_TRIANGLES);
    24. glVertex2f(-1.0f, 0.0f);
    25. glVertex2f( 0.0f, 0.0f);
    26. glVertex2f( 0.0f, 1.0f);
    27. glEnd();
    28. glPolygonMode(GL_FRONT,GL_LINE);
    29. glBegin(GL_TRIANGLES);
    30. glVertex2f( 1.0f, 0.0f);
    31. glVertex2f( 0.0f, 1.0f);
    32. glVertex2f( 0.0f, 1.0f);
    33. glEnd();
    34. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    35. glBegin(GL_TRIANGLES);
    36. glVertex2f( 0.0f, 0.0f);
    37. glVertex2f( -1.0f, 0.0f);
    38. glVertex2f( 0.0f,-1.0f);
    39. glEnd();
    40. glFrontFace(GL_CW);
    41. glPolygonMode(GL_BACK,GL_FILL);
    42. glPolygonMode(GL_FRONT,GL_LINE);
    43. glBegin(GL_TRIANGLES);
    44. glVertex2f( 0.0f, 0.0f);
    45. glVertex2f( 0.0f,-1.0f);
    46. glVertex2f( 1.0f, 0.0f);
    47. glEnd();
    48. glFlush();
    49. }

    新的知识点:

    1. glPolygonMode(GL_FRONT,GL_FILL):设置正面或者背面的填充方式为GL_FILL或者GL_LINE模式。

    2. glFrontFace(GL_CW):初始状态将CCW方向(点的顺序)视为正面,该语句将CW方向转为正面。

    6.多边形填充的效果

    填充图形的定义:

     下面就是glBegin()和glEnd() 了

  • 相关阅读:
    淘宝/天猫API:item_password-获得淘口令真实url
    JavaScript-桥接模式
    Vue中的深度监听(Deep Watch):详细解析与实际示例
    求解多元多次方程解的个数
    【云原生之Docker实战】使用Docker部署WBO在线协作白板
    Flutter启动页
    国考省考申论:2次阅读法:1读感知材料类型和段落关系,2读根据问题词,原因词,影响词,对策词,关联词把握得分要点
    Azide-PEG-Cholesterol,N3-PEG-Cholesterol,叠氮-PEG-胆固醇PEG试剂供应
    实现企业混合云架构两大关键能力
    Wait-Notify机制
  • 原文地址:https://blog.csdn.net/zzz_zzzz_/article/details/134369720