OpenGL学习003-创建窗口

     通过OpenGL学习001-GLFW环境搭建OpenGL学习002-配置GLAD的学习,已经为构建GLFW窗口做好了准备,现在开始第一个窗口的创建。

     1. 创建工程

       

ubuntu@ubuntu-VirtualBox:~/Git/OpenGL-Study$ tree
.
├── CMakeLists.txt                #CMakeList文件,用于工程构建
├── include                       #工程自身的头文件
│   └── FirstWindow.h      
├── main.cpp                      #工程的主程序文件
├── README.md                     #工程的说明文件  
├── src
│   └── FirstWindow.cpp           #工程的源文件
└── thirdparty                    #工程用到的第三方头文件、类库 
    ├── glad
    │   ├── include
    │   │   └── glad.h
    │   └── src
    │       └── glad.c
    ├── glfw
    │   ├── include
    │   │   └── GLFW
    │   │       ├── glfw3.h
    │   │       └── glfw3native.h
    │   └── lib
    │       └── libglfw3.a
    └── khr
        └── include
            └── KHR
                └── khrplatform.h

   创建如上图所示的工程。

2. 创建文件

        在include目录下创建头文件FirstWindow.h  ,内容如下:

      

/**
 * 软件功能:
 * 软件版本: V1.0.0
 * 实现时间: 2021-10-29 10:49
 * 软件作者:
 */

#ifndef OPENGL_FIRSTWINDOW_H
#define OPENGL_FIRSTWINDOW_H

#include "glad/glad.h"
#include "GLFW/glfw3.h"
#include "FirstWindow.h"

/**
 * view回调函数, 随window的变化而变化
 * @param window
 * @param width
 * @param height
 */
void framebuffer_size_callback(GLFWwindow *window, int width, int height);

/**
 * 处理键盘事件
 * @param window
 */
void processInput(GLFWwindow *window);

/**
 * 绘制第一个窗口
 * @return
 */
int drawFirstWindow(char *windowName = (char *) "OpenGL Study");


#endif //OPENGL_FIRSTWINDOW_H

  在src目录下创建源文件FirstWindow.cpp, 内容如下:

   

/**
 * 软件功能:
 * 软件版本: V1.0.0
 * 实现时间: 2021-10-29 10:49
 * 软件作者:
 */

#include <iostream>
#include "FirstWindow.h"

/**
 * view回调函数, 随window的变化而变化
 * @param window
 * @param width
 * @param height
 */
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
  std::cout << "调整位置: " << "width = " << width << "  height = " << height << std::endl;
  glViewport(0, 0, width, height);
}

/**
 * 处理键盘事件
 * @param window
 */
void processInput(GLFWwindow *window) {
  if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
    std::cout << "按键esc按下" << std::endl;
    glfwSetWindowShouldClose(window, true);
  }
  if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
    std::cout << "A 键被按下" << std::endl;
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
  }
}

/**
 * 绘制第一个窗口
 * @return
 */
int drawFirstWindow(char *windowName) {
  //初始化glfw
  glfwInit();
  //配置glfw 告知glfw使用的是3.3版本
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  //使用glfw的核心模式
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  //MAC系统下
  //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

  //创建glfw窗口  该窗口存放所有与窗口相关的数据
  GLFWwindow *window = glfwCreateWindow(800, 600, windowName, NULL, NULL);
  if (window == NULL) {
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
  }
  glfwMakeContextCurrent(window);
  //初始化glad, glad用来管理操纵glfw的函数指针
  if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;

  }
  glViewport(0, 0, 200, 200);
  //注册回调函数
  glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

  //渲染循环, 在窗口未接到关闭事件时,glfw一直保持运行
  while (!glfwWindowShouldClose(window)) {
    //注册键盘事件处理
    processInput(window);
    //颜色缓冲交换 该缓冲存储glfw窗口上每个像素值, 像素值用于在窗口上绘制并输出
    glfwSwapBuffers(window);
    //获取窗口上的事件(鼠标、键盘事件, 窗口变更事件)
    glfwPollEvents();
  }
  //渲染结束,释放资源
  glfwTerminate();
  return 0;
}

在主程序文件main.cpp中调用 FirstWindow

#include "FirstWindow.h"
#include <iostream>

int main() {
//    std::cout << "Hello, World!" << std::endl;
// 绘制第一个窗口
  drawFirstWindow((char *) "China");
  return 0;

}

3 编辑CMakeList

#cmake最低依赖版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
#项目名称
PROJECT(OpenGL)

#指定C++版本
SET(CMAKE_CXX_STANDARD 14)

#将引用的第三方的头文件目录添加至编译器的头文件搜索路径中,指定的目录被解释成当前源码路径的相对路径
INCLUDE_DIRECTORIES(./thirdparty/glfw/include)
INCLUDE_DIRECTORIES(./thirdparty/glad/include)
INCLUDE_DIRECTORIES(./thirdparty/khr/include)

#将项目自身的头文件目录添加至编译器的头文件搜索路径中,指定的目录被解释成当前源码路径的相对路径。
INCLUDE_DIRECTORIES(./include)

#添加需要链接的库文件目录
LINK_DIRECTORIES(./thirdparty/glfw/lib)
LINK_DIRECTORIES(/usr/lib/X11)

#消息打印
MESSAGE("====compile system type========" ${CMAKE_SYSTEM_NAME})
if (UNIX)
    FIND_PACKAGE(X11 REQUIRED)
    MESSAGE("x11******************************" ${X11_X11_INCLUDE_PATH})
    FIND_PACKAGE(PkgConfig REQUIRED)
endIf ()

SET(CMAKE_CXX_FLAGS "-g -Wall")

SET(SRC_FILES
        main.cpp
        thirdparty/glad/src/glad.c
        src/FirstWindow.cpp
    )


#指定生成目标文件
ADD_EXECUTABLE(OpenGL main.cpp ${SRC_FILES})

#添加链接库 静态库&动态库
TARGET_LINK_LIBRARIES(${PROJECT_NAME}  libglfw3.a dl pthread X11)

4. 构建

       

ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL$ pwd
/home/ubuntu/C_ENV/OpenGL
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL$ mkdir build
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL$ cd build/
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ cmake ..
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ make -j2

  此时在当前构建目录下可以看到可执行文件 OpenGL

ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ ll
total 540
drwxrwxr-x 3 ubuntu ubuntu   4096 10月 29 12:30 ./
drwxrwxr-x 8 ubuntu ubuntu   4096 10月 29 12:30 ../
-rw-rw-r-- 1 ubuntu ubuntu  24256 10月 29 12:30 CMakeCache.txt
drwxrwxr-x 5 ubuntu ubuntu   4096 10月 29 12:30 CMakeFiles/
-rw-rw-r-- 1 ubuntu ubuntu   1502 10月 29 12:30 cmake_install.cmake
-rw-rw-r-- 1 ubuntu ubuntu   6594 10月 29 12:30 Makefile
-rwxrwxr-x 1 ubuntu ubuntu 502824 10月 29 12:30 OpenGL*              #可执行文件

5 运行

     

ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ ./OpenGL

可以看到窗口

按A键可以看到窗口变色

 

按ESC键,程序退出

至此,使用GLFW创建窗口的流程便结束了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值