Аннотация:
Стандартом де-факто на компьютерах под управлением операционной системы Windows стали две 3D библиотеки: OpenGL и Direct3D (часть библиотеки DirectX). OpenGL, разработанный фирмой Silicon Graphics, уже стал классикой и характеризуется своей устойчивостью и стабильностью интерфейсов. Напротив, Direct3D, детище Microsoft, постоянно изменяется, совершенствуется и двигается вперед. Последняя версия этого продукта имеет номер 8, и это не конец. В этой статье я бы хотел познакомить читателя с некоторыми аспектами использования этого нового продукта, указать на его отличия от предыдущей версии и продемонстрировать его использование для решения одной из весьма распространенных задач — построения графика функции двух переменных. Исходный код примера вы может получить с этого сайта и свободно использовать в своих приложениях.
It's kind of fun to do the impossible (Walt Disney)
Тут с автором я полностью согласен. Чаще всего DX8 встраивается в программу в виде запчасти, т.е. как компонент и ATL для этого очень подходит, а чистый WinAPI производит удручающее впечатления, т.к. мозг уже привык работать с объектами, а запутанные вызовы разнесенных в разные места функций, вообще ставят в тупик ;-)
Ну насчёт разнесёныхх функций давайте не будем...
Не про DirectX сказано будет. Там между прочим COM объекты которых для нормального функционирования нужно штук 5. И это на самом низком уровне...
И какой очень извиняюсь WinAPI когда речь о DirectX 8-|
Здравствуйте, Александров Алексей, Вы писали:
АА>Статья: АА>Введение в Direct3D8
АА>Авторы: АА> Александров Алексей
АА>Аннотация: АА>Стандартом де-факто на компьютерах под управлением операционной системы Windows стали две 3D библиотеки: OpenGL и Direct3D (часть библиотеки DirectX). OpenGL, разработанный фирмой Silicon Graphics, уже стал классикой и характеризуется своей устойчивостью и стабильностью интерфейсов. Напротив, Direct3D, детище Microsoft, постоянно изменяется, совершенствуется и двигается вперед. Последняя версия этого продукта имеет номер 8, и это не конец. В этой статье я бы хотел познакомить читателя с некоторыми аспектами использования этого нового продукта, указать на его отличия от предыдущей версии и продемонстрировать его использование для решения одной из весьма распространенных задач — построения графика функции двух переменных. Исходный код примера вы может получить с этого сайта и свободно использовать в своих приложениях.
Отличная статья, отличный пример! Я уже было отчаялся что-либо понять в MSDNе.
С Vertex-ми мне примерно понятно, мне по, крайней мере, так кажется. А что такое mesh? Как все эти vertex-ы можно преобразовать к mesh-у? Второе, почему при некотором изменении угла наблюдения сцены происходит "съедание" поверхности? C mesh-ом такое не происходит? или я ошибаюсь? C mesh-ом работать удобней? Скорость работы выше?
Еще одна штука которую я хотел бы выяснить — есть ли ограничение количества 3D точек
Вопросы детские, только начал заниматься трехмерной графикой, не пеняйте сильно.
Да я не могу назвать себя таким уж специалистом в трехмерной графике, так больше — любитель. Вертекс буферы и меши не совсем корректно сравнивать. Меш — это просто высокоуровневая надстройка на вертекс буферами. Хорошей аналогией для меша является XML. Меши — это то же самое. В конечном счете все равно все преобразуется в вертексы. Меши они ведь строго говоря и не относятся к Direct3D, это D3DX — вспомогательная библиотека. А отрисовка все равно делается только с помощью вот этих функция интерфейса IDirect3DDevice8:
DrawIndexedPrimitive
DrawIndexedPrimitiveUP
DrawPrimitive
DrawPrimitiveUP
DrawRectPatch
DrawTriPatch
Я в своей программе не использовал меши, поскольку они наиболее целесообразны, если откуда либо загружаются объекты. В играх, например. А у меня все на лету генерируется, так что вертексов достаточно. По поводу производительности — там в исходниках задается размер массива, на котором функция просчитывается. Можно поменять и посмотреть. Вообще, генерация оптимального набора точек для прорисовки это, я так понимаю, отдельная задача. Нехилая причем...
Posted via RSDN NNTP Server 1.7 beta
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, alexandrov_alex, Вы писали:
_>Статья:
Статья классная, и пример (!!! — нет слов). Но, у вас есть досадные ошибка, дальше по коду:
1.
.....
m_pflGridData = new FLOAT[m_dwPointsPerX * m_dwPointsPerY];
if (!m_pflGridData) {
ClearGrid();
return E_OUTOFMEMORY;
}
......
Таких мест много, если бы вы выделяли память alloc, то вопросов бы не возникало, действительно, при неудачном выделении памяти m_pflGridData оказался бы равным NULL. Для new мне сдается, что указатель при неудачном выделении памяти NULL не возвратит.
2.
Еще, возможно это не ошибка, это я что-то не понимаю, но при MAX_VERTEXES большем 40000 происходит обрезание картинки. А ведь 40 тыс. это прямоугольник 200х200, не такая уж это большая величина
3.
Я новичек в DX, но вот такая у меня штука ( в вашей программе это видно) : если начать вращать 3D кривую, то наступает такой момент когда от кривой начинают "отваливаться куски", вместо того, чтобы увидеть изнанку кривой, мы видим дырку. Плоскость в вашем примере "исчезает", при попытке заглянуть под нее.
Здравствуйте, peterbes, Вы писали:
p> Здравствуйте, alexandrov_alex, Вы писали:
p> Статья классная, и пример (!!! — нет слов).
Спасибо.
[Sorry, skipped]
p> Таких мест много, если бы вы выделяли память alloc, то вопросов бы не p> возникало, действительно, при неудачном выделении памяти m_pflGridData p> оказался бы равным NULL. Для new мне сдается, что указатель при p> неудачном выделении памяти NULL не возвратит.
Цитата из MSDN:
If there is insufficient memory for the allocation request, by default operator new returns NULL. You can change this default behavior by writing a custom exception-handling routine and calling the _set_new_handler run-time library function with your function name as its argument. For more details on this recovery scheme, see The operator new Function.
p> 2. p> Еще, возможно это не ошибка, это я что-то не понимаю, но при p> MAX_VERTEXES большем 40000 происходит обрезание картинки. А ведь 40 тыс. p> это прямоугольник 200х200, не такая уж это большая величина
Да, есть такое дело. Дело в том, что метод DrawPrimitive принимает количество вертексов в DWORD, но максимальное их количество равно D3DMAXNUMVERTICES (0xFFFF). Чтобы это обойти надо по частям рисовать, а для примера это будет больно сложно. Правда, почему-то обрезаться график уже начинает при 40000, это непонятно. Попробую разобраться.
p> 3. p> Я новичек в DX, но вот такая у меня штука ( в вашей программе это видно) p> : если начать вращать 3D кривую, то наступает такой момент когда от p> кривой начинают "отваливаться куски", вместо того, чтобы увидеть изнанку p> кривой, мы видим дырку. Плоскость в вашем примере "исчезает", при p> попытке заглянуть под нее.
В функции C3DGraphic::ReRender при установке параметров рендеринга надо добавить