Отображение нескольких кубов в OpenGL с шейдерами - PullRequest
0 голосов
/ 13 октября 2011

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

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

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

1 Ответ

0 голосов
/ 14 октября 2011

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

...