2008-08-04 2 views
12

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

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

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

ответ

7

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

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

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

6

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

6

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

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

Вы можете получить фантазию и сделать geometry instancing и т. Д., Но сначала получите основы.

Смежные вопросы