Отображение нескольких кубов в OpenGL с помощью шейдеров

Я новичок в OpenGL и шейдерах. У меня есть проект, который включает использование шейдеров для отображения кубов.

Итак, в основном я должен отображать восемь кубов, используя перспективную проекцию в (+-10, +-10, +-10) от начала координат, каждый в другом цвете. Другими словами, будет куб с центром в (10, 10, 10), другой с центром в (10, 10, -10) и так далее. Всего 8 комбинаций (+-10, +-10, +-10). И затем я должен предоставить ключевую команду «c», которая меняет цвет всех кубов при каждом нажатии клавиши.

Пока мне удалось сделать один куб в начале координат. Я знаю, что должен использовать этот куб и преобразовать его для создания восьми кубов, но я не уверен, как бы я это сделал. Кто-нибудь знает, как бы я поступил с этим?


person user974036    schedule 13.10.2011    source источник
comment
Это слишком широкий вопрос для переполнения стека, но я поддерживаю серию руководств, которые вы могли бы использовать. Вы узнаете все, что вам нужно, из Урока 7.   -  person Nicol Bolas    schedule 13.10.2011
comment
Вам просто нужно передать матрицу в вершинный шейдер. Измените матрицу для каждого куба, который вы хотите нарисовать (перевод). Кроме того, если вы хотите изменить цвет, вам также понадобится переменная цвета для передачи в ваш вершинный шейдер. Как говорит Николь, для такого рода вещей доступно множество учебных пособий.   -  person Robinson    schedule 13.10.2011


Ответы (1)


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