第二十五章 绘制简单物体总结

简单的说,编译顶点着色器。首先需要把顶点着色器的源代码存储在一个字符串中,其次用glCreateShader创建一个着色器(参数:GL_VERTEX_SHADER)
下一步把源码附加到着色器对象上,再编译它(glShaderSource和glCompileShader)
最后用glGetShaderiv来检查是否编译时有错误(参数:GL_COMPILE_STATUS,success)如果编译失败,则用glGetShaderInfoLog用来获取错误信息

片段着色器的输出变量是一个,输出的是最终的颜色。创建着色器还是用glCreateShader,但是参数不一样(GL_FRAGMENT_SHADER),其他没什么区别

需要将上述着色器链接成一个着色器程序对象,在渲染对象的时候激活这个着色器程序。首先需要创建一个程序对象,使用的glCreateProgram,返回值是
一个程序对象的ID引用。下面需要把之前的着色器附加到程序对象上(glAttachShader函数),再用glLinkProgram链接。当然,链接程序对象也可以进行检测是否
链接成功。使用glGetProgramInfoLog和glGetProgramiv。最后需要激活这个程序对象,参数使用刚才建立的程序对象,使用函数glUseProgram
最后,着色器对象链接到程序对象后,需要删除着色器对象,使用函数glDeleteShader

下面需要将顶点数据链接到顶点着色器的属性上。可以使用glVertexAttribPointer函数解析顶点数据,第一个参数是要配置哪个顶点属性;第二个参数是顶点属性的大小,
因为顶点属性是一个vec3,则是由3个值组成,大小就是3;第三个参数是指定数据的类型,一般是GL_FLOAT;第四个参数是确认是否要 数据标准化(GL_FALSE);
第五个参数是步长,明确 连续的顶点属性直接的间隔;第六个参数是void*,一般写成:(void*)0 标识 位置数据在缓冲中起始位置的偏移量

下面需要以顶点属性位置值作为参数,启用顶点属性(函数:glEnableVertexAttribArray),注意顶点属性默认是禁用的。


顶点缓冲对象是用VBO管理的,接着是两个着色器被程序对象链接,最后是链接顶点属性。
下面是绑定顶点数组对象。任何随后的顶点属性调用都会存储到VAO中。
优点:配置顶点属性指针时,只需要将调用执行一次,也就是把这个VAO执行一次,之后绘制物体时候只要绑定相应的VAO即可。

顶点数组对象会存储好几个东西:首先是启用顶点属性和禁用顶点属性(glEnableVertexAttribArray和glDisableVertexAttribArray);glVertexAttribPointer
设置顶点属性指针(两处:设置的顶点属性配置;调用与顶点属性关联的顶点缓冲对象)

glGenBuffers是用来生成VBO的函数;绑定使用的是glBindBuffer(参数:GL_ARRAY_BUFFER)
glGenVertexArrays是用来创建VAO的函数;绑定使用的是glBindVertexArray。
会得到一个存储了顶点属性配置和应用了VBO的VAO。绘制物体时拿出相应的VAO,绑定它,绘制完后再解绑VAO。

绘制物体,可以使用glDrawArrays函数,分为三步:使用当前激活的着色器;使用之前定义的顶点属性配置,VBO的顶点属性数据–这是通过VAO来间接绑定的;最后使用glDrawArrays
来绘制图元。

glDrawArrays有三个参数,第一个是图元类型,第二个是顶点数组的起始索引,第三个是绘制的顶点个数。

EBO–元素缓冲对象,也叫做索引缓冲对象(IBO)。它是一个缓冲区,存储OpenGL用来决定要绘制哪些顶点的索引,并设定绘制这些顶点的顺序。
使用元素缓冲对象有以下步骤:首先需要定义要存储的顶点,以及用一个数组来表示绘制处图元需要的索引;其次需要创建EBO–glGenBuffers绑定,再使用glBufferData把索引赋值到缓冲中,
与VBO不同的是,参数的宏定义有变换,为:GL_ELEMENT_ARRAY_BUFFER;最后用glDrawElements替换了glDrawArrays函数,
有四个参数:第一个是绘制的模式(三角形:GL_TRIANGLES),第二个是绘制顶点的总个数;第三个是索引的类型,这个填GL_UNSIGEND_INT(索引中值的类型。 必须是GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT或GL_UNSIGNED_INT之一。)
可以通过https://learn.microsoft.com/zh-cn/windows/win32/opengl/gldrawelements查看OpenGL内建函数的用法
最后一个参数,指定EBO中的偏移量。

使用EBO的glDrawElements函数的时候,需要从绑定的GL_ELEMENT_ARRAY_BUFFER目标中获取索引。则每次使用索引渲染对象时必须绑定相应的EBO,但是
顶点数组对象也跟踪元素缓冲区对象绑定,也就是说,绑定VAO的时候,最后一个元素缓冲区对象存储为VAO的元素缓冲区对象,则绑定到VAO的时候也就会自动绑定到EBO
补充:参数如果是GL_ELEMENT_ARRAY_BUFFER时,VAO会存储glBindBuffer的调用,同时也会存储解绑调用,所以需要先解绑VAO,再解绑索引数组缓冲。

总体步骤如下:首先绑定顶点数组对象,也就是VAO;其次,把顶点数组赋值到顶点缓冲里面,也就是绑定VBO,再使用glBufferData复制顶点数组;其次,
复制索引数组到索引缓冲中,也就是两步:说先是绑定EBO,其次是把索引数组赋值到索引缓冲中;最后设置顶点属性指针,使用glVertexAttribPointer函数,再激活
glEnableVertexAttribArray函数进行启用顶点属性。最后使用while循环,glUseProgram激活着色器,再绑定VAO,使用glDrawElements绘画,最后使用glBindVertexArray(0)解绑

补充:有一个模式叫做线框模式。需要通过函数glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)配置。其中两个参数:第一个表示将线框模型应用到所有的三角形的正面和背面,
第二个参数表示用线来绘制。再这个函数之后都是线框模式。glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)将其设置回默认模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值