提示:以下是本篇文章正文内容,下面案例可供参考
一、opengl是什么?
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库
二、使用步骤
1.引入库
全程是按照网站:https://learnopengl-cn.github.io/来学习的嘻嘻,感谢大佬的分享。网站目前推荐使用glfw和glad(目前是,以后可能会更新)。
第一步肯定是具备一个vs2019呀。
第二步是下载glfw和glad。
1.首先glfw的下载地址:http://www.glfw.org/download.html
下载红框里面的东西
然后把解压包的incluse文件夹和lib-vc2019分别解压出来,我这边就解压到这里。
2.下载glad,下载地址:https://glad.dav1d.de/
因为glfw不支持opengl3.0以前的版本,所以我这里下载了4.6版本。
把glad.zip里面的include文件解压到glfw的incluse文件夹和lib-vc2019同一目录下。
3.用vs2019创建一个c++工程,然后右击工程选择属性,在vc++里找到包含目录和库目录,把解压出来的文件路径 输入进去
5.还有就是等在连接器里面添加 glfw3.lib
6.最后把glad.zip里的glad.c文件放到工程里面。,不然编译器就会说glad的函数无法进行外部链接
7.好到的环境搭建完毕,下面开工。
2.不说了,直接上代码
代码如下(示例):
#include<glad/glad.h> //glad的引入必须要在glfw的上面
#include<GLFW/glfw3.h>
#include<iostream>
using namespace std;
//窗口的宽度
static int width = 800;
//窗口高度
static int height = 600;
//窗口的名字
static char window_name[] = "opengl window";
void framebuffer_size_callback(GLFWwindow*,int,int);
void processInput(GLFWwindow*);
void renderOrder();
int main() {
cout << "opengl progaming start......" << "\n";
//函数库的初始化
glfwInit();
//设定opengl版本为3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//设定opengl为核心模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//苹果的系统下需要进行兼容的设置
#ifdef _apple_
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
//创建窗口对象
GLFWwindow* window = glfwCreateWindow(width, height, window_name, NULL, NULL);
if (window == NULL) {
cout << "opengl window start fail!gl progaming will terminate....." << endl;
glfwTerminate(); //终结掉gl程序
return -1;
}
//设定当前剩下文
glfwMakeContextCurrent(window);
//注册窗口大小改变回调
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//初始化gladLoader
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
//如果无法获取到glfw指针就相当于失败,并且终止掉gl程序
cout << "can`t get glfw pointer address!gl progaming will terminate....." << endl;
glfwTerminate();
return -1;
}
//执行到这里就是默认完成了所有初始化
//glfw没有执行结束的时候就一直是死循环
while (!glfwWindowShouldClose(window))
{
processInput(window);
renderOrder();
//缓冲区交互
//关于双缓存的补充:
//如果使用单缓存的渲染模式,那么游戏画面可以会出现闪烁现象,原因是图形渲染出一帧的画面时,每一个像素点不是同时渲染出来的,
//而是遵循流水线,由左往右,由上往下来进行渲染的。所以这个时候采用双缓存,当前缓存显示完,直接把后缓存的画面交换上去,则就可以避免游戏闪烁现象。
//并且使用glfeSwapBuffers()函数进行交换。
glfwSwapBuffers(window);
//执行被触发的事件
glfwPollEvents();
}
return 0;
}
/// <summary>
/// 回调函数。窗口大小改变时。
/// </summary>
void framebuffer_size_callback(GLFWwindow* window, int wid, int het) {
//这是控制视口的函数。
//前面两个参数是指视口的左下角的坐标偏移位置。(opengl的视口窗口默认左下角为原点0,0)
//后面两个参数是指视口的宽度和高度
glViewport(0, 0, wid, het);
cout << "opengl window resolution change!" << "wid:" << wid << " " << "het:" << het << endl;
}
/// <summary>
/// 输入函数
/// </summary>
void processInput(GLFWwindow* window){
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){
glfwSetWindowShouldClose(window,true);
}
}
/// <summary>
/// 渲染指令
/// </summary>
void renderOrder() {
//深绿色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
//关于glfwClear函数,这是一个清屏的函数。当前是去掉颜色缓存区
//如果传入参数GL_DETCH_BUFFER_BIT(深度缓存区)和GL_STENCIL_BUFFER_BIT(模板缓存区)就是清掉对应的缓存区
glClear(GL_COLOR_BUFFER_BIT);
}
总结
主要是搭建好环境和写了一下opengl的窗口程序。
关于选择版本方面:早期的opengl都是使用立即模式(固定渲染管线)进行渲染的。从opengl 3.2版本开始,opengl费除掉了立即模式,而改用了核心模式,并且鼓励开发者使用这个模式。大部分开发者都是选用早期的opengl版本,因为新的opengl版本基本都是在原有的基础上添加新特性,或者对同一个功能采用更好的方式实现(优化)。而新的特性很有可能需要新版本的显卡驱动提供的,为了更好兼容版本而选用早期版本的opengl。