(1)顶点数据:位置+颜色
左半部分是位置数据 右半部分是颜色数据
float vertices[] = { // 位置positions // 颜色colors
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // top right 红色
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom right 绿色
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // bottom left 蓝色
-0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.5f, // top left
};
(2)顶点着色器代码:传出颜色
gl_Position内置变量主要和顶点相关,出现的位置是顶点着色器语言的main函数中。gl_Position内置变量表示最终传入片元着色器片元化要使用的顶点位置坐标。 vec4(x,y,z,1.0),前三个参数表示顶点的xyz坐标值,第四个参数是浮点数1.0。
#version 330 core
layout(location = 0) in vec3 aPos; //顶点着色器 索引为0入口 位置
layout(location = 1) in vec3 aColor;//索引为1 aColor需要送出去
out vec3 ourColor; //定义一个vec3对象把aColor传到ourColor
void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0f);
ourColor=aColor;
}
(3)片段着色器:接收到颜色
#version 330 core
out vec4 FragColor;
in vec3 ourColor;//流水线下游收到颜色
void main(){
FragColor = vec4(ourColor, 1.0f);//接收到的颜色放到FragColor
}
(4)顶点和片段着色器属性
对应的代码部分需要增加颜色部分
增加的颜色代码部分 注意索引为1 偏移量是从第12个字节开始(3个float)
glEnableVertexAttribArray(0);
//告知显卡如何解析缓冲里的属性值 GL_FALSE不需要标准化 步长为6个float(24字节) 偏移量为3个字节
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3*sizeof(float)));
//开启VAO管理的第二个属性值
glEnableVertexAttribArray(1);
(5)增加颜色属性后的最后效果