Этот вопрос, как уже упоминалось, слишком широкий. Но вы сказали, что вам удалось нарисовать один куб, поэтому я могу предположить, что вы можете настроить камеру и ваше окно. Это оставляет нас в том, как сделать 8 кубов. Есть много способов сделать это, но я упомяну 2 очень разных.
Classic:
Вы создаете функцию, которая принимает 2 параметра - центр куба и размер. Используя эти 2, вы можете построить куб точно так же, как сейчас, но вместо фиксированных значений вы будете использовать эти переменные. Например, передняя сторона будет:
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(center.x-size/2, center.y-size/2, center.z+size/2);
glVertex3f(center.x+size/2, center.y-size/2, center.z+size/2);
glVertex3f(center.x-size/2, center.y+size/2, center.z+size/2);
glVertex3f(center.x+size/2, center.y+size/2, center.z+size/2);
glEnd();
Это просто для демонстрации того, как сделать это из переменных, вы можете сделать это так же, как сейчас.
Теперь вы упомянули, что хотите использовать шейдеры. Тема шейдеров очень широка, как и сам openGL, но я могу рассказать вам об этом. В openGL 3.2 были добавлены специальные шейдеры, называемые геометрией. Их цель - работать с геометрией в целом - наоборот, вершинные шейдеры работают только с одной вершиной за раз или что фрагментные шейдеры работают только с одним фрагментом за раз - геометрические шейдеры работают с одним геометрическим фрагментом за раз. Если вы рисуете треугольники, вы получаете всю информацию об одном треугольнике, который только проходит через шейдеры. В этом не было бы ничего серьезного, но эти шейдеры не только изменяют эти геометрии, они могут создавать новые! Так что я делаю это в одной из моих шейдерных программ, где я рендеринг точек, но когда они проходят через геометрический шейдер, эти точки преобразуются в круги. Точно так же вы можете рендерить только точки, но внутри геометрического шейдера вы можете рендерить целые кубы. Точка будет работать как центр для этих кубов, и вы должны передать размер кубиков в униформе. Если размер кубов может варьироваться, вам также необходимо создать вершинный шейдер, который будет передавать размер от атрибута к переменной, который можно прочитать в геометрическом шейдере.
Что касается проблемы с цветом, если вы не реализуете фрагментные шейдеры, единственное, что вам нужно сделать, это вызвать glColor3f
перед рендерингом кубов. Требуется 3 параметра - красный, зеленый и синий значения. Обратите внимание, что эти значения не находятся в диапазоне от 0 до 255, но от 0 до 1. Вы можете запутаться, что ваши кубы не отображаются, если вы используете белый фон, и думаете, что при установке цветов на 200,10,10 вы должны видите красные кубики, но вы ничего не видите. Это потому, что на самом деле вы делаете белые кубы. Чтобы избежать таких ошибок, я рекомендую установить фон на что-то вроде серого с glClearColor
.