Введение в Direct3D8
От: alexandrov_alex США  
Дата: 24.10.01 20:39
Оценка: 255 (5)
Статья:
Введение в Direct3D8

Авторы:
Александров Алексей

Аннотация:
Стандартом де-факто на компьютерах под управлением операционной системы Windows стали две 3D библиотеки: OpenGL и Direct3D (часть библиотеки DirectX). OpenGL, разработанный фирмой Silicon Graphics, уже стал классикой и характеризуется своей устойчивостью и стабильностью интерфейсов. Напротив, Direct3D, детище Microsoft, постоянно изменяется, совершенствуется и двигается вперед. Последняя версия этого продукта имеет номер 8, и это не конец. В этой статье я бы хотел познакомить читателя с некоторыми аспектами использования этого нового продукта, указать на его отличия от предыдущей версии и продемонстрировать его использование для решения одной из весьма распространенных задач — построения графика функции двух переменных. Исходный код примера вы может получить с этого сайта и свободно использовать в своих приложениях.
It's kind of fun to do the impossible (Walt Disney)
ATL vs MFC
От: henson Россия http://www.njt-rails.com
Дата: 25.10.01 20:39
Оценка:
Тут с автором я полностью согласен. Чаще всего DX8 встраивается в программу в виде запчасти, т.е. как компонент и ATL для этого очень подходит, а чистый WinAPI производит удручающее впечатления, т.к. мозг уже привык работать с объектами, а запутанные вызовы разнесенных в разные места функций, вообще ставят в тупик ;-)
Re: ATL vs MFC
От: adontz Грузия http://adontz.wordpress.com/
Дата: 13.11.01 04:06
Оценка:
Ну насчёт разнесёныхх функций давайте не будем...
Не про DirectX сказано будет. Там между прочим COM объекты которых для нормального функционирования нужно штук 5. И это на самом низком уровне...
И какой очень извиняюсь WinAPI когда речь о DirectX 8-|
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Введение в Direct3D8
От: peterbes Россия  
Дата: 08.08.03 11:00
Оценка:
Здравствуйте, Александров Алексей, Вы писали:

АА>Статья:

АА>Введение в Direct3D8

АА>Авторы:

АА> Александров Алексей

АА>Аннотация:

АА>Стандартом де-факто на компьютерах под управлением операционной системы Windows стали две 3D библиотеки: OpenGL и Direct3D (часть библиотеки DirectX). OpenGL, разработанный фирмой Silicon Graphics, уже стал классикой и характеризуется своей устойчивостью и стабильностью интерфейсов. Напротив, Direct3D, детище Microsoft, постоянно изменяется, совершенствуется и двигается вперед. Последняя версия этого продукта имеет номер 8, и это не конец. В этой статье я бы хотел познакомить читателя с некоторыми аспектами использования этого нового продукта, указать на его отличия от предыдущей версии и продемонстрировать его использование для решения одной из весьма распространенных задач — построения графика функции двух переменных. Исходный код примера вы может получить с этого сайта и свободно использовать в своих приложениях.


Отличная статья, отличный пример! Я уже было отчаялся что-либо понять в MSDNе.
Re: Введение в Direct3D8
От: peterbes Россия  
Дата: 08.08.03 12:14
Оценка:
С Vertex-ми мне примерно понятно, мне по, крайней мере, так кажется. А что такое mesh? Как все эти vertex-ы можно преобразовать к mesh-у? Второе, почему при некотором изменении угла наблюдения сцены происходит "съедание" поверхности? C mesh-ом такое не происходит? или я ошибаюсь? C mesh-ом работать удобней? Скорость работы выше?

Еще одна штука которую я хотел бы выяснить — есть ли ограничение количества 3D точек

Вопросы детские, только начал заниматься трехмерной графикой, не пеняйте сильно.
Re[2]: Введение в Direct3D8
От: alexandrov_alex США  
Дата: 08.08.03 13:47
Оценка:
Да я не могу назвать себя таким уж специалистом в трехмерной графике, так больше — любитель. Вертекс буферы и меши не совсем корректно сравнивать. Меш — это просто высокоуровневая надстройка на вертекс буферами. Хорошей аналогией для меша является 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)
Re: Введение в Direct3D8
От: peterbes Россия  
Дата: 11.10.03 07:29
Оценка:
Здравствуйте, 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 кривую, то наступает такой момент когда от кривой начинают "отваливаться куски", вместо того, чтобы увидеть изнанку кривой, мы видим дырку. Плоскость в вашем примере "исчезает", при попытке заглянуть под нее.
Re[2]: Введение в Direct3D8
От: alexandrov_alex США  
Дата: 11.10.03 18:04
Оценка:
Здравствуйте, 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 при установке параметров рендеринга надо добавить

 hr = m_p3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
 ATLASSERT(SUCCEEDED(hr));
 if (FAILED(hr)) {
  return hr;
 }


-- Всего хорошего!
-- Alexandrov Alex, e-mail: alexandrov_alex@fromru.com
Posted via RSDN NNTP Server 1.7 "Bedlam"
It's kind of fun to do the impossible (Walt Disney)