Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.15 Mб
Скачать

Инициализация геометрии – создание вершин: InitGeometry

Теперь зададимся вопросом: предположим у нас имеется задумка о том, что будет из себя представлять наш будущий объект, короче – мы имеем конкретные координаты 3d вершин, имеем их количество а также знаем номера вершин которые будет группироваться в треугольники. Но как все эти данные установить в 3d адаптер в качестве вершинного и индексного буфера?

Ответ несложный. Нужно сначала определить эти данные, потом создать на их основе объект вершинного буфера, и затем просто установить этот вершинный буфер в Direct3D (одновременно может быть установлен только один вершинный буфер – то есть устанавливаем буфер для одной модели, рисуем её, потом устанавливаем для другой, рисуем и т.д. Итак, создадим вершинный буфер:

// Создание геометрии для вершинного буфера

SimpleVertexvertices[] =

{

        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT4( 0.0f, 0.0f, 1.0f, 1.0f ) },

        { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT4( 0.0f, 1.0f, 0.0f, 1.0f ) },

        { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT4( 0.0f, 1.0f, 1.0f, 1.0f ) },

        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT4( 1.0f, 0.0f, 0.0f, 1.0f ) },

        { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT4( 1.0f, 0.0f, 1.0f, 1.0f ) },

        { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT4( 1.0f, 1.0f, 0.0f, 1.0f ) },

        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ) },

        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f ) },

};

D3D11_BUFFER_DESC bd;

ZeroMemory( &bd, sizeof(bd) );

bd.Usage = D3D11_USAGE_DEFAULT;

bd.ByteWidth = sizeof( SimpleVertex ) * 8;

bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;

bd.CPUAccessFlags = 0;

D3D11_SUBRESOURCE_DATA InitData;

ZeroMemory( &InitData, sizeof(InitData) );

InitData.pSysMem = vertices;

hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer );

if( FAILED( hr ) )

returnhr;

Вы наверняка обратили внимание, что входящие данные для буфера – это обычный массив. Так что входящие данные для буфера можно не только заполнять константами, как в примере – а также можно генерировать их в массив динамически или загружать из файла.  Теперь установим этот буфер как вершинный буфер Direct3D по умолчанию:

// Установка вершинного буфера

UINT stride = sizeof( SimpleVertex );

UINT offset = 0;

g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );

Теперь создадим индексный буфер чтобы знать какие вершины группируются в треугольники (полигоны):

// Создание индексного буфера

WORDindices[] =

{

        3,1,0,

        2,1,3,

 

        0,5,4,

        1,5,0,

 

        3,4,7,

        0,4,3,

 

        1,6,5,

        2,6,1,

 

        2,7,6,

        3,7,2,

 

        6,4,5,

        7,4,6,

};

bd.Usage = D3D11_USAGE_DEFAULT;

bd.ByteWidth = sizeof( WORD ) * 36;        // 36 vertices needed for 12 triangles in a triangle list

bd.BindFlags = D3D11_BIND_INDEX_BUFFER;

bd.CPUAccessFlags = 0;

InitData.pSysMem = indices;

hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pIndexBuffer );

Установим индексный буфер и его топологию (она всегда будет одинаковой).

 

// Установка индексного буфера

g_pImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0 );

// Установкатипапримитив

g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

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

g_pImmediateContext->DrawIndexed( 36, 0, 0 );

В параметрах процедуры DrawIndexed передается количество вершин в модели.

На этом функция InitGeometry завершена и мы можем смело приступать к функции Render, где мы каждый кадр отобразим нашу модель. В нашем уроке модель представляет из себя куб. У него 8 вершин, однако чтобы образовать сплошной куб их надо соеденить 12-ю полигонами. Также не будем забывать что в Direct3D версии 11 не обойтись без шейдеров и мы уже загрузили код шейдера в нашу программу, так что бегло рассмотрим этот код, после того как разберемся с содержимым Render.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]