![]() |
Ответ: Sigel
Эх как обычно у меня не запустилось! :(
|
Ответ: Sigel
-=SCiP=- логи давай. файл sigel.log
|
Ответ: Sigel
работает, ФПС скачет от 2,5 до 3,5к
|
Ответ: Sigel
а разница на глаз заметна между режимами? (1,2)?
|
Ответ: Sigel
не заметна...
|
Ответ: Sigel
добавил команды проецирования на экран.
camera::Project. может принимать три флоата, ссылку на трехмерный вектор или ссылку на объект (Entity). результат записывает в последний параметр - трехмерный вектор. пример: Код:
Vector3D result; |
Ответ: Sigel
А почему в 3д вектор, а не в 2д? Зачем возвращаемая Z?
|
Ответ: Sigel
чтобы определить удалось спроецировать на экран или нет. если объект у нас за спиной то z будет 0, если видим - то 1. правда оно пока глючит.
скорость на моей машине 100к проецирований делаются за 34-37мс. не очень шустро. для сравнения, на блице тоже количество - за 19 мс выполняется. |
Ответ: Sigel
HolyDel, дык в блице функция возвращения видим/нет, отдельна ведь (EntityInView).
Хотя там ведь вроде если не в камере, тогда будут по нулям возвращаться? А у тебя как понял будет за экран выходить? Если да - то это очень удобно! |
Ответ: Sigel
ну да. за экран выходит. но и в блице тоже выходит за экран. т.е. в том примере если бы даже объект не было видно (например он справа за экраном) кусок текста все равно бы торчал.
но это работает только до тех пор, пока объект ПЕРЕД камерой - когда он ЗА камерой - результат не определен. у меня скорее всего будет два варианта определения видимости объекта (аналог EntityInView) 1 - на основе фрустум куллинга (плоскости отсечения тоже считаются) 2 - на основе попиксельного запроса (т.е будет рисоваться объект, и считаться сколько пикселей прошли Z-тест, если больше 0 - объект видим). естественно 1 намного быстрее 2. |
Ответ: Sigel
Цитата:
Насколько я помню, EntityInView определяет видимость объекта в камере, т.е. в некоем конусе видимости, доступном камере (бокового зрения у неё нет). ProjectedZ() же свидетельствует о позиции объекта по локальной оси аппликат относительно камеры в разбросе 1;0. Т.е. для двигающихся линией ботов каждый имеет истинную аппликату для каждого, но ложную сущность_во_взгляде. :) :) /|\ /|\ / \ / \ |
Ответ: Sigel
аналог EntityInView сделал.
пример: Код:
if(megaboss->InView()) |
Ответ: Sigel
ммм... а InView чего? Кто его видит? У меня, к приимеру, это идёт как Entity::InView(Camera cam) и проверяет, видит ли эту ентитю указанная камера.
|
Ответ: Sigel
-=Jack=-, и то правда. я просто пока с многокамерами не возился. а так да, по идее надо задавать камеру.
|
Ответ: Sigel
добавил 4 новых типа блендинга.
Цитата:
BM_MAX, BM_MIN я думаю из названия понятно. выбирается соотвесвенно максимальное и минимальное значение компоненты пикселя. того, который рисуем и того, на котором рисуем. аналог lighter color и darker color из фотошопа. BM_DECAL - нужен для записи в текстуру с альфой. цвет пишется как с обычной полупрозрачностью. а альфа складывается. |
Ответ: Sigel
DETAIL переименуй на OVERLAY, так более интуитивно понятно. Сужу по разным графическим редакторам и т.д. OVERLAY подрузумевается под перемножением.
FFP развиваешь? Я бы делал ставку на более непривязанные фичи чем к FFP, всёравно нынче FFP не используется практически вообще.. |
Ответ: Sigel
ок. пусть будет BM_OVERLAY
это не только для FFP. |
Ответ: Sigel
сделал дополнительный набор текстурных координат.
создать набор можно так: somesurface->AddTexCoordsLayer(index); index может быть от 1 до 31. для максимальной производительности они должны идти по порядку. т.е не так, что есть 2, 7 и 26 слой тк. а лучше 1,2,3. (хотя можно и 2,7 и 26). Код:
sfloor->MakeQuad(34.0f,8.0f); дальше добавляется второй текстурный юнит и задаются UV координаты для всех вершин. |
Ответ: Sigel
Как понял функция VertexUV(Layer%,Vertex%,U#,V#)? А где W позабыл? Часто в шейдерах юзается в виде индексов (я юзал для инстансинга). Плюс для 3D текстур нужен будет.
|
Ответ: Sigel
эээ. нету его. пока. спасибо за замечание.
скорее всего тогда будет не sfloor->AddTexCoordsLayer(1); а sfloor->AddTexCoordsLayer(1,n); где n число от 1 до 4 - число компонент на одну тк. для 3д тк - нужно указать 3. второй параметр задает кол-во компонент у тк. |
Ответ: Sigel
Вложений: 2
добавил возможность работы с 2д фигурами.
в аттаче пример. в примере space - менять режим отрисовки. динамический или статический. в фигуре 128 трисов. 128*3 вершин. за кадр рендерятся 100 таких фигур. |
Ответ: Sigel
фпс - 200/600
А как понять 2д фигуры? Рисование мешей в экранных координатах? |
Ответ: Sigel
Цитата:
|
Ответ: Sigel
Цитата:
А много будет экономии, к примеру хранить не float4 а float2 в модели с 2к вершин, это по 8 бит на значение (так?) - это 2000(float2 vars) = 24000bits(2000*2*8 ) = 31Kb - Правильно? Просто я хз по этому вопросу (образование нуна).. Тоесть если в памяти примерно 4 миллиона вершин, по дефолту (float2 на uv), то это почти 60мб, чисто на UV! Ух.. Я уже не говорю о цвете вершин, их нормалей, позиций. Тоесть приблезительно на 1 миллион вершин, тратится инфы: float4 (position) + float3 (normal) + float4 (rgba color) + float2 (UV) = 13 float's; 13f*1000v*8b=100mb! Весьма не мало. Вот интерестно, я в шейдерах заметил правило и использование W компонента расстояния, но так и не понимал какую инфу он несёт (что он содержит), и можно ли от него избавиться. Цвет вершин, юзается, но редко (хотя тут раз на раз не приходится, зависит от стиля кодера графических техник). Вроди как щас уже можно отрубать? UV - уже опционально, и слои, и колличество компонентов. Вроди ничего не забыл.. |
Ответ: Sigel
1 float - 4 байта.
весь цвет занимает всего 4 байта. позиция - 3 float -а. получается жестко задано: float3 (position) + float3(normal) + float2(UV). - 32 байта на вершину. опционально: float1 (rgba) - еще 4 байта. т.е. в самом простом случае будет 32 мегобайта грубо говоря. с цветом - 36. если еще одни UV - 44 если еще одни UVWT - 60 W компонента в позиции - это проецирование ккординат. т.е правильная позиция вершины это не x,y,z а x/w,y/w,z/w цвет вершин на данный момент совсем не используется. но позже обязательно будет добавлена его поддержка опционально. * сделал сохранение и загрузку шейпов из файла |
Ответ: Sigel
Цитата:
|
Ответ: Sigel
Цитата:
|
Ответ: Sigel
Вложений: 2
решил немного переделать 2д систему. теперь можно выводить 2д графику так называемыми кусками. Причем внетри одного куска может быть дргой (вся графика внутреннего куска будет выводиться с учетом трансформации родительской геометрии).
как то так: Код:
Begin2D(); Вложение 5843 Вложение 5842 Код:
#define SIGEL_USE_ONLY |
Ответ: Sigel
Мьсье, вы маньяк!) В самом лучшем смысле этого слова
|
Ответ: Sigel
320 фпс.
Насчёт реализации 2д - у меня тоже так :) только у меня не нужно рисовать объекты вручную, просто нужно вызвать одну функцию рендеринга 2д... ЗЫ: можно ли загружать 2д-фигуры из файла? если да, то в каком редакторе можно их создавать? |
Ответ: Sigel
Код:
можно ли загружать 2д-фигуры из файла? Код:
если да, то в каком редакторе можно их создавать? Цитата:
я решил оставить блицовую схему, потому, что она мне кажется удобнее. т.е порядок и прочее я оставляю на совести пользователя. *добавил макросы для отладки, чтобы писался файл, строка, и собственно текст в логи. из __FILE__ и __LINE__ естественно. *доработал вывод текста (ато раньше он был кривым, сам менял блендинг) *теперь текстурный шрифт тоже можно "забиндить". После этого текст можно выводить просто командой Text. |
Ответ: Sigel
Олег, а ты знаком с Max2D (BlitzMax) отрисовкой 2D, или с FastImage (он аналогичен), я про логику и синтаксис, они отличаются от Blitz2D, расширенее и удобнее.
Что насчёт блендов, цвета, альфы? Можешь написать пожалуста перечень функций по сопровождению 2D рендеринга (позиции, цвет ну и т.д.). Обрати внимание на синтаксис, очень важный моммент, Очень, от синтаксиса будет сильно меняться комфорт, учитывай это :) |
Ответ: Sigel
ИМХО рисовать картинки ручками удобнее: больше контроля над ситуацией!
|
Ответ: Sigel
MoKa
есть два основных способа вывести 2д графику. 1-й - простой. аля блитц3д. тупо выводим ее и все (указывая позицию и прочие параметры). например: Код:
Render(); Код:
Render(); Цвет, Блендиг, Альфа-тест, Шейдеры, Фбо, привязка текстур и прочее обрабатывается одинаково для обоих случаев. |
Ответ: Sigel
В Max2D будет так:
Код:
SetColor 255,128,0 По мне так такой способ весьма функциональный, чем он будет уступать кроме как родительственной концепции? |
Ответ: Sigel
по сути - этот метод на уровне гапи реализуется также как и у меня. просто уровень выше.
его можно расписать так: Код:
SetScale(x,y) |
Ответ: Sigel
HolyDel - А по чему все функции для работы с 2д глобальны ?
|
Ответ: Sigel
>значит у тебя 2д картинки это такие же ентити как и 3д объекты
угу >ИМХО рисовать картинки ручками удобнее: больше контроля над ситуацией! Программировать на ассемблере удобнее: больше контроля над ситуацией! Может и 3д хочешь ручками рисовать?) |
Ответ: Sigel
Вложений: 2
Цитата:
Код:
Engine *engine = new Enging(); пример простейшего скининга (в добавок еще и немного глючного). все считается на цпу и рисуется самым тормозным методом. поэтому и производительность крайне низка. это самый первый вариант, тут нет никаких отдельных анимаций, ни управления костями, ни даже иерархии костей. т.е. самый тупой скининг, какой только возможен. |
Ответ: Sigel
Респект! Давно пора :super:
|
Ответ: Sigel
Цитата:
Очень удобно когда все лежит в своих кслассах, intellisence очень облегчает жизнь, и увеличивает скорость разработки. render-> (и вуаля мы видим все что можно сделать с этим рендером.) |
Ответ: Sigel
Цитата:
в конце концов заврапить ООП код в функциональный никогда не поздно. обратно - немного сложнее :) Цитата:
вот она, если кому надо: http://xproger.mirgames.ru/?id=1&page=2&doc=anim3d там сурсы есть. правда на делфи. в любом случае пока скининг очень слаб. к примеру сотня megacop-ов обрабатывается за 10 фпс. к примеру блиц ту же сотню обрабатывает в два раза быстрее. (правда у него одна кость на вершину, а у меня несколько) |
Ответ: Sigel
кстати, Xproger делает новый движок, можно попросить его поучаствовать в тестах движков с нашего сайта.
|
Ответ: Sigel
я только за.
|
Ответ: Sigel
удалось ускорить рендер заскиненой модели примерно в 4 раза.
вот сравнительный тест: http://forum.boolean.name/showthread...newpost&t=8171 *ускорен вывод мд2 в два раза. (интерполяция на цпу) |
Ответ: Sigel
теперь двиг живет тут:
http://code.google.com/p/sigelengine/ последняя версия: http://code.google.com/p/sigelengine...q=label:engine утилиты: http://code.google.com/p/sigelengine...=label:utility последния версия сурсов доступна на SVN: http://sigelengine.googlecode.com/svn/trunk/ пофиксил пару багов. добавил возможность менять разрешение без потери графики (хотя фреймбуфера под актуальное разрешение прийдется пересоздавать по всей видимости). добавил возможность подгружать png файлы в ядре (тем ни менее я рекомендую пользовать DevIL, так как проблем будет меньше). |
Ответ: Sigel
добавил поддержку загрузки во втором потоке.
результат для одноядерных систем меня огорчил - основной поток идет рывками, даже если загрузочному потоку ставить самый минимальный приоритет. а вот у двух (и более ядерных) все хорошо. почему то во втором потоке не работает оптимизация индексов через NVTriStrip. Причем не работает в Xp, но работает в висте. вот демка: http://sigelengine.googlecode.com/fi...therThread.zip ну и прошлая демка со сменой разрешения (1-6 кнопки давите): http://sigelengine.googlecode.com/fi...lutionTest.zip и еще есть dot3 иммитация на ффп: http://sigelengine.googlecode.com/files/Dot3Test2.zip |
Ответ: Sigel
Мегадвиг!
|
Ответ: Sigel
Цитата:
Может, определять, сколько ядер имеет проц и действовать по обстоятельствам? Например загрузку с анимацией врубать только если 2 и более ядер, а если 1 ядро то оставить просто картинку. (ну млм время от времени менять надпись) вроде на одноядерных с Hyper-Treading'ом должно быть ок, попроси кого-нить потестить у кого такой проц есть. Кстати такие процы в системе видно как раз в виде друх ядер (система думает, будто их 2) |
Ответ: Sigel
Одоядерки уже редкость
|
Ответ: Sigel
где-то я видел статью про управление потоками на одно и многоядерных компах... там очень много нюансов насамом деле :) . Ссыку как найду запостю.
|
Ответ: Sigel
Цитата:
но сам двиг должен быть универсальным. на нем должно быть можно писать высокотехнологичные вещи с 4-ми шейдерами (и, соответсвенно, с узким кругом железа), и тупой тетрис, который должен даже на s3 работать. |
Ответ: Sigel
Вот нашел о многозадачности в Windows в целом: http://dtf.ru/articles/read.php?id=39888
Надеюсь будет полезно |
Ответ: Sigel
SBJoker, ага, я ету штуку уже читал. понятно что на одноядерных системах честной многозадачности не получится. но ведь есть же еще многоядерные. и таких систем становится все больше и больше. такчто наверное разумно делать нативную поддержку многояерных систем, и раком - одноядерных.
решил также простые примеры заливать на SVN тоже: вот например: http://code.google.com/p/sigelengine...HelloWorld.cpp |
Ответ: Sigel
Отличный пример!
Слушай, а что насчёт того чтобы не DeInit сделать, а Destroy? Помоему более понятно и как-то принято так больше. Вообще простейший пример, ссупер! |
Ответ: Sigel
можно и Destroy. Но тогда все прошлые примеры придется переделывать.
не думаю что это критично (на крайняк можно просто сделать функцию типа int Destroy {return DeInit();} ) |
Ответ: Sigel
Но всёже, сам понимаешь, что как никак, а имена функций лучше раньше продумать, нежели потом когда-то делать чуть ли не полный "рефакторинг" имён функций, лишь потому что из-за не продуманности, они все как бордак..
|
Ответ: Sigel
посоветоваться.
есть у меня команда ChangeResolution - она позволяет сменить разрешение динамически (т.е. во время выполнения программы). Все бы хорошо, но мешаются динамические screenspace текстуры (это такие текстуры, в которые рендерится картинка, обычно для постпроцесса). Ясно, что при изменении разрешения, такая текстура уже не будет актуальной и ее надо пересоздать (то же относится и к фреймбуферам, но пока речь не о них). собственно что можно сделать: 1) ничего не делать. все ложиться на плечи конечного программиста. 2) сделать список screenspace текстур. и при изминении разрешения, они будут обновляться (сжиматься или расширяться, по ситуации) 3) при смене разрешения смотреть все текстуры размером с текущее. и если такие есть то обновить их. 4) комбиация 3 и 4 пункта. если размер текстуры совпадает с размерами екрана, то автоматически заносить ее в список screenspace текстур. Если то не так - то в любой момент можно будет убрать из списка такую текстуру вручную. |
Ответ: Sigel
Второе как то логичнее
|
Ответ: Sigel
Я считаю не привязывать такой моммент к движку, это создание по мне так "лишнего" интерфейса и каких-то "тонкостей".
Я полностью за 1ое! Это ведь в разы лучше, чем полностью перегружать ВСЮ медию и всё пересоздовать (ведь при потери графикс девайса, вся медия теряется и вся видео память от этого приложения отчищается, так ведь). А тут мы имеем только какую-то текстуру, пересоздать её, проблем нет для кодера. Но я думаю там могут быть завязки во многих других аспектах с текстурами, поэтому и не делал бы ни 3 ни 2 варрианты. Вот ещё моммент: 2D, как с ним будет дело обстоять при смене разрешения? |
Ответ: Sigel
напишу свои плюсы и минусы каждого метода:
1. плюсы: * мне ничего писать не надо * абсолютная гибкость минусы: * пользователю писать много. то не один десяток строчек кода скорее всего. 2. плюсы: * все понятно. нет никаких "тонкостей" минусы: * нужно внимательн смотреть при создании screenspace текстур,незабыть добавить ее в етот список (это скорее всего будет просто tex->ScreenSpace(true);, ну или что то в этом роде 3. плюсы: * все работает автомаически минусы: * все работает автомаически т.е. если нам нужна именно текстура 1024 на 768, и она случайно совпадет с размероим экрана - то она запишется как screenspace, и никак от етого не уйти. 4. сочетает плюсы 2 и 3-его метода. если ето просто текстура то и выкидываем ее из списка. если не просто - то все работает на автомате. Цитата:
Цитата:
по умолчанию 2д будет рисоваться тупо, т.е. если мы сделали, меню например, для 1024 на 768, то в разрешении 1600 на 1200 ето меню будет в левом верхнем углу. НО! если до вывода писать Start2D(1024 на 768 ) то ето меню растянется на весь екран. Причем коррекция происходит на уровне обработки вершин, т.е. качество будет не сильно теряться, как, например при рендере в текстуру и растягивание на весь кран. + граница картинка будет четкой, и даже сглаженной при включеном антиалиасинге. кстати,добавил Destroy. DeInit теперь считается deprecated. |
Ответ: Sigel
В первом, самостоятельный менеджер этой темы, пишется за 20 минут.
С 2D, ну поидее мы иссключаем любые возможности перехода с разных соотношений вертикали и горизонтали? Это про то что кто-то запустит в 800,600 на вайд-скрине, и потом сменит на вайд.. |
Ответ: Sigel
HolyDel
просто сделай у текстуры метод TieToWindowSize переход window\fullscreen сделал так же как и у меня (и у trackmania и тд) - разворот окна на полный екран и отключение оформления ? |
Ответ: Sigel
Цитата:
Цитата:
|
Часовой пояс GMT +4, время: 16:53. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot