Отображение 100 плавающих кубов с использованием DirectX OR OpenGL
Я хотел бы отображать ~ 100 плавающих кубов, используя DirectX
или OpenGL
.
Я ищу либо образец исходного кода, либо описание этой техники. Я знаю, что это легко для вас, "гуру" 3D, но у меня достаточно проблем с получением одного куба для правильного отображения.
Я прочел сеть для хорошей серии обучающих программ, и хотя они говорят о том, как сделать примитивы 3D
, то, что я не могу найти, это информация о том, как делать большие числа примитивов 3D
- cubes
, spheres
, pyramids
и т.д.
Ответы
Ответ 1
Вы говорите, что у вас достаточно проблем с получением одного куба для отображения... поэтому я не уверен, есть ли у вас его для показа или нет.
В принципе... поставьте свой код для записи куба в одну функцию, а затем просто вызовите эту функцию 100 раз.
void DrawCube()
{
//code to draw the cube
}
void DisplayCubes()
{
for(int i = 0; i < 10; ++i)
{
for(int j = 0; j < 10; ++j)
{
glPushMatrix();
//alter these values depending on the size of your cubes.
//This call makes sure that your cubes aren't drawn overtop of each other
glTranslatef(i*5.0, j*5.0, 0);
DrawCube();
glPopMatrix();
}
}
}
Это основной план того, как вы могли бы это сделать. Если вы хотите что-то более эффективное, посмотрите в Дисплейные списки когда-нибудь, как только вы выяснили основы:)
Ответ 2
Просто используйте glTranslatef (или эквивалент DirectX), чтобы нарисовать куб, используя тот же код, но перемещая относительную точку, где вы его рисуете. Возможно, есть лучший способ сделать это, хотя я довольно новичок в OpenGL. Обязательно установите свою точку обзора, чтобы вы могли видеть их все.
Ответ 3
Да, если бы вы были эффективны, вы бы выбросили все в один и тот же буфер вершин, но я не думаю, что рисование 100 кубов приведет к выпуску любого графического процессора, произведенного за последние 5 лет, так что вы должны хорошо следить за приведенными выше предложениями.
Напишите базовый проход через шейдерный шейдер, тень, однако вы желаете в пиксельном шейдере. Либо передайте в мировой матрице и выполните перевод в вершинном шейдере, либо просто вычислите позиции вершин пространства мира на стороне процессора (сделайте это, если ваши кубы будут оставаться фиксированными).
Вы можете получить фантазию и сделать геометрию instancing и т.д., но просто сначала начните основы.