2012-03-17 1 views
1

Я пытаюсь получить ручку на OpenGL VAOs/VBOs и концептуально Я там, но по какой-то причине это приложение ничего не рисует на экране. Я работаю в контексте 4.2, но я пишу только для ядра 3.3.Почему приложение OpenGL 3.3 не рисует ничего?

Вот декларации для соответствующих переменных:

// Tetrahedron vertices 
GLfloat tetra_vertices[12]; 
GLuint tetra_vao; 
GLuint tetra_vbo; 

В функции называется init_scene я следующие:

glGenVertexArrays(1, &tetra_vao); 
glBindVertexArray(tetra_vao); 
glGenBuffers(1, &tetra_vbo); // One for vertex locations 
glBindBuffer(GL_ARRAY_BUFFER, tetra_vbo); // Bind vertex locations buffer 
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tetra_vertices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0); 

А где моя GLSL программа связана:

for (int i = 0; i < num_shaders; ++i) 
    glAttachShader(program, shaders[i]); 
glBindAttribLocation(program, 0, "in_position"); 
glLinkProgram(program); 

Я использую только один атрибут, и это вершинная позиция. Программа связывается без ошибок.

Вот сама draw_scene функции:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glBindVertexArray(tetra_vao); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 12); 
glBindVertexArray(0); 

И для хорошей меры, мой вершинный шейдер:

#version 330 
in vec3 in_position; 
uniform mat4 modelview_matrix; 
void main(void) { 
    gl_Position = vec4(in_position, 1.0f) * modelview_matrix; 
} 

modelview_matrix равномерного, что это на данный момент только переходящей в единичной матрице. Я подумал, что что-то может быть сделан вывод, что я просто не мог видеть, так что я установил мой ясный цвет на серый, а вот пиксельный шейдер, который должен только выход белого:

#version 330 
out vec4 vFragColor; 
void main(void) 
{ 
vFragColor = vec4(1.0f); 
} 

Все, что я прочитал , в первую очередь this tutorial и Superbible, делают цепь событий довольно ясное:

  • Создание ВАО
  • свяжи ВАО
  • Создать VBO
  • Bin d и заполнить VBO
  • Установите указатель атрибута

Я использовал glDEBugger, чтобы попытаться получить более четкую картину того, почему это не работает. У меня есть разрыв на ошибках GL, поэтому я знаю, что ошибки не возникают из-за самих функций GL. Я вижу содержимое VBO, и это вершинные данные, которые я ожидал бы. Единственное, о чем я не уверен, - это убедиться, что VBO ассоциируется как данные местоположения вершин с VAO, и что VAO фактически правильно привязано, когда я вызываю функцию draw.

Если у вас есть что-то, что мне нужно, пожалуйста, дайте мне знать. Благодаря!

Update 1:

Вот массив, который содержит данные вершин загружены в VBO:

tetra_vertices = { 
    0.7f, 0.7f, 0.7f, 
    -0.7f, -0.7f, 0.7f, 
    -0.7f, -0.7f, -0.7f, 
    0.7f, -0.7f, 0.7f 
}; 

Вот что все мои настройки контекста материала выглядит следующим образом:

glClearColor(0.2,0.2,0.2,0.0); 
glClearDepth(1.0); 
glViewport(0, 0, properties.size_x, properties.size_y); 
glEnable(GL_DEPTH_TEST); 
glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
glEnable(GL_VERTEX_ARRAY); 
glEnable(GL_MULTISAMPLE); 

Обновление 2:

Ответ Николь Болас ниже поднял хорошую точку зрения о орфографической видимости, о которой я не думал. К сожалению, похоже, что это проблема. Я попробовал его список вершин, и выключил любой забой, и попытался эти вершины:

tetra_vertices = { 
    -0.7f, -0.7f, 0.0f, 
    -0.7f, 0.7f, 0.0f, 
    0.7f, -0.7f, 0.0f, 
    0.7f, 0.7f, 0.0f 
}; 

Который должен, я думаю, нарисовать квадрат, но до сих пор ничего. Я также заметил, что я вызывал glDrawArrays с 12 элементами, когда это должно было быть четыре (12 координат = 4 x, y, z вершин), но это также не устранило проблему.

Update 3 (или, «Когда сообщения Стать Too Long»): Прогулка по применению шаг за шагом в gDEBugger, я заметил что-то, что поражает меня как странно. В функции draw существует обычный цикл привязки текущего VAO, вызов glDrawArrays, свяжите VAO 0, чтобы можно было нарисовать другую вещь. Наблюдая за настройками состояния GL, как это происходит, похоже, что GL_VERTEX_ARRAY - это TRUE, когда мое VAO не связано (например, VAO 0) и FALSE, когда мое VAO связано. Так ли это должно быть? GL_VERTEX_ARRAY представляет состояние, которое заменяется glBindVertexArray, а не дополнено им? Кроме того, изменение режима от GL_TRIANGLE_STRIP до GL_POINTS и установка glPointSize(5.0f) заставляют одну точку рисоваться на 0, 0, поэтому кажется, что создается точка, но она не обрабатывается моим вершинным шейдером.

+0

Каковы ваши данные о вершинах? И где остальная часть вашего кода инициализации и т. Д.? –

+0

@NicolBolas Спасибо, что посмотрели на это. Я добавил данные вершин и инициализацию на свой пост. –

ответ

4
tetra_vertices = { 
    0.7f, 0.7f, 0.7f, 
    -0.7f, -0.7f, 0.7f, 
    -0.7f, -0.7f, -0.7f, 
    0.7f, -0.7f, 0.7f 
}; 

Вы используете отографическую проекцию (так как ваша матрица идентична). Таким образом, мы можем игнорировать значения Z; они не имеют значения.

Вы рисуете это как полосу треугольника, поэтому он имеет два треугольника.

Ваш первый треугольник: {(0.7f, 0.7f), (-0.7f, -0.7f), (-0.7f, -0.7f)}. Этот треугольник не имеет видимой площади поверхности, потому что две точки - это одинаковые. Треугольник без видимой поверхности невидим.

Ваш второй треугольник: {(-0.7f, -0.7f), (-0.7f, -0.7f), (0.7f, -0.7f)}. Как и раньше, две точки одинаковы, поэтому треугольник не имеет видимой области.

Вы, вероятно, имел в виду что-то вроде этого:

tetra_vertices = { 
    0.7f, 0.7f, 0.0f, 
    -0.7f, 0.7f, 0.0f, 
    -0.7f, -0.7f, 0.0f, 
    0.7f, -0.7f, 0.0f 
}; 

Это, скорее всего, вам что-нибудь полезное. Если вы все еще ничего не видите, отключите отбраковку.

+0

Это хороший момент, и что-то я не рассматривал. Я попробовал, но, увы, нет кубиков. Я попытался установить режим 'glDrawArrays' в' GL_POINTS', 'GL_LINES' и' GL_TRIANGLES' тоже, но ни один из них не показал ничего. –