Отображение 100 плавающих кубов с использованием DirectX ИЛИ OpenGL - PullRequest
15 голосов
/ 04 августа 2008

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

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

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

Ответы [ 3 ]

8 голосов
/ 04 августа 2008

Вы говорите, что у вас достаточно проблем с отображением одного куба ... поэтому я не уверен, есть ли у вас один для отображения или нет.

По сути ... поместите код для написания куба в одну функцию, затем просто вызовите эту функцию 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();
         }
    }              
}

Это основная схема того, как вы могли бы сделать это. Если вы хотите что-то более эффективное, взгляните на списки отображения, как только разберетесь с основами:)

7 голосов
/ 04 августа 2008

Просто используйте glTranslatef (или эквивалент DirectX), чтобы нарисовать куб, используя тот же код, но перемещая относительную точку, где вы его рисуете. Возможно, есть лучший способ сделать это, хотя я довольно новичок в OpenGL. Обязательно установите точку обзора, чтобы вы могли видеть их все.

6 голосов
/ 19 августа 2008

Да, если бы вы работали эффективно, вы бы бросили все в один и тот же вершинный буфер, но я не думаю, что рисование 100 кубов приведет к увеличению производительности любого графического процессора, созданного за последние 5 лет, так что вы должны быть в порядке, следуя советам выше .

Напишите базовый проход через вершинный шейдер, затеняйте как хотите в пиксельном шейдере. Либо передайте матрицу мира и выполните перевод в вершинном шейдере, либо просто вычислите позиции вершин мирового пространства на стороне процессора (сделайте это, если ваши кубы останутся фиксированными).

Вы можете проявить фантазию и сделать создание экземпляров геометрии и т. Д., Но сначала начните с основ.

...