Здавалка
Главная | Обратная связь

Инициализация геометрии – создание вершин: 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 listbd.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.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.