• OpenGL学习 (一)


    一、OpenGL 简介

    OpenGL 本质:

    OpenGL(Open Graphics Library),通常可以认为是API,其包含了一系列可以操作图形、图像的函数。但深究下来,它是由Khronos组织制定并维护的规范,即规定了每个函数该如何执行,以及它们的输出值。根据该OpenGL的规范,开发者可编写各类扩展库


    OpenGL 发展:

    • 立即渲染模式:Immediate mode,也就是固定渲染管线,是OpenGL早期的使用渲染模式
      • 优点:对多数细节做了抽象处理,方便调用和理解
      • 缺点:不利于开发者完全操控,且效率低下
    • 核心模式:Core-profile,从OpenGL3.2起替代立即渲染模式的开发方式,迫使开发者使用现代方法进行开发
      • 优点:更高的灵活性和效率,便于开发者深入理解图像编程
      • 缺点:学习难度加大

    OpenGL 库:

    OpenGL库的作用在于给我们提供了各类方法,OpenGL自身库包含:gl核心库、glu实用库、glut实用工具库(这几个库的介绍:OpenGL库中gl、glu、glut、glaux的关系 - 极客小生

    此外,OpenGL的一大特性就是扩展,主要体现在显卡公司所提出的新特性可以以驱动的方法实现,开发者可以在支持这个扩展的显卡上、使用这个扩展提供的一些更先进更有效的图形功能

    常见到的库有:GLFW库和、GLEW库、GLAD库:

    • GLFW:一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入
    • GLEW:OpenGL扩展库(OpenGL Extension Wrangler Library),用于帮助C/C++开发者初始化OpenGL扩展功能,并书写可移植的应用程序
    • GLAD:目前较为流行的库。使用了在线服务,编程时可以告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数

    二、OpenGL 开发环境配置

    推荐佳作:

    三、OpenGL 绘制简单窗口

    流程简介:

    1. 引用glfw、glew库
    2. 实例化GLFW窗口
    3. 创建、设置GLFWWindow窗口对象
    4. 设置窗口属性(坐标、宽高)
    5. 实现渲染循环
    6. 结束渲染
    #include<GL/glew.h>
    #include<GLFW/glfw3.h>
    #include<iostream>
    using namespace std;
    
    void processInput(GLFWwindow *window);
    
    int main()
    {
    	//1. 实例化GLFW窗口:
    	//1.1 初始化GLFW库
    	glfwInit();
    
    	//1.2 设置GLFW使用的OpenGL版本是3.3 :主版本号(Major)和次版本号(Minor)
    	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    
    	//1.3 GLFW使用的是核心模式(Core-profile)
    	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    
    
    
    	//2. 创建窗口对象:
    	GLFWwindow* window = glfwCreateWindow(800, 600, "SouthBegonia's Window", NULL, NULL);
    	//2.1 检验是否创建成功
    	if (window == NULL)
    	{
    		//创建失败则终止GLFW
    		cout << "open window failed." << endl;
    		glfwTerminate();
    		return -1;
    	}
    	//2.2 设置当前OpenGL上下文
    	//    设置参数window中的窗口所关联的OpenGL环境为当前环境,
    	//    这个环境在当前线程中会一直保持为当前环境,直到另一个环境被设置为当前环境,或者窗口被删除为止
    	glfwMakeContextCurrent(window);
    
    
    	//3. 设置窗口属性:起始坐标x,y(左下角开始),宽高像素
    	glViewport(0, 0, 800, 600);
    
    
    	//4. 实现渲染循环:
    	//   若window窗口未关闭,则进行操作
    	while (!glfwWindowShouldClose(window))
    	{
    		//4.1 设置窗口颜色/清空颜色缓存
    		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    		glClear(GL_COLOR_BUFFER_BIT);
    
    		//4.2 自定义的输入监测
    		processInput(window);
    
    		//4.3 交换颜色缓冲函数
    		//	  实现原理是双缓冲:前buffer存储当前画面信息,后buffer存储下一画面的信息
    		glfwSwapBuffers(window);
    
    		//4.4 检查有无触发事件函数
    		//	  比如键盘输入、鼠标移动等、更新窗口状态,并调用对应的回调函数
    		glfwPollEvents();
    	}
    
    	//5. 渲染结束
    	//	 释放/删除之前的分配的所有资源
    	glfwTerminate();
    
    	return 0;
    }
    
    //输入事件监测函数
    void processInput(GLFWwindow *window)
    {
    	//按下ESC键,变更窗口显示状态
    	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
    		glfwSetWindowShouldClose(window, true);
    }
    

    四、参考

  • 相关阅读:
    Task.Delay() 和 Thread.Sleep() 区别
    task 如何终止线程
    旧版委托线程回忆
    c# 线程的优先级
    Java——Java泛型
    Java——Java面向对象
    Java——Java连接Jira,创建、修改、删除工单信息
    软件——Jira是什么
    Java——一文读懂Spring MVC执行流程
    Java——SSM整合所需的Maven配置文件
  • 原文地址:https://www.cnblogs.com/SouthBegonia/p/11938401.html
Copyright © 2020-2023  润新知