Как уже упоминалось, этот вопрос слишком широк. Но вы сказали, что вам удалось нарисовать один куб, так что я могу предположить, что вы можете настроить камеру и свое окно. Остается только понять, как визуализировать 8 кубов. Есть много способов сделать это, но я упомяну 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
.
person
Raven
schedule
14.10.2011