天天看點

【C++】基于OpenGL的音樂可視化(五): 頻譜渲染

為了使頻譜圖的繪制更為規範,部落客将繪制邏輯進行了小幅的修改,加入着色器進行渲染,加入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;
}
           

代碼運作效果圖【是不是比上一篇博文裡的頻譜圖漂亮多了呢】:

【C++】基于OpenGL的音樂可視化(五): 頻譜渲染