2014-10-18 4 views
0

Я пытаюсь сделать простейший треугольник с шейдерами и массивами вершин, но когда я пытаюсь нарисовать массив вершин, ничего не появляется. Это код (Кстати, функция Жеребьевка является называют, я проверил): созданиеOpenGL Vertex Array не отображается?

массива:

glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

GLfloat verts[] = { 
    0, 0, /*vertex 1*/  1, 0, 0, /*color 1*/ 
    0, 100, /*vertex 2*/ 0, 1, 0, /*color 2*/ 
    100, 0, /*vertex 3*/ 0, 0, 1 /*color 3*/ 
}; 
glBufferData(GL_ARRAY_BUFFER, 5 * sizeof(GLfloat) * 3, verts, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, sizeof(GLfloat) * 2, GL_FLOAT, false, 0, 0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, sizeof(GLfloat) * 3, GL_FLOAT, false, 0, 0); 

glBindVertexArray(0); 

Массив Рендер:

glBindVertexArray(vao); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
glBindVertexArray(0); 

shader.vert
uniform float u_time; 
uniform mat4 u_projMatrix; 

in vec2 position; 
in vec3 color; 

out vec4 vertColor; 
void main() 
{ 
    gl_Position = u_projMatrix * vec4(position, 0.0, 1.0); 
    vertColor = vec4(color, 1.0); 
} 

shader.frag

uniform float u_time; 

in vec4 vertColor; 
void main() 
{ 
    gl_FragColor = vertColor; 
} 

Проекция Матрица:

glm::mat4 projection = glm::scale(glm::vec3(2.0/800.0, 2.0/600.0, 1.0)); 

Я не показал весь код в моей программе, но есть что-то, что определенно не так с этим кодом?

ответ

1

Вы не указали шаг или смещение. и размер - это количество компонентов, а не количество байтов.

Шаг: сколько байтов openGL должно продвигаться для следующего набора данных для атрибута в вашем случае, который равен 5*sizeof(GLfloat) для обоих атрибутов.

смещение, где расположен первый набор данных для атрибута, для позиции 0 для цвета 2*sizeof(GLFoat).

glVertexAttribPointer так что ваши звонки должны быть:

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 2, GL_FLOAT, false, 5*sizeof(GLfloat), 0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, false, 5*sizeof(GLfloat), 2*sizeof(GLfloat)); 
+0

я должен был бросить '2 * SizeOf (GLfloat)' в '' недействительным *, но даже тогда он не оказывал ничего. Что-нибудь, что я все еще делаю неправильно? – name

+1

Второй аргумент 'glVertexAttribPointer()' - количество компонентов, а не размер в байтах. –

+0

, если вы не указали шаг, тогда openGL увидит следующие вершины: '0,0'' 1,0' и' 0,0', что не то, что вы хотите –