首页 > 其他分享 >01 入门

01 入门

时间:2023-05-03 17:14:55浏览次数:56  
标签:01 头文件 入门 OpenGL WINDOW 文件夹 GL GLAD

一、OpenGL

1. 核心模式与立即渲染模式

  • 早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),OpenGL的大多数功能都被库隐藏起来。
  • 从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发。

2. 扩展Extension

当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否支持此扩展。

if(GL_ARB_extension_name)
{
    // 使用硬件支持的全新的现代特性
}
else
{
    // 不支持此扩展: 用旧的方式去做
}

3. 状态机

  • OpenGL的状态通常被称为OpenGL上下文(Context)
  • 状态设置函数(State-changing Function),这类函数将会改变上下文。以及状态使用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作

4. 对象

  • 可以看作C风格结构体
struct object_name {
    float  option1;
    int    option2;
    char[] name;
};
  • 一个例子
// OpenGL的状态
struct OpenGL_Context {
    ...
    object* object_Window_Target;
    ...     
};
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
  • 好处在于,可以定义多个对象,有选择地绑定,不需要重复设置选项。

二、创建窗口

  • 首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。

1. GLFW

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入。

2. CMAKE

  • CMake需要一个源代码目录和一个存放编译结果的目标文件目录。源代码目录我们选择GLFW的源代码的根目录,然后我们新建一个 build 文件夹,选中作为目标目录。
  • 在设置完源代码目录和目标目录之后,点击Configure(设置)按钮,让CMake读取设置和源代码。
  • 选择工程的生成器
  • CMake会显示可选的编译选项用来配置最终生成的库。这里我们使用默认设置,并再次点击Configure(设置)按钮保存设置。
  • 保存之后,点击Generate(生成)按钮,生成的工程文件会在你的build文件夹中。

3. 编译

  • 在build文件夹里可以找到GLFW.sln文件,用Visual Studio 2019打开。因为CMake已经配置好了项目,并按照默认配置将其编译为64位的库,所以我们直接点击Build Solution(生成解决方案)按钮,然后在build/src/Debug文件夹内就会出现我们编译出的库文件glfw3.lib。
  • 建立一个新的目录里面包含Libs和Include文件夹,包含所有的第三方库文件和头文件,并且在你的IDE或编译器中指定这些文件夹。

4. 链接

  • 添加incluce目录与lib目录:VC++ Direction->Library Directions or Include Directions

  • 链接lib文件,Linker->Additional Depedences;除了glfw3.lib之外,还有opengl32.lib。
  • 添加头文件
#include <GLFE\glfw3.h>

5. GLAD

  • 因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
  • GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。
  • 打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能用)。之后将模式(Profile)设置为Core,并且保证选中了生成加载器(Generate a loader)选项。现在可以先(暂时)忽略扩展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。
  • GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的Include文件夹中(或者增加一个额外的项目指向这些目录),并添加glad.c文件到你的工程中。
  • 包含头文件
#include <glad/glad.h>

3. 你好,窗口

  • 请确认是在包含GLFW的头文件之前包含了GLAD的头文件。GLAD的头文件包含了正确的OpenGL头文件(例如GL/gl.h),所以需要在其它依赖于OpenGL的头文件之前包含GLAD。
#include <glad/glad.h>
#include <GLFW/glfw3.h>

标签:01,头文件,入门,OpenGL,WINDOW,文件夹,GL,GLAD
From: https://www.cnblogs.com/etherovo/p/17369154.html

相关文章

  • 交个朋友HttpRunnerV4.x 01-初次见面
     背景:Pytest是纯接口的自动化框架。而HttpRunner一款开源测试平台,可以实现接口测试/压力测试DevOps/数字体验监测。那交个新朋友HttpRunner学习下。 米哈游-平台部、有米科技-测试与工程质量保障部、通用环球医疗-环球健康等客户案例在使用HttpRunner框架。 为什么......
  • three.js 入门学习(一)
    webGl和three.jshttp://webgl3d.cn/pages/aac9ab/图形学算法Web3DWebGPU下载yarnaddthree@types/three使用import*asTHREEfrom'three';onstscene=newTHREE.Scene();仅导入你所需要的部分import{Scene}from'three';一个初始化的demo场景、相机......
  • 【2023 · CANN训练营第一季】昇腾AI入门Pytorch
    昇腾AI全栈架构华为AI全栈全场景解决方案为4层,分别为芯片层、芯片使能层、AI框架层和应用使能层。芯片基于统一、可扩展架构的系列化AIIP和芯片,为上层加速提供硬件基础。芯片产品:昇腾310和昇腾910的独立芯片,Nano-Tiny-Lite的非独立芯片。Ascend层,一切集成电路的核心,主要作用......
  • [蓝桥杯 2017 国 C] 合根植物 题解
    题目传送门一道并查集模板题。没什么好说的,先给个并查集模板,神犇可以直接跳过。查找根:intfind_root(intn){if(fa[n]==n)returnn;returnfa[n]=find_root(fa[n]);}合并:voidmerge(intx,inty){intsx=find_root(x),sy=find_root(y);......
  • 全国信息学奥林匹克联赛(NOIP2011)复赛提高组day2
    一、计算系数首先对题目多项式进行简化分析(x+y)2=x2+2xy+y2(x+y)3=x3+3x2y+3xy2+y2(x+y)4=x4+4x3y+6x2y2+4xy3+y4不难发现它们的系数组成了一个杨辉三角111121133114641……进一步带入则可得(ax+by)2=a2x2+2abxy+b2y2(ax+by)3=a3x3+3a2bx2y+3ab2xy2+b3y3......
  • kissat分析02_主要功能函数01_propagate
    传播函数分布在propsearch.h、propsearch.c和proplit.c文件之中 propsearch.h #ifndef_propsearch_h_INCLUDED#define_propsearch_h_INCLUDEDstructkissat;structclause;structclause*kissat_search_propagate(structkissat*);#endif   ......
  • kissat分析01_基本数据结构02_solver
    solver在internal.h中定义下面从使用的角度来了解solver个主要数据成员 assign.c中几个函数 staticinlinevoidkissat_assign(kissat*solver,#ifdefINLINE_ASSIGNvalue*values,assigned*assigned,#endifunsignedlit,......
  • P4211 [LNOI2014]LCA
    \(\color{purple}\text{P4211[LNOI2014]LCA}\)解题方法可以发现一个结论:两个点到根节点的重合路径的长度即为他们\(LCA\)的深度。所以我们把\([l,r]\)之间的点到根节点路径上各加一,再查询\(z\)到根节点的路径的值之和即为\(\sum_{i=l}^{r}\text{dep}[\text{LCA}(i,z)]\)......
  • STAT3010统计方法
    STAT3010/6075StatisticalMethodsinInsuranceAssignment2 Thisassignmentisworth10%oftheoverallmarkforSTAT3010/6075. Thedeadlineforsubmissionis16.00onThursday4May2023. StandardUniversitypoliciesandprocedureswillbefollowedforla......
  • XXL-JOB 入门学习
    参考教程主要参考了xxl-job快速入门指南,写的很详细,可以一步步按教程的走。项目环境搭建下载项目先到xxl-jobGitHub地址下载RELEASE的ZIP包。解压后,到MySQL执行doc目录下的db文件。视图页面打开xxl-job-admin模块。然后修改application.properties配置的......