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);
       }
}
 
 
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐