Delphi + OpenGL

stilet78

Посоветуйте плз доки по сабжу, чтоб попроще и попонятней были.
А вообще что выбрать OpenGL или Direct3d для оконных приложений, где проще всего будет построить такой 3D рисунок?

margadon

Проще OpenGL, по крайней мере в DirectX всё немного сложнее для понимания... Всякие Индекс-массивы, потоки и т.д.

hov77

В индекс массивы не обязательно вникать для такой задачи, просто их использование позволит оптимизировать процесс. Да собственно и вникнуть не так сложно. что сложного если вместо (x1,y1,z1) (x2,y2,z2) , (x3,y3,z3 (x1,y1,z1) записать 1, 2, 3, 1 предварительно объявив что 1 - (x1,y1,z1) и т.д. Не сложнее чем преобразование координат.
Что еще за потоки

margadon

Сорри это я кажись 8-го ДиректХ-а объелся... Да, правда, на таком уровне они одинаковы. Но на ОпенГЛ-е всё же опрятней получается... Всякие структуры и прочая -- упрятаны в последовательные вызовы функций API...
ЗЫ: А эти потоки -- это для меня вообще тёмное место в мануалах... Вроде бы конвейер DirectX умеет обрабатывать много потоков вершин и индексов за раз. Это от VPU зависит... Зачем надо -- не знаю, но какой-то код по этому поводу вроде приходится писать.

hov77

По поводу потоков , тоже можно не заморачиваться , это не нужно для поставленной задачи. Одна моделька которую нужно вывести в разных координатах.
Заполняется буффер вершин ( думаю там понадобится не более 10-20 треугольников ) и далее просто рендерится одна моделька , меняется только матрица ( поворот + перенос ) . Думаю оптимизировать потребуется больше процесс создания матриц для каждого элемента чем расходы на рендеринг. .

okunek

Думаю, оптимизировать вообще ничего не надо будет, несколько сотен фпс обеспечено

stilet78

мне требуется строить около 100*10^3 цилиндров с насаженными на них конусами, и фпс-ы особой роли не играют

hov77

А ты эти цилиндры с конусами объедени в одну модель, зачем их по отдельности рассматривать ...
В максе делаешь модельку экспортируешь в формат, 3ds, там в текстовом виде есть все вершины в нужном порядке.
Можно в *.x файл экспортнуть, вроде как еще проще будет.

stilet78

у них у каждого своя независимые координаты и углы наклона.

hov77

Я понял, для этого и строишь для каждого свою матрицу.
D3D чтобы нарисовать модель достаточно знать набор треугольников и матрицу преобразований.
Т.е. вектор перемещения , поворота и масштабирования.
Модель одна , но рисуешь ее N раз с разной матрицей преобразования. Т.е алгоритм примерно такой


Model = CreateVertexes;
foreach(Items)
{
Matrix = MakeMatrix(Item.x, Item.y, Item.z, Item.Rotatex, Item.Rotatey, Item.RotateZ);
ApplyMatrix(Matrix);
RenderModel(Model);
}

margadon

Блин... Вот только тормозить будет неподецки, если, конечно, на карточке нету кэша геометрии...
Это ж сколько он говорил, 1000 цилиндров?! 1000 раз вызвать ф-ию рисования?! Ну я не знаю, может и быстро будет, но имхо это просто затрахает ускоритель... А не проще ли применить матрицу к модельке, а полученные координаты запихачить в вертекс-буффер и всё сразу отрендерить? Хотя может я и не прав.

hov77

Да, по идее так быстрее получиться если сразу все загнать, вопрос только на сколько , лень проверять, честное слово .
p.s. я так понимаю это все в динамике происходит и заполнять vertex buffer каждый цикл придется, а lock unlock дорого обходятся вот в чем делема.
Оставить комментарий
Имя или ник:
Комментарий: