opengl基础学习(2)

目前的工程放置在github上Link

启动项目

空的项目里,我们需要在main.cpp加上自己的逻辑

// 创建一个程序实例
ApplicationStart* application = new ApplicationStart();
int result = application->Start();
return result;

在这里,ApplicationStart是我们以后要使用的所有的Opengl课程的的启动文件;

在前面一节文章里,我们已经知道,为了能更好地使用opengl,我们接入了GLFW 那么我们修改一下ApplicationStart::Start的方法

// 启动
int ApplicationStart::Start()
{
	initGLFW();
	return 0;
}
// 初始化GLFW
void ApplicationStart::initGLFW() {
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#if MAC_OS
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
}

更加详细的GLFW文档在这里

glfwInit调用函数来初始化GLFW
glfwWindowHint配置GLFW;函数的第一个参数代表选项的名称,第二个参数接受一个整型,用来设置这个选项的值。在这里,先声明GLFW对应的Opengl core的大小版本(GLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINORGLFW_OPENGL_PROFILE是开启opengl 的profile,但是在opengl es中会被忽略,如果opengl 的版本低于3.2,其值必须是GLFW_OPENGL_ANY_PROFILE
GLFW_OPENGL_FORWARD_COMPAT是否向前兼容,不建议开启,在opengl es中同样会被忽略

在初始化完成GLFW后,我们正式创建一个视图窗口看看;在initGLFW();下添加一个drawWindow();然后我们尝试在drawWindow()方法里绘制一个窗口

GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);

绘制第一个window,GLFW提供了glfwCreateWindow于创建Window,glfwDestroyWindow或者glfwTerminate来销毁window
如果glfwCreateWindow创建失败的话,则会返回一个Null;该函数有5个参数,前面两个分别代表着window的长宽,第三个代表window的标题,如果需要处理全屏窗口可以传个monitor进去,目前本文不考虑这个,所以第四第五个直接使用Null。

glfwMakeContextCurrent将窗口的上下文设置为当前线程的主上下文,如果想在其他线程上使用该上下文,就必须将其从旧的线程中释放出来;目前本文只考虑当线程,所以现阶段不考虑,只需要绑定就行。

由于本文是通过GLAD来管理opengl的函数指针的,所以在设定上下文后,我们需要初始化GLAD,(必须是绑定完上下文后,否则报错)

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    return -1;
}

这个时候,我们的工程已经可以启动了,但是窗口却一闪而过;因为main在执行完drawWindow后,就退出了,故需要添加等待用户主动关闭窗口循环;

while (!glfwWindowShouldClose(window))
{
}
// 销毁窗口
glfwTerminate();

jpg

此时,我们终于能看到一个黑乎乎的窗口了!

下一章会讲简单的三角形绘制!