|
Опубликовано 28.11.2016 12:53 (8 лет назад) # |
Если рисуешь софтварно - то можно сразу шары гладкие рисовать без треугольников каким-нибудь рейтрейсингом. |
|
|
|
Опубликовано 28.11.2016 21:47 (8 лет назад) # |
rip написал:
Если рисуешь софтварно - то можно сразу шары гладкие рисовать без треугольников каким-нибудь рейтрейсингом.
Рейтрейсинг не очень подходит в данном случае.
Есть Volumetric rendering, из разряда как это делают на шейдерах, но эта тема крайне адвансед: http://www.alanzucconi.com/2016/07/01/volumetric-rendering/ |
|
|
Инженер‑космогоник
|
Опубликовано 28.11.2016 22:18 (8 лет назад) # |
Тут скорее всего терминологическая проблема. Ибо если не читать про рейтрейсинг - Я согласен с rip'ом - можно рисовать шарики сразу шариками. Технически говоря - сразу билбордами с текстурой шара. Можно даже приделать фейковое освещение. Ничего особенного с глубиной делать не нужно - физика не позволит шарикам влезть друг в друга, а результат будет лучше, чем угловатые шары.
Если текстур нет, можно просто рисовать поверх с нужным размером по глубине.
Конечно костыль, но тут оправдано. |
|
|
Инженер‑космогоник
|
Опубликовано 28.11.2016 22:19 (8 лет назад) # |
Хм, походу в статье про то же, только для шейдеров. |
|
|
|
Опубликовано 29.11.2016 08:40 (8 лет назад) # |
Mefistofel
Если честно, не разбирался глубоко в вопросе, но вроде как люди придумали очень годные и экономичные методы быстрого рисования треугольников. Традиционной проблемой являются так же дырки между полигонами или наоборот - когда полигоны друг на друга налазиют.
Вот есть занятный цикл статей, там про растеризацию треугольников в самом начале.
https://habrahabr.ru/post/248153/
Спасибо. Очень хорошо все расписано в статье. Многие ошибки указаны с первым примером кода. У меня часто в коде попадаются опечатки, и что грустно, замечаю их через день-два, после пошагового деббага, мне нужно держаться какого-то порядка в своем коде.
А так алгоритмы брал из разных источников, читал пока не приходило понимания самой сути:
http://pmg.org.ru/basic3d/index.html
https://habrahabr.ru/post/257107/
http://blog.scaytrase.ru/image_synthesis/83/
и книжка "Вильямс. Компьютерная графика и стандарт OpenGL"
Zer0
Есть подозрения что это либо баги связанные с z-buffer, или с тем рисуешь ли ты в вершинах треугольника точки или нет (вопрос к алгоритму растеризации).
Обычный растеризатор использует алгоритм брезинхема с чистыми интами, потому в вершинах рисуются все точки, и часто треугольники перекрываются именно в вершинах. Я точно помню что в 3д для линий и треугольников были опции по рисованию граничных пикселей на стыках, чтоб правильно обрабатывался альфа-блендинг и не было перекрытий.
Возможно проблемы возникают при округлении, и у треугольников разные координаты вершин. Если ты будешь пилить мультисемплинг на краях или антиалязинг, там все сильно сложнее.
Да, алгоритм Брезенхэма у меня используется, но видимо какой-то "свой" вариант реализации, в интернете полно описаний, пока не сделаешь не поймешь где допустил ошибки.
Спасибо. Еще немного информации в копилку знаний. |
|
|
|
Опубликовано 29.11.2016 08:46 (8 лет назад) # |
rip
Если рисуешь софтварно - то можно сразу шары гладкие рисовать без треугольников каким-нибудь рейтрейсингом.
Рейтрейсинг разве для рендеринга в реальном времени тоже подходит?
С шейдерами пока не очень "дружу". Как-то пытался разобраться, но все разбиение на маленькие куски кода пугают немного, а в основном коде только занимаешься передачей разных данных и атрибутов. |
|
|
|
Опубликовано 29.11.2016 09:36 (8 лет назад) # |
Я, например, в своей игре где воксели взрывы рисовал софтверно в виде шаров. Термин рейтрейсинга тут очень даже применим и в реальном времени. Просто [s]в нереальном[/s] не в реальном времени рендерят когда объектов дофига, куча отражений, антиалайзинг и прочие украшательства. И туда еще кучу отсечений навешивают чтобы понять в какой объект луч влетел. Объекты всякие с хитрой геометрией. А тут у нас 3 шара и плоскость. Можно в лоб все объекты перебрать и решить для каждого из них одно квадратное уравнение. |
|
|
Древний организм
|
Опубликовано 29.11.2016 09:44 (8 лет назад) # |
Рейтрейсинг разве для рендеринга в реальном времени тоже подходит?
В какой-то мере подходит и для реалтайма.
редакция от Darthman, 29.11.2016 09:51 |
|
|
|
Опубликовано 29.11.2016 20:02 (8 лет назад) # |
Столько всего хочется сделать, а нужно довести хотя бы до играбельного состояния.
|
|
|
|
Опубликовано 30.11.2016 20:56 (8 лет назад) # |
Не успеваю доделать до конца, придется завершить игру уже после конкурса в спокойном темпе.
|
|
|
|
Опубликовано 01.12.2016 07:59 (8 лет назад) # |
Ночью всегда вылазят баги, поэтому загружаю обновленную версию. В этой версии шарики просто так не пропадают, и теперь можно хоть играть и набирать баллы с переходом на следующий уровень, а также добавил новое казуальное меню в разделе "Игра", и все лишние выкинул из релизной версии.
редакция от VanyaR1, 01.12.2016 13:05 |
|
|
|
Опубликовано 02.12.2016 06:47 (8 лет назад) # |
В игре можно побаловаться освещение. На NumPad'e клавиши 4,6 - влево, вправо, клавиши 8, 2 - вверх, вниз, клавиши 5,0 - вперед, назад двигать источник света. |
|
|
|
Опубликовано 15.12.2016 06:20 (8 лет назад) # |
Удалось переписать алгоритм рисования треугольников. Дырочек на гранях больше нет.
А дальние объекты получаются ступенчатыми. Похоже здесь уже нужно применять антиалиасинг или способ уменьшения полигонов.
|
|
|
Древний организм
|
Опубликовано 15.12.2016 09:03 (8 лет назад) # |
Круто, на самом деле круто. Завидую и восхищаюсь! |
|
|
|
Опубликовано 16.12.2016 08:42 (8 лет назад) # |
Пытаюсь разобраться со всеми этими FPS, фреймрейтом, игровым циклом, плавным движением:
Но не могу понять, или у меня что-то с монитором или правда движения размазываются, если кто-то заметит не точность, буду раз за указание на нее.
Примерно алгоритм цикла следующий:
previous = currentTimeMillis();
lag = 0L;
while (true) {
current = currentTimeMillis();
elapsed = current - previous;
previous = current;
lag += elapsed;
while (lag >= MS_PER_UPDATE) {
updateLoop();
lag -= MS_PER_UPDATE;
}
render(lag / MS_PER_UPDATE);
sleep(1);
}
в функции render(d)
draw(x + dx * d, y + dy *d) // примерно так
я просмотрел кучу способов реализации циклов, но этот показался более правильным,
но MS_PER_UPDATE пока ставлю 1000/60, а рекомендуют устанавливать от возможностей системы, не не понятно как.
редакция от VanyaR1, 16.12.2016 08:49 |
|
|
Древний организм
|
Опубликовано 16.12.2016 09:54 (8 лет назад) # |
Пиксели монитора не мгновенно переключаются, особенно с черного на белый. На некоторых мониторах пиксель может переключаться и по 1\60й секунды, отсюда и размазывание при движении.
1000/60,
Это будет справедливо только для 60Гц мониторов, но не все мониторы работают на 60Гц. ЭЛТ работали на разных частотах, хоть на 72, хоть на 75. А LCD сейчас в основном 60\120\144Гц.
Устанавливать от возможностей системы это значит грузить видюху на полную и гори оно огнём, тоже неверно. Зачем рендерить 1000 кадров, если показать можно лишь 120? Идеального решения тут не будет. Чем-то в любом случае придётся пожертвовать. |
|
|
Древний организм
|
Опубликовано 16.12.2016 09:55 (8 лет назад) # |
sleep(1);
дичь! |
|
|
|
Опубликовано 16.12.2016 12:06 (8 лет назад) # |
Darthman написал:
sleep(1);
дичь!
Так лучше: sleep(start + (1000.0/FPS) - currentTimeMillis()); |
|
|
Главный Говнюк
|
Опубликовано 16.12.2016 12:34 (8 лет назад) # |
VanyaR1 написал:
Так лучше: sleep(start + (1000.0/FPS) - currentTimeMillis());
не лучше. sleep странная вещь, работает вроде не стабильно.
WaitForSingleObject - для ожидания,
QueryPerformanceFrequency - Количество итераций процессора в секунду
QueryPerformanceCounter - текущее число итераций процессора
QueryPerformanceFrequency в начале получаешь количество итераций. После в начале и конце таймера таймера вызываешь QueryPerformanceCounter. Разницу делишь на результат QueryPerformanceFrequency и получаешь время работы кода в секунду. И уже отдаешь в WaitForSingleObject рассчитанное время ожидания.
редакция от ZblCoder, 16.12.2016 12:35 |
|
|
|
Опубликовано 18.12.2016 21:30 (8 лет назад) # |
sleep(1) - чаще всего разблокировать main thread для приема системных событий |
|
|