為了使頻譜圖的繪制更為規範,部落客将繪制邏輯進行了小幅的修改,加入着色器進行渲染,加入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;
}
代碼運作效果圖【是不是比上一篇博文裡的頻譜圖漂亮多了呢】:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX3VkeOdXTU1ENNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNxkTMzkTN5ETNycDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)