第一章 入门
1.0 配置库
- 首先,在我们画出出色的效果之前,需创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,因此需要利用GLFW库,给我们提供一个窗口和一个OpenGL上下文用来渲染;
- 其次,OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。为避免查询繁琐的过程,需利用GLEW库。
下载GLFW:GLFW 32位版本
下载GLEW: GLEW
包含目录、库目录和库
E:\OpenGL\glfw-3.3.6.bin.WIN32\glfw-3.3.6.bin.WIN32\include
E:\OpenGL\glew-2.1.0-win32\glew-2.1.0\include
E:\OpenGL\glfw-3.3.6.bin.WIN32\glfw-3.3.6.bin.WIN32\lib-vc2015
E:\OpenGL\glew-2.1.0-win32\glew-2.1.0\lib\Release\Win32
opengl32.lib
glfw3.lib
glew32s.lib
1.1 创建窗口
- 包含头文件
#define GLEW_STATIC
#include<GL/glew.h> //glew需包含在前面
#include<GLFW/glfw3.h>
- 初始化GLFW
glfwInit();//初始化
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//使用版本号是3.3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式
- 创建窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "My_window", NULL, NULL);//创建窗口,定义窗口大小,返回指针
if (window == NULL)
{
std::cout << "open window failed" << endl;
glfwTerminate();//结束窗口
return -1;
}
glfwMakeContextCurrent(window);//使用当前window
- 初始化GLEW
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
cout << "init glew failed." << endl;
glfwTerminate();
return -1;
}
- 定义在窗口中,渲染窗口的大小
glViewport(0, 0, 800, 600);//左下角坐标,宽,高
-
定义一个渲染循环
其中交换缓冲区的目的在于,为避免图像显示时出现闪烁,通常使用双缓冲区,前缓冲区用于显示最终的效果,后缓冲区用于绘制渲染指令,渲染指令完成后则交换缓冲区。
while (!glfwWindowShouldClose(window))//检查是否要求窗口退出
{
glfwSwapBuffers(window);//交换缓冲区
glfwPollEvents();//检查是否有触发某些事件,例如鼠标移动,按下等,调用回调函数
}
- glfwpollevents用于检查输入时间,需要写一个函数来相应它。由于检查输入需要时间,因此一般写在循环的后面,而在下一个循环前部来执行响应函数。
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, true);

本文介绍了OpenGL编程的基础,包括使用GLFW创建窗口和OpenGL上下文,GLEW管理函数位置,以及渲染循环的工作原理。详细讲解了顶点数据、VBO、VAO、顶点着色器和片段着色器的应用,以及如何通过EBO优化绘制过程。同时,提到了图形渲染管线的工作方式,阐述了从3D坐标到2D像素的转换过程。
最低0.47元/天 解锁文章
1425

被折叠的 条评论
为什么被折叠?



