Рисование нескольких треугольников с разными цветами с помощью одной команды glDrawArrays
Я пытаюсь что-то написать в 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 ответа
"если нет.. есть какая-то другая команда, за которой я должен пойти?" Фиксированные атрибуты функций и возможности на стороне клиента устарели с десятилетий. См. Конвейер с фиксированными функциями и устаревший 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);
В описании glDrawArrays написано:
Вместо вызова процедуры GL для передачи каждого отдельного атрибута вершины, вы можете использовать glVertexAttribPointer, чтобы заранее указать отдельные массивы вершин, нормалей и цветов, и использовать их для создания последовательности примитивов с одним вызовом glDrawArrays.
Это ваше решение?