Я пытаюсь создать линейный график кривой косинуса вместе с осями. Проблема, с которой я столкнулся, заключается в том, что line_strip будет продолжать рисовать оси после того, как она нарисовала линию (т.е. я ожидал, что линия будет рисоваться, остановится, а затем оси начнут рисовать отдельно. Что происходит сейчас, так это то, что линия рисует линию и оси все как одна строка). Еще более странная вещь, которую я не понимаю, это то, что даже если я уберу строки:
//Draw axes
glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_LINE_STRIP, 0, 2); // x axis
glDrawArrays(GL_LINE_STRIP, 2, 2); // y axis
glDrawArrays(GL_LINE_STRIP, 4, 2); // z axis
glDisableVertexAttribArray(0);
который, как я думал, вообще перестанет рисовать оси, они все еще нарисованы !!
Соответствующий код показан ниже:
//Vertices for the axes in 3 dimesions
const float axesPositions[] = {
-1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, -1.0, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, -1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
//calculates cosine line vertices
std::vector<float> fillPositions()
{
std::vector<float> arr;
for (float x = -1.0f; x < 1.0f; x += 0.01f)
{
float y;
if (x == 0) y = 1; //divide by zero check
y = cos(x);
arr.push_back(x);
arr.push_back(y);
arr.push_back(0.0f);
arr.push_back(1.0f);
}
return arr;
}
GLuint positionBufferObject;
GLuint axesBufferObject;
GLuint vao;
std::vector<float> linePositions;
void InitializeVertexBuffers()
{
//genereate line graph vertex buffer
glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * linePositions.size(), &linePositions[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//generate axes vertex buffer
glGenBuffers(1, &axesBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(axesPositions), axesPositions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
//Called after the window and OpenGL are initialized. Called exactly once, before the main loop.
void init()
{
InitializeProgram();
linePositions = fillPositions();
InitializeVertexBuffers();
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
}
//Called to update the display.
void display()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(theProgram);
// Draw line
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_LINE_STRIP, 0, linePositions.size());
glDisableVertexAttribArray(0);
//Draw axes
glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_LINE_STRIP, 0, 2); // x axis
glDrawArrays(GL_LINE_STRIP, 2, 2); // y axis
glDrawArrays(GL_LINE_STRIP, 4, 2); // z axis
glDisableVertexAttribArray(0);
glUseProgram(0);
glutSwapBuffers();
glutPostRedisplay();
}