经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
OpenGL学习(1)——创建窗口
来源:cnblogs  作者:一只名为狗的猫  时间:2019/4/17 8:55:44  对本文有异议

这是我的第一篇博客,试着记录学习OpenGL的过程。使用的教程:LearnOpenGL,系统:Deepin 15.9.3,IDE:Qt Creator。

添加头文件

创建窗口用到两个库:GLFW和GLAD,这里GLAD也可以替换成GLEW。添加头文件很简单,直接include就好:

  1. #include <iostream>
  2. #include <glad/glad.h>
  3. #include <GLFW/glfw3.h>

注意添加GLAD和GLFW头文件的次序,如果先添加GLFW的头文件,在编译时会报错。

初始化GLFW

调用函数 glfwInit在程序最开始初始化GLFW库:
glfwInit();

配置GLFW

调用函数glfwWindowHint为之后调用创建窗口函数配置Hint,这里配置两个Hint:OpenGL版本和Profile类型。
因为我使用的是OpengGL 3.0,所以配置版本号为3,另外选择Core Profile作为Profile类型:

  1. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  2. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  3. glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);

顺带一提Deepin或Ubuntu下查看OpenGL版本号的方法。两条指令:
sudo apt-get install mesa-utils
glxinfo

创建窗口

调用glfwCreateWindow函数创建窗口,需要四个参数,分别是:width、height、title、monitor和share,并返回一个GLFWwindow类型的对象。这里忽略最后两个参数,均设置成NULL。
设置窗口的宽度为800,高度为600,标题为“OpenGL_Demo”:
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL_Demo", NULL, NULL);
调用glfwMakeContextCurrent函数设置已创建窗口的Context为当前线程的主Context:
glfwMakeContextCurrent(window);

初始化GLAD

我也不清楚GLAD库的具体作用,教程上说是用来管理OpenGL的函数指针,所以需要在调用OpenGL的函数前初始化GLAD。概念绕来绕去的,就先放一放。
将GLFW库的glfwGetProcAddress函数传递给GLAD,glfwGetProcAddress返回OpenGL函数的地址:
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);

配置视口Viewport

视口是实际用来渲染的窗口,维度一般和窗口window的维度相同,也可以将视口的维度设置得比window的维度小或是大。
调用glViewport函数进行配置,需要四个参数:x、y、width和height。(x, y)是视口左下角的坐标,这里设置成(0, 0):
glViewport(0, 0, 800, 600);

渲染循环

为了使程序在用户关闭窗口前一直处于渲染的状态,还需要一个while循环:

  1. while(!glfwWindowShouldClose(window)){
  2. glfwSwapBuffers(window);
  3. glfwPollEvents();
  4. }

glfwWindowShouldClose函数检测用户是否要求关闭窗口。glfwPollEvents函数检测是否有事件被触发,比如键盘的输入或者鼠标的移动。glfwSwapBuffers用来交换Front Buffer和Back Buffer,并在窗口显示绘制的内容。

释放资源

最后调用glfwTerminate函数释放分配的资源:
glfwTerminate()

完整代码如下:

  1. #include <iostream>
  2. #include <glad/glad.h>
  3. #include <GLFW/glfw3.h>
  4. using namespace std;
  5. //void frambuffer_size_callback(GLFWwindow* window, int width, int height);
  6. void processInput(GLFWwindow* window);
  7. int main()
  8. {
  9. //initialize GLFW
  10. glfwInit();
  11. //configure GLFW
  12. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  13. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  14. glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
  15. //creat a window object
  16. GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL_Demo", NULL, NULL);
  17. if (window == NULL){
  18. cout << "Failed to create GLFW window" << endl;
  19. glfwTerminate();
  20. return -1;
  21. }
  22. glfwMakeContextCurrent(window);
  23. //initialize GLAD to manage function pointers for OpenGL
  24. if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
  25. cout << "Failed to initialize GLAD" << endl;
  26. return -1;
  27. }
  28. //set width and height of Viewport
  29. glViewport(0, 0, 800, 600);
  30. //glfwSetFramebufferSizeCallback(window, frambuffer_size_callback);
  31. //render loop
  32. while(!glfwWindowShouldClose(window)){
  33. processInput(window);
  34. glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  35. glClear(GL_COLOR_BUFFER_BIT);
  36. glfwSwapBuffers(window);
  37. glfwPollEvents();
  38. }
  39. glfwTerminate();
  40. return 0;
  41. }
  42. /*
  43. void frambuffer_size_callback(GLFWwindow *window, int width, int height)
  44. {
  45. glViewport(0, 0, width, height);
  46. }
  47. */
  48. void processInput(GLFWwindow* window)
  49. {
  50. //check if ESCAPE is pressed
  51. if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  52. glfwSetWindowShouldClose(window, true);
  53. }

原文链接:http://www.cnblogs.com/yiqian/p/10721191.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号