为了使频谱图的绘制更为规范,博主将绘制逻辑进行了小幅的修改,加入着色器进行渲染,加入VAO,VBO用来实现绘制图形时数据的管理。
顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
片段着色器:
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量
void main()
{
FragColor = ourColor;
}
绘制频谱时的色彩渲染,设置两个颜色变量redValue,yellowValue实现颜色的变化,每次绘制一个频谱线之后对redValue,yellowValue进行相应的修改,要注意的是,为了使颜色更为自然,每一帧的画面绘制时,在绘制了一半的频谱时,redValue,yellowValue做相反的变化,恢复原来的颜色,代码如下:
//绘制频谱
void drawLine()
{
usleep(44100); //通过延时实现频谱的显示频率
//颜色随机设置
float redValue = 0.0f;
float yellowValue = 1.0f;
for (int i=istart; i<1000+istart; i=i+2) {
glUniform4f(0, redValue, 1.0f, yellowValue, 1.0f);
if (i<=1000+istart) {
redValue=redValue+0.002;
yellowValue=yellowValue-0.002;
}else{
redValue=redValue-0.002;
yellowValue=yellowValue+0.002;
}
glDrawArrays(GL_LINES, i, 2);
}
istart+=1000;
}
代码运行效果图【是不是比上一篇博文里的频谱图漂亮多了呢】: