实际这个阶段仍然未多涉及opengl的内容,主要是搭建显示环境和构建环境的方式,现在使用的库有很多中,在看过几个视频后大致就包括了glfw和freeglut最为常见。
glfw的简单窗口构建:
#include<glad/glad.h>
#include<GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
int main()
{
//初始化
glfwInit();
//设置主次opengl版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//创建窗口对象
GLFWwindow* window = glfwCreateWindow(800, 600, "learnopengl", NULL, NULL);
if (window==NULL)
{
std::cout << "创建一个glfw窗口出错" << std::endl;
glfwTerminate();//关闭窗口线程
return -1;
}
//设置窗口为当前窗口
glfwMakeContextCurrent(window);
//初始化glad
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "初始化glad出错" << std::endl;
return -1;
}
//设置窗口大小
glViewport(0, 0, 800, 600);
//设置窗口大小变化触发事件
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//设置渲染循环
while (!glfwWindowShouldClose(window))
{
//设置按键触发
processInput(window);
/*
渲染指令
*/
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//状态设置函数 glClear函数则是状态使用函数,他使用了当前状态来获取应该清除为的颜色
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
//清除资源
glfwTerminate();
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window,GLFW_KEY_ESCAPE)==GLFW_PRESS)
{
glfwSetWindowShouldClose(window, true);
}
}
freeglut的简单窗口构建:
#include <iostream>
#include "../../include/freeglut3.4.0/include/freeglut.h"
static void RenderSceneCB()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);//使用背景颜色状态的值刷屏
glutSwapBuffers();//交换front和back的缓冲区
}
int main(int argc,char** argv)
{
//std::cout << "Hello World!\n";
glutInit(&argc, argv);
//配置glut选项
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
//设置窗口的基本参数
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutoriali 01");
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glutDisplayFunc(RenderSceneCB);//每一帧调用
glutMainLoop();
}