Эффективный способ рендеринга нескольких меш-объектов в разных позициях с использованием DirectX/C++.

При использовании только одной матрицы перевода несколько сеток перекрываются на экране.

Решение, которое я пробовал, состояло в том, чтобы создать несколько матриц перевода, чтобы установить разные начальные координаты xyz для каждой сетки. Это работает, но этот метод кажется довольно неэффективным с точки зрения количества используемых строк кода. (Окончательный проект, вероятно, будет включать более 20 мешей, поэтому я надеялся, что мне не нужно будет создавать 20 различных матриц перевода, используя в основном один и тот же раздел кода).

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

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

Ниже приведен пример того, как я сейчас визуализирую несколько сеток в разных позициях...

 // initial locations for each mesh
    D3DXVECTOR3 Translate1(-30.0f, 0.0f, 0.0f);                     
    D3DXVECTOR3 Translate2(-30.0f, 10.0f, 0.0f);            
    D3DXVECTOR3 Translate3(0.0f, 0.0f, 0.0f);               
    D3DXVECTOR3 Translate4(0.0f, 10.0f, 0.0f);              

    //set scaling on all x y and z axis
    D3DXVECTOR3 Scaling(g_ScaleX, g_ScaleY, g_ScaleZ);



    /////////////////////////////////////////////////////////////////////////

    // create first transformation matrix
    D3DXMATRIX world1; 

    // create first translation matrix
    D3DXMATRIX matrixTranslate;     

    D3DXMatrixTransformation(&world1, &ScalingCentre, &ScalingRotation, &Scaling, &RotationCentre, &Rotation, &Translate1);

    //D3DXMatrixIdentity(&world1);  // set world1 as current transformation matrix

    // set world1 as current transformation matrix for future meshes
    g_pd3dDevice -> SetTransform(D3DTS_WORLD, &world1);

    // recompute normals
    g_pd3dDevice -> SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);

    // render first mesh
    mesh1.Render(g_pd3dDevice);

    /////////////////////////////////////////////////////////////////////////

    D3DXMATRIX world2;

    D3DXMATRIX matrixTranslate2;


    D3DXMatrixTransformation(&world2, &ScalingCentre, &ScalingRotation, &Scaling, &RotationCentre, &Rotation, &Translate2);


    // set world2 as current transformation matrix for future meshes
    g_pd3dDevice -> SetTransform(D3DTS_WORLD, &world2);

    // render second mesh
    mesh2.Render(g_pd3dDevice);


    ////////////////////////////////////////////////////////////////////////

    D3DXMATRIX world3;

    D3DXMATRIX matrixTranslate3;

    D3DXMatrixTransformation(&world3, &ScalingCentre, &ScalingRotation, &Scaling, &RotationCentre, &Rotation, &Translate3);


    // set world2 as current transformation matrix for future meshes
    g_pd3dDevice -> SetTransform(D3DTS_WORLD, &world3);

     //render thirdmesh
    mesh3.Render(g_pd3dDevice);

    //////////////////////////////////////////////////////////////////////

person Vault13    schedule 14.01.2014    source источник


Ответы (1)


Изменить: я вижу, что под эффективным вы имели в виду «компактный код» (обычно это означает «меньшее использование процессора» :) В этом случае да, я заметил, что вы копируете и вставляете по существу один и тот же код. Почему бы вам не использовать функцию, которая принимает параметры, включая преобразование и сетку? Таким образом, вы можете написать одну функцию, рисующую сетку, и вызывать ее для каждой сетки. Еще лучше также хранить сетки в массиве, а затем выполнять итерацию по массиву, вызывая функцию рисования для каждого элемента. Я думаю, вам следует ознакомиться с базовыми руководствами по C/C++. Радоваться, веселиться!

http://www.cplusplus.com/doc/tutorial/

Оригинальный комментарий:

Стоимость расчета и настройки преобразования намного меньше, чем стоимость рендеринга сетки, поэтому я думаю, что здесь нет проблемы, которую мы можем помочь вам решить. Например, у вас низкая частота кадров?

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

person jd.    schedule 14.01.2014
comment
Привет, jd. Вы делаете хорошее замечание, я перефразировал свой вопрос в исходном сообщении. Спасибо. - person Vault13; 14.01.2014
comment
отредактировано, чтобы ответить на ваш вопрос о кодировании ... вы будете очень довольны, когда разделите эту проблему на части, используя циклы и вызовы функций! - person jd.; 15.01.2014
comment
спасибо jd - я постараюсь разбить это на функциональный подход. Если у меня это сработает, я добавлю сюда небольшой пример, чтобы другие могли сослаться на него. - person Vault13; 15.01.2014