Рисование из двух буферов массива в OpenGL - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь создать линейный график кривой косинуса вместе с осями. Проблема, с которой я столкнулся, заключается в том, что 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();
}

1 Ответ

3 голосов
/ 02 марта 2012

linePositions.size () - это число с плавающей точкой в ​​вашем массиве, а не количество вершин, которые вы хотите нарисовать.

Изменить эту строку:

glDrawArrays(GL_LINE_STRIP, 0, linePositions.size());

к этому:

glDrawArrays(GL_LINE_STRIP, 0, linePositions.size()/4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...