Я пытаюсь получить ручку на 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, поэтому кажется, что создается точка, но она не обрабатывается моим вершинным шейдером.
Каковы ваши данные о вершинах? И где остальная часть вашего кода инициализации и т. Д.? –
@NicolBolas Спасибо, что посмотрели на это. Я добавил данные вершин и инициализацию на свой пост. –