openGL学习笔记_配置开发环境&第一个窗口
https://learnopengl-cn.github.io/openGL学习网站开发语言 C++https://www.khronos.org/registry/OpenGL/index_gl.phpopenGL APIhttps://www.glfw.org/download.html 一个opengl库 集成一些方法 GLFWhttps://cmake.org/download/cmak
·
https://learnopengl-cn.github.io/ openGL学习网站
开发语言 C++
https://www.glfw.org/download.html 一个opengl库 集成一些方法 GLFW
https://cmake.org/download/ cmake工具 编译 GLFW的工具
VS2017 没有安装 c++ 相关库 需要升级
依赖库
GLFW
glfw库 把include和生成的lib文件放到一个文件夹内让vs 项目引用
GLAD
和上面的库差不多,不过只需要一个在线的编译平台生成出几个文件导入到include文件夹内就行
下一步有些问题 需要学习下C++基本知识了
看下基础知识就行,后面就要多敲敲代码
_gladLoadGLLoader 编译失败问题
在窗口章节的时候会有一个这个报错,可能是版本问题,需要把glad源文件src/glad.c 添加到项目内引用
关键字
维度
(Dimension)
视网膜(Retina)
渲染循环
(Render Loop)
双缓冲(Double Buffer)
交换(Swap)
渲染(Rendering)
渲染循环(Render Loop)
个人理解,程序是面向过程的,想看到画面必须一直保持程序一直执行,所以必须要有个循环体不停的执行渲染指令保证画面,类似unity渲染主线程
双缓冲(Double Buffer)
应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。
//如果窗口大小改变 回调函数
void framebuffer_size_callback(
GLFWwindow*
window,
int
width,
int
height);
void processInput(
GLFWwindow*
window);
int main()
{
glfwInit();
//初始化 glfw
glfwWindowHint(
GLFW_CONTEXT_VERSION_MAJOR,3);
//确定使用的版本号 major minor
glfwWindowHint(
GLFW_CONTEXT_VERSION_MINOR,3);
glfwWindowHint(
GLFW_OPENGL_PROFILE,
GLFW_OPENGL_CORE_PROFILE);
//确定使用的核心模式 core-profile
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT); MAC平台使用的版本号
GLFWwindow* window = glfwCreateWindow(800,600,
"learnOpenGL",
NULL,
NULL);
//生成一个窗口对象
if (window ==
NULL)
{
std::cout
<<
"Failed to create GLFW windows"
<< std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//设置当前主窗口对象
if (!gladLoadGLLoader((
GLADloadproc)glfwGetProcAddress))
//初始化 GLAD
{
std::cout
<<
"Failed to initialize GLAD"
<< std::endl;
return -1;
}
//glViewport(1,1,10,10);//告诉opengl 窗口的位置和大小 前俩参数是左下角 位置 后俩就是窗口宽高
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);
//注册窗口大小改变回调事件
//做一个渲染循环,保证程序不直接退出 Renderer Loop
while (!glfwWindowShouldClose(window))
//每次循环检查下 GLFW是否需求要推出 返回True就会跳出循环 程序结束
{
processInput(window);
//每次循环检查下输入
glfwSwapBuffers(window);
//GLFW的渲染函数 储存窗口的每个像素 输出到屏幕上
glfwPollEvents();
//检查函数有没有触发什么事件 键盘输入 鼠标点击等
}
glfwTerminate();
//如果退出程序 清理下glfw的资源
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)
//是否按下 ESC建
{
glfwSetWindowShouldClose(
window,
true);
//执行关闭窗口
}
if (glfwGetKey(
window,
GLFW_KEY_1)==
GLFW_PRESS)
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(
GL_COLOR_BUFFER_BIT);
}
if (glfwGetKey(
window,
GLFW_KEY_2) ==
GLFW_PRESS)
{
glClearColor(0.4f, 0.6f, 0.1f, 1.0f);
glClear(
GL_COLOR_BUFFER_BIT);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)