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

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

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

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

3 ответа

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

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

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

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

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

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

    Вы могли бы получить фантазии и сделать геометрию instancing и т.д., Но просто получить основы собирается первым.