Кто может сказать мне, что делает этот бит C ++? - PullRequest
2 голосов
/ 07 декабря 2009
CUSTOMVERTEX* pVertexArray;

if( FAILED( m_pVB->Lock( 0, 0, (void**)&pVertexArray, 0 ) ) ) {
    return E_FAIL;
}


pVertexArray[0].position = D3DXVECTOR3(-1.0, -1.0,  1.0);
pVertexArray[1].position = D3DXVECTOR3(-1.0,  1.0,  1.0);
pVertexArray[2].position = D3DXVECTOR3( 1.0, -1.0,  1.0);
...

Я некоторое время не касался C ++ - отсюда и тема, но этот кусочек кода сбивает меня с толку. После вызова m_pVB-> Lock массив инициализируется.

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

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

Может кто-нибудь прояснить это?

Edit:

Учитывая ответы, откуда он знает, что мне требуется девять элементов в массиве или четыре и т. Д ...?

Так что, пока буфер достаточно большой, элементы являются законными. Если это так, этот код устанавливает размер буфера, если я не ошибаюсь.

if( FAILED( m_pd3dDevice->CreateVertexBuffer( vertexCount * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) ) {
        return E_FAIL;
}

Ответы [ 5 ]

5 голосов
/ 08 декабря 2009

m_pVB указывает на графический объект, в данном случае, предположительно, на вершинный буфер. Данные, хранящиеся в этом объекте, как правило, не будут находиться в доступной для ЦП памяти - они могут храниться во встроенной памяти вашего графического оборудования или вообще не выделяться; и он может использоваться GPU в любое конкретное время; поэтому, если вы хотите читать из него или записывать в него, вам нужно сообщить об этом вашей графической подсистеме, и именно это делает функция Lock () - синхронизируйте с графическим процессором, убедитесь, что в основной памяти достаточно буфера для данных и он содержит данные, которые вы ожидаете в данный момент с точки зрения процессора, и возвращает вам указатель на эту основную память. Должен быть соответствующий вызов Unlock (), чтобы сообщить графическому процессору, что вы закончили чтение / изменение объекта.

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

1 голос
/ 08 декабря 2009

Когда вы создали буфер вершин, вы должны были указать размер. Когда вы вызываете Lock (), вы передаете 0 в качестве размера для блокировки, что говорит ему о необходимости блокировать весь размер буфера вершин.

1 голос
/ 08 декабря 2009

Вы задаете неправильный вопрос, это не то, как он узнает, что вам требуются х объектов, а то, как вы знаете, что ИТ требует х объектов. Вы передаете указатель на указатель на вашу структуру в, и функция возвращает указатель на вашу структуру, уже размещенную в памяти (с момента первой инициализации буфера вершин). Все всегда есть, вы просто запрашиваете указатель на массив для работы с ним, затем «отпускаете его», чтобы dx знал, что нужно прочитать буфер вершин и загрузить его в gpu.

1 голос
/ 08 декабря 2009

Чтобы изменить буфер вершин в DX, вы должны заблокировать его. Для обеспечения этого DX API будет раскрывать внутренности VB только через вызов Lock.

Ваш код передает адрес pVertexArray, который Lock указывает на внутренние данные VB. Затем код переходит к изменению данных вершин, предположительно при подготовке к визуализации.

1 голос
/ 07 декабря 2009

Вы вставляете указатель на указатель CUSTOMVERTEX (указатель на указатель) в функцию блокировки, поэтому сама блокировка должна / должна создавать объект CUSTOMVERTEX и устанавливать указатель так, чтобы он указывал на объект, который она создает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...