Я пытаюсь манипулировать некоторым кодом, чтобы нарисовать круг вместо треугольника, который уже печатается в учебнике. Я не очень хорошо знаком с C++ или OpenGL, поэтому я просто пытаюсь это сделать.Рисование круга с OpenGL
Любые предложения или исправления в отношении моего кода будут очень признательны. я получаю точки останова ошибки в Xcode на этой линии:
glDrawArrays(GL_TRIANGLE_FAN, 0, numPoints); // draw the points and fill it in
, и он говорит:
Thread 1: EXC_BAD_ACCESS(code=1, address=0x0)
Вот исходный вектор буфер для треугольника в учебнике я следующее:
static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};
Я уверен, что мои расчеты правильные, но я не знаю, почему он не рисует круг. Вот моя манипуляция:
// Make a circle
GLfloat x;
GLfloat y;
GLfloat z = 0.0f;
int theta = 0;
float radius = 50.0f;
int currentSize = 0;
int numPoints = 30;
GLfloat g_vertex_buffer_data[numPoints*3];
while (theta <= 360) {
x = (GLfloat) radius * cosf(theta);
y = (GLfloat) radius * sinf(theta);
g_vertex_buffer_data[currentSize++] = x;
g_vertex_buffer_data[currentSize++] = y;
g_vertex_buffer_data[currentSize++] = z;
/*
cout << "Theta: " << theta << endl;
for (int i = 0; i < currentSize; i++) {
cout << "g_vertex_buffer_data[" << g_vertex_buffer_data[i] << "]" << endl;
}
*/
theta = theta + (360/numPoints);
}
Вот остальная часть кода в файле .cpp:
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data),g_vertex_buffer_data, GL_STATIC_DRAW);
do{
// Clear the screen
glClear(GL_COLOR_BUFFER_BIT);
// Use our shader
glUseProgram(programID);
// 1rst attribute buffer : vertices
glEnableVertexAttribArray(vertexPosition_modelspaceID);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
vertexPosition_modelspaceID, // The attribute we want to configure
numPoints, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the circle!
glDrawArrays(GL_TRIANGLE_FAN, 0, numPoints); // draw the points and fill it in
glDisableVertexAttribArray(vertexPosition_modelspaceID);
// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
} // Check if the ESC key was pressed or the window was closed
while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);
// Cleanup VBO
glDeleteBuffers(1, &vertexbuffer);
glDeleteProgram(programID);
// Close OpenGL window and terminate GLFW
glfwTerminate();
return 0;
Попробуйте положить вызовы glGetError между ними, чтобы увидеть, если любой из ваших предыдущих Gl вызовов не удалось https://www.opengl.org/sdk /docs/man/docbook4/xhtml/glGetError.xml – timdykes
Второй параметр 'glVertexAttribPointer' должен быть числом поплавков каждой вершины, а не числом вершин. – BDL
ОК, что немного имеет смысл для 'glVertexAttribPointer', потому что раньше у него было' 3', но я просто предположил, что это означает количество вершин. –