2017-02-01 4 views
1

Я создал очень простую двумерную звездную форму, которую я хочу нарисовать красным цветом. Я создал 2 VBOs для него и один VAO. Один 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

hahaha, это улыбка! :-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