從頂點數據中傳入頂點位置和頂點顏色


一、目的:不需要在着色器中指定圖形的顏色,直接在頂點數據中指定顏色

//畫三角形的頂點數組
float vertices[] = {
  //位置      //顏色
  -0.5f, -0.5f, 0.0f,1.0f,0.0f,0.0f,
  0.5f, -0.5f,0.0f,0.0f,1.0f,0.0f,
  0.0f,0.5f,0.0f,0.0f,0.0f,1.0f
};

二、

由於現在有更多的數據要發送到頂點着色器,我們有必要去調整一下頂點着色器,使它能夠接收顏色值作為一個頂點屬性輸入。需要注意的是我們用layout標識符來把aColor屬性的位置值設置為1:

頂點着色器:

 1 #version 330 core
 2 layout (location = 0) in vec3 aPos;   // 位置變量的屬性位置值為 0 
 3 layout (location = 1) in vec3 aColor; // 顏色變量的屬性位置值為 1
 4 
 5 out vec3 ourColor; // 向片段着色器輸出一個顏色
 6 
 7 void main()
 8 {
 9     gl_Position = vec4(aPos, 1.0);
10     ourColor = aColor; // 將ourColor設置為我們從頂點數據那里得到的輸入顏色
11 }

片元着色器:

#version 330 core
out vec4 FragColor;  
in vec3 ourColor;

void main()
{
    FragColor = vec4(ourColor, 1.0);
}

三、

因為我們添加了另一個頂點屬性,並且更新了VBO的內存,我們就必須重新配置頂點屬性指針。

1 // 位置屬性
2 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
3 glEnableVertexAttribArray(0);
4 // 顏色屬性
5 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
6 glEnableVertexAttribArray(1);

達到的效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM