顶点着色器的绘制操作

时间:2022-10-24 13:00:13

将数据传入图形渲染管线

着色器内部有些属性是在其渲染的过程中取出进行判断如何渲染的,比如顶点着色器当中就有个aPosition属性代表的是【顶点属性数组】,记住是顶点属性的数组,不单单只是顶点坐标这一个属性,但是最起码要包含坐标这一个属性,初次之外还可以添加坐标转换等属性,再比如片段着色器中也有个属性决定着片段的最终颜色

顶点处理器的操作

Opengl采用GLSL的语言用于编写Sharder着色器程序,该语言和c语言类似都是面向过程。在着色器代码中也是如此,我们需要获取到着色器中的属性进行赋值
//三角形坐标  采用的是三维数组,使用vec纬度来表示类型。比如vec4是四纬数组,vec3是三维数组

定义顶点属性数组对象

static float triangleVer[] = {
0.8f, -0.8f, 0.0f,
-0.8f, -0.8f, 0.0f,
0.0f, 0.8f, 0.0f,
};

获取着色器内部属性

//指定接收三角形坐标的变量名,program为上面的编译链接好的着色器程序
GLuint apos = static_cast(glGetAttribLocation(program, "aPosition"));

设置着色器内部属性

//真正传输数据的地方

ps:glVertexAttribPointer方法指定了顶点属性数组要传到着色器哪个变量中(这里的变量指的是顶点着色器中被in修饰的变量),另外就是指定传入的顶点属性数组的格式(Float) 以及着色器如何去取顶点属性数组数据。

将triangleVer数组的每个元素用Float类型来看待,每3个元素为一个属性,每间隔12个字节(stride传0告诉OpenGL顶点属性都是紧密挨着)属性依次传给着色器中apos引用的变量

最终代码:glVertexAttribPointer(apos, 3, GL_FLOAT, GL_FALSE, 0, triangleVer);

打开开关

//这就是一个开关方法,就是打开着色器中apos这个变量

开关在这里介绍一下:正常情况下外部传入的参数会自动绑定到着色器内部变量,前提是名字一致,但是如果内部某天换了个名字就会绑定出错,因此使用position来定位具体传入赋值的参数名字叫什么。

这最后一步就是定位打开这个属性将我们修改后的apos变量送入到着色器代码内部
glEnableVertexAttribArray(apos);