搜故事网,网罗全网精彩故事大全。找好故事就来搜故事网!

现代OpenGL教程 01

时间:2020-06-12 17:12:02

相关推荐

= vec41.0, 1.0, 1.0, 1.0;将输出变量设为白色。vec41.0, 1.0, 1.0, 1.0是创建一个RGBA颜色,并且红绿蓝和alpha都设为最大 ,即白色。

现在,就能用shader在OpenGL中绘制出了纯白色。在之后的文章中,我们还会加入不同颜色和贴图。贴图就是你3D模型上的图像。

编译和链接Shaders在C 中,你需要对你的.cpp文件进行编译,然后链接到一起组成最终的程序。OpenGL的shaders也是这么回事。

在这篇文章中用到了两个可复用的类,是用来处理shaders的编译和链接:tdogl::Shader和tdogl::Program。这两个类代码不多,并且有详细的注释,我建议你阅读源码并且去链接OpenGL是如何工作的。

什么是VBO和VAO?当shaders运行在GPU,其它代码运行在CPU时,你需要有种方式将数据从CPU传给GPU。在本文中,我们传送了一个三角的三个顶点数据,但在更大的工程中3D模型会有成千上万个顶点,颜色,贴图坐标和其它东西。

这就是我们为什么需要Vertex Buffer Objects VBOs和Vertex Array Objects VAOs。VBO和VAO用来将C 程序的数据传给shaders来渲染。

在旧版本的OpenGL中,是通过glVertex,glTexCoord和glNormal函数把每帧数据发送给GPU的。在现代OpenGL中,所有数据必须通过VBO在渲染之前发送给显卡。当你需要渲染某些数据时,通过设置VAO来描述该获取哪些VBO数据推送给shader变量。

Vertex Buffer Objects VBOs第一步我们需要从内存里上传三角形的三个顶点到显存中。这就是VBO该干的事。VBO其实就是显存的“缓冲区(buffers)” 一串包含各种二进制数据的字节区域。你能上传3D坐标,颜色,甚至是你喜欢的音乐和诗歌。VBO不关心这些数据是啥,因为它只是对内存进行复制。

Vertex Array Objects VAOs第二步我们要用VBO的数据在shaders中渲染三角形。请记住VBO只是一块数据,它不清楚这些数据的类型。而告诉OpenGL这缓冲区里是啥类型数据,这事就归VAO管。

VAO对VBO和shader变量进行了连接。它描述了VBO所包含的数据类型,还有该传递数据给哪个shader变量。在OpenGL所有不准确的技术名词中,“Vertex Array Object”是最烂的一个,因为它根本没有解释VAO该干的事。

你回头看下本文的vertex shader(在文章的前面),你就能发现我们只有一个输入变量vert。在本文中,我们用VAO来说明“hi,OpenGL,这里的VBO有3D顶点,我想要你在vertex shader时,发三个顶点数据给vert变量。”

在后续的文章中,我们会用VAO来说“hi,OpenGL,这里的VBO有3D顶点,颜色,贴图坐标,我想要你在shader时,发顶点数据给vert变量,发颜色数据给vertColor变量,发贴图坐标给vertTexCoord变量。”

给使用上个OpenGL版本的用户的提醒

假如你在旧版本的OpenGL中使用了VBO但没有用到VAO,你可能会不认同VAO的描述。你会争论说“顶点属性”可以用glVertexAttribPointer将VBO和shaders连接起来,而不是用VAO。这取决于你是否认为顶点属性应该是VAO“内置(inside)”的(我是这么认为的),或者说它们是否是VAO外置的一个全局状态。3.2内核和我用的AIT驱动中,VAO不是可选项 没有VAO的封装glEnableVertexAttribArray,glVertexAttribPointer和glDrawArrays都会导致GL INVALID OPERATION错误。这就是为啥我认为顶点属性应该内置于VAO,而非全局状态的原因。也说VAO是必须的,但我只听说ATI驱动会抛错误。下面描述引用自

所有与顶点处理有关的数据定义都应该封装在VAO里。一般VAO边界包含所有更改vertex array状态的命令,比如VertexAttribPointer和EnableVertexAttribArray;所有使用vertex array进行绘制的命令,比如DrawArrays和DrawElements;所有对vertex array状态进行查询的命令(见第6章)。

不管怎样,我也知道为啥会有人认为顶点属性应该放在VAO外部。glVertexAttribPointer出现早于VAO,在这段时间里顶点属性一直被认为是全局状态。你应该能看得出VAO是一种改变全局状态的有效方法。我更倾向于认为是这样:假如你没有创建VAO,那OpenGL通过了一个默认的全局VAO。所以当你使用glVertexAttribPointer时,你仍然是在VAO内修改顶点属性,只不过现在从默认的VAO变成你自己创建的VAO。

这里有更多的讨论:

代码解释终于!理论已经说完了,我们开始编码。OpenGL对于初学者而言不是特别友好,但如果你理解了之前所介绍的概念(shaders,VBO,VAO)那你就没啥问题。

打开main.cpp,我们从main函数开始。

首先,我们初始化GLFW:

看到此处说明本文对你还是有帮助的,关于“现代OpenGL教程 01”留言是大家的经验之谈相信也会对你有益,推荐继续阅读下面的相关内容,与本文相关度极高!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
三国杀卡牌故事

三国杀卡牌故事

教师,乐乐,课堂,人学,课程,小学奥数,小升初,孩子,教程,零基础,编写组,老师,王宁,现代流行,下册,专家,中文版,单元,全套,排行,吉他,名家,唱法,学会,实例,心理学,教学,数学,新手入门,礼仪

2020-09-08

六年级 英语故事学堂 系列一

六年级 英语故事学堂 系列一

教师,人学,课堂,乐乐,课程,小学奥数,学生,知识,英语,老师,孩子,小升初,教程,零基础,兴趣,教学,编写组,王宁,现代流行,下册,专家,中文版,儿童,全套,单元,吉他,名家,唱法,学会,实例

2020-08-16

六年级 语文故事学堂 系列一

六年级 语文故事学堂 系列一

教师,人学,课堂,乐乐,学生,课程,老师,小学奥数,孩子,小升初,教程,零基础,教学,编写组,王宁,现代流行,下册,专家,中文版,全套,单元,吉他,名家,唱法,姐姐,学会,实例,心理学,排行,数学

2020-07-23

艺休哥讲儿童艺术故事啦

艺休哥讲儿童艺术故事啦

教师,人学,乐乐,课堂,课程,小学奥数,小升初,孩子,教程,老师,零基础,编写组,王宁,现代流行,下册,专家,中文版,全套,单元,吉他,名家,唱法,学会,实例,次数,心理学,排行,教学,数学,新手入门

2020-08-15