Подтвердить что ты не робот

Отображение 100 плавающих кубов с использованием DirectX OR OpenGL

Я хотел бы отображать ~ 100 плавающих кубов, используя DirectX или OpenGL.

Я ищу либо образец исходного кода, либо описание этой техники. Я знаю, что это легко для вас, "гуру" 3D, но у меня достаточно проблем с получением одного куба для правильного отображения.

Я прочел сеть для хорошей серии обучающих программ, и хотя они говорят о том, как сделать примитивы 3D, то, что я не могу найти, это информация о том, как делать большие числа примитивов 3D - cubes, spheres, pyramids и т.д.

4b9b3361

Ответ 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 и т.д., но просто сначала начните основы.