Введение в 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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.