(1)准备数据
opengl是以图元作为基本绘制单元的,就像我们在草纸上画四边形一样,肯定首先想到四边形的四个顶边,然后连接组成边框的两个顶点。opengl的图元就是我们熟悉的基本形状(比如点、三角形,具体的大家可以查看相关手册),图元的形状由顶点确定,图元的颜色可以由顶点颜色插值得到,也可以是纹理的颜色。这样,我们在利用opengl绘图的时候,首先就要准备绘图数据。如图,根据三角形带的顶点顺序,准备数据。
(2)将数据上传到gpu
顶点数据需要存放在gpu的缓冲区中,这个缓冲区就是vbo,我们只需要将其当作内存块。
(3)准备程序
本例中需要用到opengl渲染管线中的顶点着色和片元着色,程序如图。
(4)为程序设置绘图参数
在为程序设置参数之前,要获取参数对应的位置。我看到vs shader中有两种类型的参数,attribute是每个顶点独立拥有的,uniform是此次绘制流程共享的,从程序的角度把他们当作内存块就好。两者位置的获取和值的设置也是不一样的,如图。
(5)向opengl发送绘图命令
(6)如何让四边形全屏
我们在vs shader中看到gl_Position = P*V*M*pos,原始的顶点位置需要经过模型、视口、投影矩阵的转换,在进行片元着色之前,还要经过剪裁。由此有两种让四边形全屏的方法。
1、在透视模型上做一个剪切面,反推算出原始顶点的值。我们让M、V都是单位矩阵,P=glm::perspective(45.0f, 800.0f/600.0f, 0.1f, 1000.0f),根据tan(fov/2) = (y/2)/z,可以求出y的值,再根据x/y = 800.0f/600.0f,可以求出x的值。
2、不经过矩阵转换,直接给定原始顶点,让四边形铺满整个屏幕。
顶点着色之后,在进行片元着色之前,要经过剪裁。剪裁模型就是一个以(0.0f, 0.0f, 0.0f)为中心点,向正负方向展开一个单位的立方体,在立方体外的图形不会进行下一阶段的着色。这样我们只需要设定如图的顶点值就好。
原文:https://www.cnblogs.com/yinjinxun/p/13493023.html