Сообщения на форуме пользователя Andrey (142 стр.)
Своя замена D3DX. Зачем? | 29 мар. 2007 | 10:45 | #8 |
---|
antber
>В добавок это избавляет от привязки к d3dx9_xx.dll и теоретически программа будет работать на самом первом DirectX 9 - хотя >не знаю нужно ли это кому
вроде бы там только ID3DXFont и ID3DXSprite и скорей всего ID3DXLine.
Полностью заменить не получиться ведь D3DXCompileShader, D3DXAssemblerShader и все функции для работы с шейдерами находятся в D3Dx9.
>В добавок это избавляет от привязки к d3dx9_xx.dll и теоретически программа будет работать на самом первом DirectX 9 - хотя >не знаю нужно ли это кому
вроде бы там только ID3DXFont и ID3DXSprite и скорей всего ID3DXLine.
Полностью заменить не получиться ведь D3DXCompileShader, D3DXAssemblerShader и все функции для работы с шейдерами находятся в D3Dx9.
Вышел TAO 2.0. Помогите разобраться какие расширения OpenGL я могу на нем использовать. Там есть Cg 1.4.1. | 28 мар. 2007 | 16:56 | #9 |
---|
MoRLOK
>Неужели такое уж Г этот 1.4.1?
он уже устарел в последнем обновлении возможно все поправили, появились новые профили компиляции.
Cg 1.5 будет работать получше и у всех. Кстати он уже не совместим с 1.4.1
>Неужели такое уж Г этот 1.4.1?
он уже устарел в последнем обновлении возможно все поправили, появились новые профили компиляции.
Cg 1.5 будет работать получше и у всех. Кстати он уже не совместим с 1.4.1
Вышел TAO 2.0. Помогите разобраться какие расширения OpenGL я могу на нем использовать. Там есть Cg 1.4.1. | 28 мар. 2007 | 15:56 | #7 |
---|
MoRLOK
>Там есть Cg 1.4.1.
выкинь этот пещерный век... уже есть обновление за февраль 2007
http://developer.nvidia.com/object/cg_toolkit.html
и видать тему надо перенести в раздел графика
RPGman
>Выбрось каку.
>Ориентируйся на GLSL. Это, по крайней мере, стандарт. Да и на вид почти то же самое.
ну почему как? для некоторых задач пойдет...
>Там есть Cg 1.4.1.
выкинь этот пещерный век... уже есть обновление за февраль 2007
http://developer.nvidia.com/object/cg_toolkit.html
и видать тему надо перенести в раздел графика
RPGman
>Выбрось каку.
>Ориентируйся на GLSL. Это, по крайней мере, стандарт. Да и на вид почти то же самое.
ну почему как? для некоторых задач пойдет...
Демка ландшафта с лодами. | 28 мар. 2007 | 14:01 | #39 |
---|
MoRLOK
Не переживай :) у меня дублирование вершин поэтому памяти много ушло..
OpenGL все-таки в плане рендеринга геометрии быстрей :)
Не переживай :) у меня дублирование вершин поэтому памяти много ушло..
OpenGL все-таки в плане рендеринга геометрии быстрей :)
Почему в C++ многие не пользуются exception'aми ??? | 28 мар. 2007 | 11:03 | #224 |
---|
slyfox
ну я поменял... С++ исключения немного затормаживают код, особенно при частом их злоупотреблении, лишние инструкции компилятор вставляет. Не спроста в boost к примеру, luabind есть опции BOOST_NO_EXCEPTIONS, LUABIND_NO_EXCEPTIONS. Да и сами реализации STL к примеру имееют подобные макросы.
На конечном релизи проекта их лучше убирать(ну при обработке ошибок использовать другие способы). При возникновении C++ исключения и при отсутствии их поддержки(опция компилятора) оно будет перехвачено __try...__except для Win32 либо нужно обработать сигнал в Unix системах, про сигналы я могу ошибаться. Для win32 платформ желательно главный цикл,загрузку деинициализацию обернуть в __try __except для перехвата системных исключений(access violation и т.д.). В таком случае движок
корректно обработает фатальные ошибки и завершит работу.
Возможно многие будут не согласны с этим.
ну я поменял... С++ исключения немного затормаживают код, особенно при частом их злоупотреблении, лишние инструкции компилятор вставляет. Не спроста в boost к примеру, luabind есть опции BOOST_NO_EXCEPTIONS, LUABIND_NO_EXCEPTIONS. Да и сами реализации STL к примеру имееют подобные макросы.
На конечном релизи проекта их лучше убирать(ну при обработке ошибок использовать другие способы). При возникновении C++ исключения и при отсутствии их поддержки(опция компилятора) оно будет перехвачено __try...__except для Win32 либо нужно обработать сигнал в Unix системах, про сигналы я могу ошибаться. Для win32 платформ желательно главный цикл,загрузку деинициализацию обернуть в __try __except для перехвата системных исключений(access violation и т.д.). В таком случае движок
корректно обработает фатальные ошибки и завершит работу.
Возможно многие будут не согласны с этим.
Демка ландшафта с лодами. | 28 мар. 2007 | 10:46 | #37 |
---|
Спасибо всем за тесты!!!
итак работает быстро.
На данный момент попробую убрать дублирование вершин. после этогго исправления думаю скорость повысится.
И исправить ошибку с рендерингом на старых картах под Direct3D.
Думаю как заделать дыры...
итак работает быстро.
На данный момент попробую убрать дублирование вершин. после этогго исправления думаю скорость повысится.
И исправить ошибку с рендерингом на старых картах под Direct3D.
Думаю как заделать дыры...
Демка ландшафта с лодами. | 27 мар. 2007 | 19:10 | #32 |
---|
Mikle
>Что-то маловато, у меня ландшафт на 500к дает 30 fps при двух текстурах и просчитанном лайтмэпе, причем эти 500к - >фрагмент из бОльшего, практически неограниченного ландшафта.
ну в 4 раза же не понизится у меня FPS если я добавлю еще пару текстур?
>Это все на D3D, на OGL вообще ничего не показывает, только текст.
а лог не покажешь?
>Что-то маловато, у меня ландшафт на 500к дает 30 fps при двух текстурах и просчитанном лайтмэпе, причем эти 500к - >фрагмент из бОльшего, практически неограниченного ландшафта.
ну в 4 раза же не понизится у меня FPS если я добавлю еще пару текстур?
>Это все на D3D, на OGL вообще ничего не показывает, только текст.
а лог не покажешь?
Демка ландшафта с лодами. | 27 мар. 2007 | 16:45 | #29 |
---|
dave
ну тогда грузится не буду ROAM тормоз, сложен в реализации и уже устарел :)
ну тогда грузится не буду ROAM тормоз, сложен в реализации и уже устарел :)
Демка ландшафта с лодами. | 27 мар. 2007 | 16:41 | #28 |
---|
>Для каждого лода считаешь максимальную ошибку (отклонение ЛОДа от full res).
>Потом эту ошибку проецируешь на экран, получаешь ошибку, выраженную в пикселях.
>А потом уже выбераешь ЛОД с подходящей ошибкой.
>Такой способ лучше для юзера в плане перцепции, но могут быть такие случаи, когда патч будет рисоваться с большим разрешением, чем у >тебя сейчас.
ну а формулу общую с моими данными к примеру на словах слишком туманно.
что такое максимальная ошибка ЛОДА
Как спроецировать ошибку на экран?
как выбирать лод с подходящей ошибкой?
В книге Снука такая формула:
E * S
_____ > L
Split ? =
D
>Потом эту ошибку проецируешь на экран, получаешь ошибку, выраженную в пикселях.
>А потом уже выбераешь ЛОД с подходящей ошибкой.
>Такой способ лучше для юзера в плане перцепции, но могут быть такие случаи, когда патч будет рисоваться с большим разрешением, чем у >тебя сейчас.
ну а формулу общую с моими данными к примеру на словах слишком туманно.
что такое максимальная ошибка ЛОДА
Как спроецировать ошибку на экран?
как выбирать лод с подходящей ошибкой?
В книге Снука такая формула:
E * S
_____ > L
Split ? =
D
E - метрика ошибки;
S - масшаб ошибки;
D - расстояние до наблюдателя;
L-предел отношения;
Что нибудь похожее на твой способ есть?
Демка ландшафта с лодами. | 27 мар. 2007 | 16:20 | #25 |
---|
>А ты используешь Screen space error для определния ЛОДа, или просто удаленность от камеры?
не скорей всего удаленность от камеры :) вот участок кода для уяснения:
Я так понял не совсем это точно? объясни про Screen space error
не скорей всего удаленность от камеры :) вот участок кода для уяснения:
//отображение узла void OctreeNode::Draw() const { if (!render) { return; } //отображение bounding box'а if (DrawBox) { debugBoxes.push_back(&localBoundingBox); } // квадрат расстояния от центра узла до камеры LodInfo::curSqDistance = Math3D::Math::DistanceSq(render->GetCamera().GetPosition(), localBoundingBox.GetCenter()); // поиск подходящего лода lodInfo_t::const_iterator info = std::find_if(lodInfo->begin(), lodInfo->end(), &LodInfo::FindDistance); // стартовая вершина size_t startVertex = 0; // информация о лоде найдена if (info != lodInfo->end()) { const LodInfo &lInfo = *info; render->SetIndexBuffer(lInfo.lodIndexBuffer); // текущее число полигонов curNumPolygons = lInfo.NumPolygons; // пересчет стартовой вершины startVertex = StartVertex / lInfo.kStartVertex; } else { render->SetIndexBuffer(octreeIndexBuffer); // число полигонов curNumPolygons = NumPolygons; // стартовая вершина startVertex = StartVertex; } render->DrawIndexedPrimitive(Render::TRIANGLE_LIST, 0, OffsetIndices, TotalNumVertex, startVertex, curNumPolygons); } |
Демка ландшафта с лодами. | 27 мар. 2007 | 15:46 | #23 |
---|
Asgard
>Для работы с ландшафтом 512х512 INDEX32 (DWORD) не требуется, тем более, так как у тебя (сам так же делаю), делай INDEX16 >(WORD).
не хватит для 512x512 INDEX16 считаем если у меня поправлено дублирование вершин:
512*512 + 512 = 262656;
2^16 - 1 = 65535 - столько индексов только умещается в unsigned short.
Правильно посчитал?
сейчас у меня вообще неправильно(но просто как начинал сделал так) 512 * 512 * 3.
>Во-втоорых, убирай дублирование вершин,
Про дублирование вершин пост 1 :) это я знаю.
>и вообще, у тебя что, несколько VB? Убирай нафиг, делай один VB, несколько IB (по >одному на уровень ЛОДа),
У меня как раз 1 большой IB на весь ландшафт ;) а вот IB несколько больших(тоже на весь ландшафт) на каждый лод.
>причём IB должен рисовать только один кусок ландшафта, а там потом сдвигай индексы и нарисуется >весь ландшафт, памяти
>кушает заметно меньше!
понятно просто это усложнится немного отрисовка но подумать можно. IB то 1 и тот-же. Просто смещение внутри VB будет.
>А как ты индексбуффер для ЛОДа считаешь? Просто прореживанием каждой второй вершины?
>Если так, то годится ИМХО только для достаточно гладких рельефов.
да нет к примеру если размер листа 64x64 то там будет 6 уровней лодов(2^6 = 64) и 6 индексных буферов. итого
numLod = log2(width), где width - размер листа дерева.
соответственно размер каждого IB будет меняться в 4 раза.
>С OpenGL запустилось только в фулскрине. Выдает около 50 фпс (ну от такой видюхи больше ждать не стоит).
понятно в общем. Тут проблема с методом DrawIndexedPrimitive там еще неправильно передается число вершин учавствующих в отрисовке(4 параметр). Сейчас я передаю все вершины ландшафта(с учетом что они у меня еще и дублируются!!). вот и ругается на D3DCAPA9.MaxPrimiitveCount. Может кто поможет с этим?
>Дырки выглядят >страшновато, наверное не стоит делать такие резкие переходы в детализации - с 1 клетки сразу на 4. И еще есть вариант - >пускать по краю каждого "куска" ландшафта вертикальные треугольники - чтобы дырки были не так заметны.
про вертикальные треугольники понятно. Это 1 из способов. Вот я подумываю о геоморфинге в шейдере. Или добавление вертикальных полигонов возможно будет проще и быстрей.
Про переход с 1 клетки на 4 хм... можно подумать.
Но возможно заделывание дыр это все скроет + более точно подобрать момент перехода. Сейчас у меня просто считается квадрат расстония до центра узла, по нему ищется в массвие подходящий лод.
>Для работы с ландшафтом 512х512 INDEX32 (DWORD) не требуется, тем более, так как у тебя (сам так же делаю), делай INDEX16 >(WORD).
не хватит для 512x512 INDEX16 считаем если у меня поправлено дублирование вершин:
512*512 + 512 = 262656;
2^16 - 1 = 65535 - столько индексов только умещается в unsigned short.
Правильно посчитал?
сейчас у меня вообще неправильно(но просто как начинал сделал так) 512 * 512 * 3.
>Во-втоорых, убирай дублирование вершин,
Про дублирование вершин пост 1 :) это я знаю.
>и вообще, у тебя что, несколько VB? Убирай нафиг, делай один VB, несколько IB (по >одному на уровень ЛОДа),
У меня как раз 1 большой IB на весь ландшафт ;) а вот IB несколько больших(тоже на весь ландшафт) на каждый лод.
>причём IB должен рисовать только один кусок ландшафта, а там потом сдвигай индексы и нарисуется >весь ландшафт, памяти
>кушает заметно меньше!
понятно просто это усложнится немного отрисовка но подумать можно. IB то 1 и тот-же. Просто смещение внутри VB будет.
>А как ты индексбуффер для ЛОДа считаешь? Просто прореживанием каждой второй вершины?
>Если так, то годится ИМХО только для достаточно гладких рельефов.
да нет к примеру если размер листа 64x64 то там будет 6 уровней лодов(2^6 = 64) и 6 индексных буферов. итого
numLod = log2(width), где width - размер листа дерева.
соответственно размер каждого IB будет меняться в 4 раза.
>С OpenGL запустилось только в фулскрине. Выдает около 50 фпс (ну от такой видюхи больше ждать не стоит).
понятно в общем. Тут проблема с методом DrawIndexedPrimitive там еще неправильно передается число вершин учавствующих в отрисовке(4 параметр). Сейчас я передаю все вершины ландшафта(с учетом что они у меня еще и дублируются!!). вот и ругается на D3DCAPA9.MaxPrimiitveCount. Может кто поможет с этим?
>Дырки выглядят >страшновато, наверное не стоит делать такие резкие переходы в детализации - с 1 клетки сразу на 4. И еще есть вариант - >пускать по краю каждого "куска" ландшафта вертикальные треугольники - чтобы дырки были не так заметны.
про вертикальные треугольники понятно. Это 1 из способов. Вот я подумываю о геоморфинге в шейдере. Или добавление вертикальных полигонов возможно будет проще и быстрей.
Про переход с 1 клетки на 4 хм... можно подумать.
Но возможно заделывание дыр это все скроет + более точно подобрать момент перехода. Сейчас у меня просто считается квадрат расстония до центра узла, по нему ищется в массвие подходящий лод.
Демка ландшафта с лодами. | 27 мар. 2007 | 14:10 | #19 |
---|
VileDog(ck.UA)
ну а лог под OpenGL ? хотя там все понятно не хватает памяти...
ошибку с дублирование вершин и передачей числа вершин для Direct3D надо срочно исправлять.
ну а лог под OpenGL ? хотя там все понятно не хватает памяти...
ошибку с дублирование вершин и передачей числа вершин для Direct3D надо срочно исправлять.
Демка ландшафта с лодами. | 27 мар. 2007 | 11:06 | #16 |
---|
LEVelSi
>Только черный экран, ниче кроме текста не рисуется. Возможно из-за INDEX32. или 50-метровый буфер не влезает в >видеопамять.
попробуй запустить в OpenGL :) в render.cfg подправь имя рендера на "OpenGL".
просто есть еще 1 ошибка в Direct3D нужно передавать число вершин, я передаю слишком много тут и D3DCAPA9.MaxPrimiitveCount дает ограничение и ландшафт не рендерится.
Спасибо за тест.
Asgard
Спасибо за тест и критику. Прокоментирую ее:
>размер ландшафта какой?
512x512
>-Ландшафт несколько угловат, правда в большинстве случаев это обусловлено фиговыми картами высот, я перешёл на >16-битные RAW, и получаю очень гладенькие ландшафтики с довольно большим диапазоном высот
это не из-за битности что-то я накосячил при загрузки карты высот или при построении вершинного буфера
загрузка карт любой битности тоже поддерживается :) но там вроде тоже есть ошибочка :(
>аццкая работа с памятью, особливо в OpenGL, аж 73 мегабайта
читал первый пост ;) ? дублирование вершин в вершинном буфере :) ...
>-управление - видать не юзал DirectInput, хотя и без него можно толково сделать, но это мелочи, научишься...
так учиться этому не нужно в движке у меня нормальное управление через Direct Input, в тестовом проекте ландшафта я это просто не вставил :), посчитав лишним и обошелся просто тормознутыми обработчиками виндовых сообщений.
>В принципе, если это первое что ты вообще сделал, то жить мона, скорости приличные, хотя потом при толковом >текстурировании (сплаттинг), начнёт падать, так что оптимизируй дальше!
ну как не совсем первое есть уже опыт... Но сам понимаешь рендеринг ландшафта не совсем тривиальная задача.
>Только черный экран, ниче кроме текста не рисуется. Возможно из-за INDEX32. или 50-метровый буфер не влезает в >видеопамять.
попробуй запустить в OpenGL :) в render.cfg подправь имя рендера на "OpenGL".
просто есть еще 1 ошибка в Direct3D нужно передавать число вершин, я передаю слишком много тут и D3DCAPA9.MaxPrimiitveCount дает ограничение и ландшафт не рендерится.
Спасибо за тест.
Asgard
Спасибо за тест и критику. Прокоментирую ее:
>размер ландшафта какой?
512x512
>-Ландшафт несколько угловат, правда в большинстве случаев это обусловлено фиговыми картами высот, я перешёл на >16-битные RAW, и получаю очень гладенькие ландшафтики с довольно большим диапазоном высот
это не из-за битности что-то я накосячил при загрузки карты высот или при построении вершинного буфера
загрузка карт любой битности тоже поддерживается :) но там вроде тоже есть ошибочка :(
>аццкая работа с памятью, особливо в OpenGL, аж 73 мегабайта
читал первый пост ;) ? дублирование вершин в вершинном буфере :) ...
>-управление - видать не юзал DirectInput, хотя и без него можно толково сделать, но это мелочи, научишься...
так учиться этому не нужно в движке у меня нормальное управление через Direct Input, в тестовом проекте ландшафта я это просто не вставил :), посчитав лишним и обошелся просто тормознутыми обработчиками виндовых сообщений.
>В принципе, если это первое что ты вообще сделал, то жить мона, скорости приличные, хотя потом при толковом >текстурировании (сплаттинг), начнёт падать, так что оптимизируй дальше!
ну как не совсем первое есть уже опыт... Но сам понимаешь рендеринг ландшафта не совсем тривиальная задача.
Демка ландшафта с лодами. | 26 мар. 2007 | 16:45 | #12 |
---|
eHomo
сюда
сюда