前言
本文都是参考https://learnopengl.com/#!Getting-started/Hello-Triangle
中文翻译网址:https://learnopengl-cn.github.io/
代码也是来自该网站,主要添加一些注释以及个人的一些理解。
名词术语
opengl的窗口值问题
利用glfw设置窗口的时候设置的实际的像素值glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL)
但是OpenGL的窗口值是从-1到1的显示。而(0,0)
点就是窗口的中心。
双缓存
当程序仅仅使用一个缓存的时候,由于物理屏幕以固定的帧率从上到下,从左到右进行刷新屏幕,刷新操作是瞬时的,那么在第二帧刷新之前就可能存在伪像。所以我们采用的双缓冲,所有的渲染都发生在后台缓冲,它位于内存区域,当所有的渲染完成的时候,将他交换到前台,将前台的缓冲交换到后台
代码分析
代码下载
http://download.csdn.net/detail/zhouyelihua/9882947
代码分析
#include<iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)//这个是窗口变化的回调函数。。注意输入参数
//是一个glfw的窗口,一个宽度和高度
{
glViewport(0, 0, width, height);//这个是回调函数内的内容
//这里是将视口改成变化后的的窗口大小
//注意需要的注册该回调函数
//glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//两个参数是,glfw的窗口以及回调函数
}
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//获取按键,如果等于esc
glfwSetWindowShouldClose(window, true);//利用强制窗口应该关闭
}
int main()
{
glfwInit();//类似于之前的gluinit一般采用库都需要进行初始化
//版本号是opengl4.5
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);//设置主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);//设置次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//在mac系统上需要设置该语句
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);//后面两个参数是设置显示屏和共享的,
//一般库函数的相关定义,
//可以配置好以后直接查看都有详细的定义
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//在调用opengl函数之前初始化glad,
//glad的作用就是快速的将opengl函数映射到相关的显卡函数上
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glViewport(0, 0, 800, 600);//设置视口大小
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//注册函数,该函数还可以注册其他相关硬件的回调函数
//
//渲染流程
while (!glfwWindowShouldClose(window))//检测glfw窗口是否被指令要求关闭,如果是的话,则会退出循环
{
//输入的相关操作
processInput(window);//
// 渲染的相关操作
glClearColor(1.0f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//查看所有的事件,并且交换内存
glfwSwapBuffers(window);//交换颜色缓存,即glfw窗口内的内容。。。注意glfw开头的交换和后面gl开头的区别
glfwPollEvents();//检测是否有其他的触发时间,例如上述的窗口大小变化,需要调用相关的回调函数
}
glfwTerminate();//清除退出
return 0;
}
如果您觉得此博客对您有用,欢迎对我进行小额赞助。
不筹钱娶媳妇的程序员不是好程序员!