OpenGL- 从创建窗口开始

创建窗口

前言

下面的点。描述了创建窗口的重要性和一些理解

  • 所有系统的app开发都是从创建窗口开始的
  • 窗口是一个底层的抽象概念
  • 这一节对理解各系统的渲染机制比较关键。因为对android较为了解,故常用android举例,
  • android创建window也会用到opengl的api
  • 从这一点出发可以做很多兼容性/跨平台的顶层描述语言(DSL),比如compose mult,Filament。
  • opengl创建窗口也一样,不同的系统,有不同的创建方式。GLFW帮我们做了这个适配逻辑

那么我们先看GLFW

GLFW github.com/glfw/glfw

编译是熟悉的过程,这部分我就不介绍了,万事开头难,请认真对待哦。

下面是创建窗口的几个关键点

  • width, height
  • viewport
  • 考虑了一些兼容性问题

核心代码如下:

// 初始化库
glfwInit();
// 一些兼容性代码
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// 创建窗口
GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 创建视口
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
// 初始化库
glfwInit();
// 一些兼容性代码
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// 创建窗口
GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr) {
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);

// 创建视口
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
// 初始化库 glfwInit(); // 一些兼容性代码 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 创建窗口 GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr); if (window == nullptr) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 创建视口 int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height);
  • 800 , 600是显示器的分辨率
  • glfwMakeContextCurrent 设置上下文
  • viewport,可理解为视口,就是真正使用opengl绘制的区域

结果如下:
image.png

? 思考:为啥需要window → viewport 这两层?

这两层的关系类型于android中的window → surface

Filament是如何做到兼容github.com/google/fila…

Filament是一个实时的基于物理的渲染引擎,适用于Android, iOS, Linux, macOS, Windows和WebGL。

  • 顶层DSL语言(如JAVA,SWIFT等)创建 nativewindow, 下发到底层的,创建一个缓冲层(swapChain)处理双缓冲问题。后续opengl 绘制都忘swapChain insert buffer

Untitled 1.png

  • 下图可以看到swapchain有很多实现。后续所有的调用和渲染是独立的,使用filament api的调用,都会走到filament渲染引擎

Untitled.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYuayNtq' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片