2017-02-01 11 views
1

私は赤でペイントしたい非常に単純な2Dの星型を作成しました。 2つのVBOと1つのVAOを作成しました。 1つのVBOは星の頂点に対応し、1つはシェーダーに渡すカラー値に対応します。ここで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; 
} 

これは私のフラグメントシェーダです:

012ここ
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); 

ラインはnumberOfElementsはあなたが持っている頂点の数であると考えられる

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

でなければなりません。頂点ごとに1色を送る必要があります。

+0

はい、それはそれを解決しました。私がTulonにコメントしたものも見てください。 – gambit20088