OpenGL学习笔记_01

文章只作学习使用,大部分内容来自LearnOpenGL CNOpenGL - LearnOpenGL CN (learnopengl-cn.github.io)https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/

其中个人理解均为此颜色

目录

OpenGL是什么

核心模式与立即渲染模式

扩展

状态机 

对象


OpenGL是什么

OpenGL一般被‘认为是一个API(Application Programming Interface,应用程序编程接口),包含了一系列可以操作图形,图像的函数。但是实际上它是一个由Khronos制定并维护的规范。

OpenGL规范规定了每个函数该如何执行,以及它们的输出值。但是OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配。所以函数的内部可以由编写OpenGL库的人自行决定。实际的OpenGL库的编写者通常是显卡的生产商。

所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。

核心模式与立即渲染模式

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线)。

//在固定渲染管线里面画一个三角形
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_TRANGLES);
    glVertex2f(-0.5f,-0.5f);
    glVertex2f( 0.0f, 0.5f);
    glVertex2f( 0.5f,-0.5f);
glEnd();

虽然在这个模式下画图很方便,但是由于开发者希望能有更多的灵活性,所以立即渲染模式逐渐被废弃,开发者们被鼓励到OpenGL的核心模式(Core-profile)下进行开发。

当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。现代函数要求使用者真正理解OpenGL和图形编程,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。

扩展

OpenGL的一大特性就是支持扩展(Extension),当显卡公司提出新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了

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

状态机 

OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻该如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通过设置选项,操作缓冲来更改OpenGL的状态。最后我们根据OpenGL上下文来渲染。

OpenGL内大致有两种函数:

状态设置函数(State-changing Function):改变上下文。

状态使用函数(State-using Function):根据当前OpenGL的状态执行一些操作。

对象

OpenGL库是用C语言写的,C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发时引入了一些抽象层,例如“*对象(object)”

在OpenGL中一个对象是指一些选项的集合,代表了OpenGL状态的一个子集,可以把对象看做一个C风格的结构体。 

*对象就是一块缓冲区,缓冲区里储存了我们对OpenGL状态的更改。

//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时常见的工作流。我们首先创建了一个对象,然后用一个id保存了它的引用。*然后我们将对象绑定在了上下文的目标位置上,现在我们对这个目标的操作,都会保存在objectId所引用的对象内部。最后我们将目标位置的对象id设回0,解绑这个对象。一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

*因为OpenGL的状态是由多个变量控制的,我们的对象不能一下子操作所有的变量,但是可以指定某些变量给他操作,我们给他的变量就是所谓的目标位置

使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值