2017-02-01 18 views
1

我創建了一個非常簡單的2D星形,我想用紅色繪製。 我爲它和一個VAO創建了2個VBO。 一個VBO用於星形的頂點,另一個用於我希望傳遞給着色器的顏色值。OpenGL - 使用片段着色器得到一個奇怪的結果

這裏是我創建的顏色數據:(比方說,我很感興趣,紅色)

struct CArray { 
    static const GLuint numColor = 1; 
    glm::vec4 color[numColor]; 
    CArray() { 
     color[0] = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f); 
    } 
}; 

CArray starColor; 

這是我的緩衝區綁定過程:

glEnableVertexAttribArray(12); 
    glGenBuffers(1, &g_bufferObject3); 
    glBindBuffer(GL_ARRAY_BUFFER, g_bufferObject3); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4), starColor.color, GL_STATIC_DRAW); 
    glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, 0, 0); 

這是我的頂點着色器:

layout (location=0) in vec4 position; 
layout(location=12) in vec4 color; 

out vec4 colorVertFrag; 

uniform mat4 ModelViewMatrix; 
uniform mat4 ProjectionMatrix; 

void main() { 
    gl_Position = ProjectionMatrix * ModelViewMatrix * position; 
    colorVertFrag = color; 
} 

這是我的片段着色器:

in vec4 colorVertFrag; 
out vec4 color; 

void main() { 
    color = colorVertFrag; 
} 

這裏是結果我得到:(忽略形成恆星的眼睛,鼻子和微笑的點,他們應該是黑色的)

enter image description here

正如你所看到的,而不是獲得穩定的紅色,我得到某種奇怪的黑紅色漸變。 如果我把我的頂點着色器下面一行:

colorVertFrag = vec4(1.0, 0.0, 0.0, 1.0); 

星出來完美的紅色。

可能是什麼問題? 謝謝!

+0

哈哈哈,那是一個微笑! :-P –

+0

我對OpenGL還是比較新的:D – gambit20088

+0

您的VBO不應該包含每個頂點的顏色嗎? –

回答

2

glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4), starColor.color, GL_STATIC_DRAW); 

應該

glBufferData(GL_ARRAY_BUFFER, numberOfElements * sizeof(glm::vec4), starColor.color, GL_STATIC_DRAW); 

其中numberOfElements應該是你的頂點數量。您必須爲每個頂點發送1個顏色。

+0

是的,解決了它。另請參閱我對Tulon評論的內容。 – gambit20088

相關問題