Direct3D Sprite-> SetTransform использование? - PullRequest
2 голосов
/ 08 февраля 2010

Я рисую текстуры, используя D3DXSprite.
Я хочу преобразовать их (вращать, масштабировать и т. Д.), Поэтому я использую метод SetTransfrom.
Должен ли я сохранить старое преобразование -> установить новое -> рисовать -> установить старый?У меня есть класс спрайта, который заботится о методах Draw и Update.Я имею в виду что-то вроде этого:

D3DXMatrix oldMatrix;
sprite->GetTransfrom(&oldMatrix);

D3DXMatrix newMatrix;
D3DXMatrixScaling(&newMatrix, 2.0f, 2.0f, 0.0f);

sprite->SetTransform(&newMatrix);
sprite->Draw(...);

sprite->SetTransform(&oldMatrix);

Хорошо / Плохо?

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

TBH рисование 2 три (я предполагаю, что это то, из чего сделан ваш спрайт), изменение трансформации и рисование ОЧЕНЬ неэффективно.

Вам гораздо лучше вручную преобразовать 4 вершины в 1 большой динамический буфер вершин и рендерить все в один. То же самое касается текстур, применяемых к спрайтам. Хранение их в одной большой текстуре избавит вас от многих изменений состояния и позволит в целом выполнять рендеринг намного быстрее.

Редактировать: Выполнение нескольких вызовов DrawPrimitive / DrawIndexedPrimitive выполняется очень медленно. Для каждой установленной вами матрицы вам нужно сделать отдельный вызов отрисовки. Чтобы избежать этого, нужно применить свою матрицу к каждой из 4 вершин самостоятельно, а затем скопировать их в уже преобразованный буфер вершин. Это означает, что вы можете сделать один вызов с помощью набора матриц идентичного мира.

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

Очень маловероятно, однако, что он абстрагируется от проблемы с текстурой. Таким образом, было бы лучше хранить все кадры спрайта в одной текстуре (и, возможно, все кадры нескольких спрайтов в одной текстуре). Так что в этом случае вам лучше всего передать одну IDirect3DTexture и установить pSrcRect в подстекло, в котором вы когда-либо находились, вместо использования отдельных текстур. Чем меньше текстур вы используете, тем лучше будет производительность.

1 голос
/ 08 февраля 2010

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

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

...