рисование нескольких треугольников с разными цветами с помощью одной команды glDrawArrays - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь что-то написать в OpenGL, и я новичок, поэтому извините за любые ошибки, которые я совершаю.

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

float vertices[] = {
        -0.5f, -0.6f, 0.0f,
        0.5f, -0.6f, 0.0f,
        0.4f,  0.5f, 0.0f,
        0.5f, 0.6f, 0.0f,
        -0.5f, 0.6f, 0.0f,
        -0.4f,  -0.5f, 0.0f

};

void display() {
    std::cout << "frame";
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
    glClear(GL_COLOR_BUFFER_BIT);         // Clear the color buffer
    // activate and specify pointer to vertex array
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);

// draw a cube
    glColor3f(1.0f, 0.0f, 0.0f); // Red

    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glColor3f(0.0f, 1.0f, 0.0f); // Green
    glDrawArrays(GL_TRIANGLES, 3, 3);

    glDisableClientState(GL_VERTEX_ARRAY);
    glFlush();  // Render now
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);                 // Initialize GLUT
    glutCreateWindow("OpenGL Setup Test"); // Create a window with the given title
    glutInitWindowSize(320, 320);   // Set the window's initial width & height
    glutInitWindowPosition(50, 50); // Position the window's initial top-left corner
    glutDisplayFunc(display); // Register display callback handler for window re-paint
    glutMainLoop();           // Enter the infinitely event-processing loop
    return 0;
}

сейчас .. если я. хочу нарисовать оба треугольника в одной команде, которую я могу сделать

    glDrawArrays(GL_TRIANGLES, 0, 6);

но тогда он рисует два треугольника одного цвета.

Есть ли способ нарисовать каждый треугольник другим цветом, все еще используя только одну команду glDrawArrays()?

если нет .. есть какая-то другая команда, за которой я должен пойти?

спасибо

Ответы [ 2 ]

0 голосов
/ 13 января 2019

"если нет .. есть ли какая-то другая команда, к которой я должен обратиться?" Фиксированные атрибуты функций и возможности на стороне клиента устарели с десятилетий. См. Фиксированный конвейер функций и Legacy OpenGL . Прочитайте о Vertex Specification и Shader , чтобы узнать о современном способе рендеринга.


В любом случае вы можете определить массив атрибутов цвета с помощью glColorPointer, поэтому каждая координата вершины связана с отдельным атрибутом цвета:

float colors[] = {
     1.0f, 0.0f, 0.0f, // red
     1.0f, 0.0f, 0.0f,
     1.0f, 0.0f, 0.0f,
     0.0f, 1.0f, 0.0f, // green
     0.0f, 1.0f, 0.0f,
     0.0f, 1.0f, 0.0f
};

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, colors);

glDrawArrays(GL_TRIANGLES, 0, 6);
0 голосов
/ 13 января 2019

В описании glDrawArrays написано:

Вместо вызова процедуры GL для передачи каждого отдельного атрибута вершины, вы можете использовать glVertexAttribPointer, чтобы заранее указать отдельные массивы вершин, нормалей и цветов и использовать их для создания последовательности примитивов с одним вызовом glDrawArrays.

Это ваше решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...