openGL学习过程(1)

Basic:

  1. 使用OpenGL(3.3及以上)+GLFW或freeglut画一个简单的三角形

截图:

openGL学习过程(1)

 

实现思路:

首先是按照教程配置好环境,关键在于把相关的lib文件和include文件要添加到项目中的那个配置路径里,让IDE知道去那里找。

然后就是调用函数创建一个窗口,可以设定窗口大小和名字等属性,并设置为当前线程的上下文,再设置视口控制渲染窗口的位置和大小。接着为了在改变窗口大小的时候也可以改变视口的大小需要注册一个回调函数进行调整。最后为了避免窗口一下就结束,还要弄一个渲染循环进行不断的渲染。

到了画三角形的时候,首先要先创建编译两个着色器,定点着色器和片段着色器。在顶点着色器中我们可以对输入的位置信息等进行处理,例如将坐标进行转换,传到着色器的输出gl_Position变量。片段着色器做的是计算像素最后的颜色输出。有4个元素的数组:红色、绿色、蓝色和alpha(透明度)分量,片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色。然后就是根据我们编写的上面两个着色器源码,先创建着色器对象,将源码附加到着色器对象上,然后进行编译。接着就是创建一个着色器程序对象,将编译后的着色器对象附加到程序对象上,并进行链接。

至于三角形的数据,一开始先设定三角形顶点信息存在数组里,接着就是创建顶点数组对象(VAO),绑定,任何随后的顶点属性调用都会储存在这个VAO中,避免每次都要设置一堆属性。在创建一个顶点缓冲对象(VBO),它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。绑定VBO后,就用glBufferData将顶点数据传送过去缓冲的内存中。然后还要glVertexAttribPointer定义了OpenGL该如何解释顶点数据并用glEnableVertexAttribArray启用数据。

最后就用上面的程序对象来绘制图元就行了,glDrawArrays函数,它使用当前**的着色器,之前定义的顶点属性配置,和VBO的顶点数据(通过VAO间接绑定)来绘制图元。

      

  1. 截图

openGL学习过程(1)

 

实现思路:

之所以出现这个效果,首先是在顶点信息数组中我们添加了每个点的颜色信息,然后更改了传输数据的代码

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));

    来告诉openGL还有不同的信息,再在顶点着色器源码中接收颜色信息再传送给片段着色器中,就完成了不同点的不同颜色。

          而出现上述的效果,是因为我们只给了三个颜色,然后片段着色器进行片段插值的结果。当渲染一个三角形时,光栅化(Rasterization)阶段通常会造成比原指定顶点更多的片段。光栅会根据每个片段在三角形形状上所处相对位置决定这些片段的位置。

基于这些位置,它会插值(Interpolate)所有片段着色器的输入变量。

 

  1.  

  截图:

openGL学习过程(1)

首先是下载imgui的源文件,注意还要把example里的imgui_impl_glfw和imgui_impl_opengl3添加进去,然后还要

#define IMGUI_IMPL_OPENGL_LOADER_GLAD

默认用的是gl3w,我们用的是glad。然后就可以用imgui的库函数来渲染组件了。参考了一下example里的代码,先要创建imgui的上下文,然后设定一些像style的属性,然后在渲染循环里面先创建imgui的帧,然后用colorEdit3来渲染出选择颜色板,并且会存到一个颜色vec4中,然后我就将vertices里面的颜色属性换成这个选择的颜色,再用glBufferData函数来传递顶点数据,最后进行imgui的render渲染和原本三角形的渲染就行了。

 

Bonus:

  1. 截图

openGL学习过程(1)

实现思路:

就在渲染原来三角形的基础上,修改了一下渲染的函数属性

glDrawArrays(GL_LINE_STRIP, 0, 2);

 

  1. 截图:

openGL学习过程(1)

 

实现思路:

在画三角形的基础上,我们利用索引缓冲对象(EBO),来减少画多个三角形有重叠的顶点时的重复操作,减少额外开销。只存储不同的顶点,并存储这些顶点的绘制顺序作为索引。与VBO类似,我们先绑定EBO然后用glBufferData把索引复制到缓冲里。GL_ELEMENT_ARRAY_BUFFER当作缓冲目标。最后一件要做的事是用glDrawElements来替换glDrawArrays函数,来指明我们从索引缓冲渲染。使用glDrawElements时,我们会使用当前绑定的索引缓冲对象中的索引进行绘制。顺序是先VAO,再EBO,再VBO。