Да нет, не круче. Это не то, о чём я подумал. А я подумал, если сказать грубо упрощённо, об объединении достоинств софтварного и хардварного рендеринга в Гоззе в духе того, о чём я спрашивал вот в этом посте:
Я помню тот вопрос, да. Нет, нельзя. Собственно, слово "круче" и использовалось для превосходной степени — что такой рендерер делает даже больше, в том числе то, чего ты не просил.
Я не специалист по компьютерной графике — работу GPU, кватернионы и матрицы аффинного преобразования хоть и понимаю, но посредственно. Но объяснить попытаюсь.
* * *
В классическом software-рендерере семейства *ZDoom есть аксиома, пришедшая ещё со времён Heretic, где впервые была реализована возможность смотреть вверх/вниз: "Все стены остаются вертикальными". Первопричина такого решения — скорее всего, нежелание переписывать систему отрисовки Doom, которая, из-за применения BSP-дерева, заточена только под угол в 90° между плоскостью XY и её нормалью. Собственно, под вертикальные стены и горзонтальные полы-потолки, никаких склонов.
Сначала в Boom, потом в ZDoom пошли дальше и поверх той системы прикрутили пол-над-полом, прозрачность, наклонные поверхности... Но "несущие" вертикальные стены остались всё такими же уникальными не то что до ZDoom, они до сих пор, в GZDoom 4.0.0+, обрабатываются по-другому. Наглядное доказательство — если в GZDoom попытаться сделать "вертикальный сектор" (на этом скриншоте его вектор нормали поставлен в "(0, 90, 0)"), то он даже визуально не будет работать также, как стенка, а при попытке коснуться линий его периферии игра намертво зависает.
Подытог: в классическом software-рендерере вся отрисовка геометрии строится вокруг вертикальных стен.
Затем в молодой тогда порт GZDoom добавили поддержку молодых тогда графических ускорителей. Они работают по другому принципу, и у них полигональная 3D-графика заложена ещё на этапе проектирования, в отличие от исходного рендеринга Doom: там каждый объект умеет очень быстро отрисовываться полигонами по заданным формулам — в частности, через формулу "обычная трёхмерная перспектива", которая едино и использовалась GZDoom вплоть до версии 4.13.0. В этой форме визуализации все объекты подвержены линейному изменению согласно тому, как мы видим мир вокруг; а мы видим его искажённым, в том числе и вертикальные линии.
Справедливости ради, формулу способа отрисовки через исходники можно изменить.
Подытог: отрисовка на видеокарте особо и не смотрит на то, что было крайне важно в оригинальном Doom.
Итог: это два разных способа рендеринга, основанные на разных принципах. На уровне пользователя не смешиваемы в принципе. А на уровне исходников запихнуть один в другой, конечно, можно, как и сделать что душе угодно другое, если целью задаться...
* * *
Дополнение. Во многих портах семейства *ZDoom сейчас есть так называемый "SoftPoly Renderer", который позволяет имитировать полигонную графику без GPU. Может, чем-нибудь будет интересен, пригодится.
В классическом software-рендерере семейства *ZDoom есть аксиома, пришедшая ещё со времён Heretic, где впервые была реализована возможность смотреть вверх/вниз: "Все стены остаются вертикальными". Первопричина такого решения — скорее всего, нежелание переписывать систему отрисовки Doom
Может быть, первопричина и есть та, что ты говоришь, но есть, как мне кажется, и ещё как минимум одна важная причина: такая отрисовка представляется наиболее естественной для человеческого восприятия. Ну, по крайней мере, если ты стоишь на земле, а не летишь на чём-нибудь.
В этой форме визуализации все объекты подвержены линейному изменению согласно тому, как мы видим мир вокруг; а мы видим его искажённым, в том числе и вертикальные линии.
Вот тут интересно, но немного не понял, что имеется в виду. В идеальной модели перспективы проекции вертикальных линий на плоскость вертикальны, если плоскость проецирования вертикальна. (Если эту плоскость наклонить, что, видимо, эквивалентно наклону камеры при включенном мауслуке в hardware accelerated рендеринге, то, конечно, они уже не параллельны). Зрение реальным глазом или, тем более, парой глаз не совсем такое, оно сложнее, но это, как мне кажется, можно в контексте этой темы считать эффектами "более низкого порядка".
На уровне пользователя не смешиваемы в принципе. А на уровне исходников запихнуть один в другой, конечно, можно, как и сделать что душе угодно другое, если целью задаться...
Опять же, любопытно, но не совсем понял. Что значит на уровне исходников можно? То есть, всё-таки хотя бы теоретически можно изменить код какого-то из портов (скажем, Гоззы), чтобы видеокарта отрисовывала Дум по старому принципу "вертикальные линии остаются вертикальными" (даже при наклонах, как это в софтварном рендерере)? Ну, наверное можно, если по-другому подать информацию на вход видеокарты (хотя не уверен, корректно ли тут говорить "на вход"). Но тогда в чём главное препятствие? Почему сие до сих пор не сделали, ведь, казалось бы, выглядело бы приятно. Когда вертикальные линии отображаются вертикальными - это естественно.
Собственно, слово "круче" и использовалось для превосходной степени — что такой рендерер делает даже больше, в том числе то, чего ты не просил.
Для Дума по-моему не годится, он там поломает многое (ну, к примеру, рельсы, когда ты их видишь, глядя из поезда назад или вперёд). Так что нет, эта штука скорее для других целей.
Мне кажется, нельзя. Hardware рендер предполагает возможность взгляда вверх вниз на 180 градусов (90 вниз и 90 вверх). Как ты представляешь себе взгляд на 90 градусов вниз (или вверх) при сохранении прямых линий?
Может быть, первопричина и есть та, что ты говоришь,
Во варианте с отросовкой на GPU сделан акцент на сохранение пропорций текстуры — хорошо видно при включении "fov 60" (угол поля зрения, по умолчанию стоит в "90"). На software-рендерере с тем же значением FOV сохраняются пропорции только вертикальных стен, вертикальные параллельные прямые остаются параллельными друг другу всегда. Software не обеспечивает изменения перспективы по вертикали. Hardware обеспечивает, поэтому в нём можно поворачивать голову на 360° горизонтально и на 180° вертикально.
такая отрисовка представляется наиболее естественной для человеческого восприятия
Ну, математики считает иначе. Если говорить обо мне (а я дилетант в вопросах медицинского изучения глаза и восприятия, могу только по интерфейсным связям к другим областям науки судить), то я согласен с ними: то, что мы привыкли воспринимать линии вертикальными из любого штатного положения ещё не значит, что они не искажены; хрусталик глаза не плоский, да и мозг всю картинку переворачивает, почему бы ему ещё несколько изменений для собственного удобства не добавить.
В идеальной модели перспективы проекции вертикальных линий на плоскость вертикальны, если плоскость проецирования вертикальна.
Мы не идеальны. И имитация FOV в игре не идеальна. Поставь его в 60° и ниже — искажения типа "рыбьего глаза" исчезнут, поставь выше 90° — и появится эффект обратного тоннельного зрения. Но как-то отображать же изображение нужно.
Для Дума по-моему не годится, он там поломает многое (ну, к примеру, рельсы, когда ты их видишь, глядя из поезда назад или вперёд). Так что нет, эта штука скорее для других целей.
Если говорить обо мне (а я дилетант в вопросах медицинского изучения глаза и восприятия, могу только по интерфейсным связям к другим областям науки судить), то я согласен с ними: то, что мы привыкли воспринимать линии вертикальными из любого штатного положения ещё не значит, что они не искажены; хрусталик глаза не плоский, да и мозг всю картинку переворачивает, почему бы ему ещё несколько изменений для собственного удобства не добавить.
А причём здесь математики?
И вообще я говорил немного про другое: про отрисовку конкретно на экране.
Сделать — можно, можно всё. Но смотреться будет отвратительно...
Но ведь с софтварном рендеринге смотрится не отвратительно. Да, там нельзя поворачивать камеру вверх и вниз на 90, но где-то на 45 можно.
Ладно, понятно, что есть, то есть.
Во варианте с отросовкой на GPU сделан акцент на сохранение пропорций текстуры — хорошо видно при включении "fov 60" (угол поля зрения, по умолчанию стоит в "90"). На software-рендерере с тем же значением FOV сохраняются пропорции только вертикальных стен, вертикальные параллельные прямые остаются параллельными друг другу всегда. Software не обеспечивает изменения перспективы по вертикали. Hardware обеспечивает, поэтому в нём можно поворачивать голову на 360° горизонтально и на 180° вертикально.
Да, там нельзя поворачивать камеру вверх и вниз на 90, но где-то на 45 можно.
Правильно. Визуальные искажения остальных, не вертикальных линий уже на этом моменте достигают такой силы, что картинка становится неправдоподобной (потому что нужно сохранять пропорции на вертикальных линиях, все остальные не так важны, ими можно пренебрегать!). Об этом выше сказал theleo_ua:
Правильно. Визуальные искажения остальных, не вертикальных линий уже на этом моменте достигают такой силы, что картинка становится неправдоподобной (потому что нужно сохранять пропорции на вертикальных линиях, все остальные не так важны, ими можно пренебрегать!). Об этом выше сказал theleo_ua:
То, что написал Лео, я прочитал. И я вроде уже ответил, что при углах до 45 градусов картинка выглядит вполне приемлемо, и многие так и играют, предпочитая софтварный рендерер. По крайней мере, я сильных искажений не замечал. Когда присмотрелся, заметил, но это когда присмотрелся.
А вот с хардваром я замечаю неестественные наклоны вертикальных линий уже при углах камеры градусов 20-30. Это заметно из-за того, что не только углы наклона разные у разный вертикальных линий, но они ещё и в разные стороны для линий по разную сторону от игрока. А вертикаль - всё-таки очень привычная из жизни вещь, поэтому хотелось бы и в игре вертикальные линии видеть не слишком невертикальными.
Но хардвар лучше отрисовывает текстуры, по этой причине я предпочитаю хардвар, а не софтвар. Отсюда и интерес, нельзя ли всё-таки сделать гибридный вариант.
Если для этого придётся по-другому делать видеокарты, то конечно это не вариант. А если всё-таки можно на уровне софта сделать так, чтобы видеокарта выдавала картинку с другим способом проекции, то я пока не совсем понял, в чём основное препятствие.
"Будет выглядеть плохо" - не знаю, надо пробовать.
То, что написал Лео, я прочитал. И я вроде уже ответил, что при углах до 45 градусов картинка выглядит вполне приемлемо, и многие так и играют, предпочитая софтварный рендерер. По крайней мере, я сильных искажений не замечал. Когда присмотрелся, заметил, но это когда присмотрелся.
А вот с хардваром я замечаю неестественные наклоны вертикальных линий уже при углах камеры градусов 20-30. Это заметно из-за того, что не только углы наклона разные у разный вертикальных линий, но они ещё и в разные стороны для линий по разную сторону от игрока. А вертикаль - всё-таки очень привычная из жизни вещь, поэтому хотелось бы и в игре вертикальные линии видеть не слишком невертикальными.
Но хардвар лучше отрисовывает текстуры, по этой причине я предпочитаю хардвар, а не софтвар. Отсюда и интерес, нельзя ли всё-таки сделать гибридный вариант.
Если для этого придётся по-другому делать видеокарты, то конечно это не вариант. А если всё-таки можно на уровне софта сделать так, чтобы видеокарта выдавала картинку с другим способом проекции, то я пока не совсем понял, в чём основное препятствие.
"Будет выглядеть плохо" - не знаю, надо пробовать.
У тебя есть смартфон или планшет или видеокамера? Если нет, у друзей/знакомых есть?
Возьми смартфон, а в своей квартире возьми какие-нибудь коробки, разложи их по комнате а-ля карта дума 2, и сделай съемку от первого лица, как ты ходишь по квартире, как бы играя в дум в своей квартире. Возле каждой коробки (и других объектов с четкими вертикальными линиями) попробуй вращать камеру вертикально (причем именно вращать - т.е. Z координата смартфона не меняется, а меняется только угол наклона смартфона)
Дальше, сделай в думе карту, которая будет четкой копией твоей квартиры (копией именно в плане коробок и прочих объектов, на которых ты линии тестил со смартфоном), и попробуй поиграть на этой карте, сделав точь в точь такие же движения, как ты делал смартфоном в квартире. Играть в дум надо естественно на видеозапись.
Для интереса, в дум 2 можно поиграть как в hardware так и в software, но нам для эксперимента, нужен именно hardware
После этого, берешь, открываешь у себя на компе 2 видео плеера, слева ставишь видео дума 2, справа ставишь видео своей квартиры, и покадрово смотришь моменты взгляда вверх вниз, и внимательно смотришь в чем разница в линиях и искажениях.
Как только увидишь разницу, кидай скрины сюда (видео тоже выложи на ютуб).
Если видео в гздуме на hardware у тебя будет отличаться от видео со смартфона (имею в виду отличаться именно тем, как линии искажаются), то изменить это правкой исходников гздума думаю теоретически возможно (ну чтобы гздум рендерил искажение линий так, как оно у тебя при съемке на смартфон)
Если же видео и в гздуме и в квартире будет примерно одинаково, тогда то что ты хочешь, будет реализовать или адски сложно или невозможно в принципе
Почему невозможно - потому что у кого-то здесь, вроде у shadowman-а, есть подпись "маппер от генератора карт отличается тем, что сначала построил карту у себя в голове", и вот в рамках этой подписи, я даже в голове не могу построить, как должен выглядеть просмотр вверх вниз даже на 45 градусов, без искажения линий, при условии, что у нас именно полигональный 3д мир
theleo_ua, блин, чего ты не можешь представить? Софтварный рендерер ведь работает? Работает. Вот и я хочу такой же способ проецирования, только с лучшей прорисовкой текстур (возможно, что нормальная дискретная видеокарта может её дать). Нафига ты эти длинные простыни пишешь, как для детского сада? Делать нечего? Тогда лучше потрать чуть побольше времени, чтобы внимательнее прочитать то, что пишет собеседник.
Y-Shearing не подразумевает вертикальный взгляд в пол-потолок на 90 градусов. Это уже на 45 градусах (или сколько там до упору) выглядит криво, горизонтальные линии на стенах начинают становиться параллельными вертикальным, а на 90 будет как деление на ноль.
Добавлено спустя 4 минуты 21 секунду:
Посмотри видос, там степень Y-Shearingа регулируется на середине, чтоб понять, как это выглядело бы (самое интересное в конце), и расхотеть.
Добавлено спустя 3 минуты 37 секунд:
Дело не в видеокарте, а в изначальном дизайне самого способа. Т.е. прямых линий не будет, если хочешь до упора вниз смотреть и что-то различать.
lafoxxx [B0S], это я понимаю. Но (как я писал уже), мне и не обязательно смотреть вверх-вниз до 90 градусов (хотя в этом есть свои плюсы). В некоторых случаях устроило бы и 45, но с думовским способом проецирования + хорошей прорисовкой текстур.
Да нет, не круче. Это не то, о чём я подумал. А я подумал, если сказать грубо упрощённо, об объединении достоинств софтварного и хардварного рендеринга в Гоззе в духе того, о чём я спрашивал вот в этом посте:
http://i.iddqd.ru/viewtopic.php?p=132797#132797
С этим по-прежнему никак? И невозможно в принципе?
Да, нюансы, однако. Нельзя ли совместить достоинства этих двух мод рендеринга? Печалька, если так. У меня в Hardware accelerated некоторые вещи выглядят получше, но при этом искажаются углы. Вот на первом скрине True color SW renderer, и вертикальные линии на стенах выглядят очевидно вертикальными. А на втором скрине с той же позиции - Hardware accelerated, и линии уже как будто не вертикальны.
Почему сие до сих пор не сделали, ведь, казалось бы, выглядело бы приятно. Когда вертикальные линии отображаются вертикальными - это естественно.
Имеем:
1) ты жалуешься на искаженные углы (на скриншотах выше)
2) ты считаешь отсутствие таких искажений - естественным (а значит, данные искажения - неестественными)
Я же, примером со смартфоном выше, показываю тебе, что данные искаженные углы - естественны (а те прямые линии, к которым ты привык, неестественны, просто тебе кажутся естественными по причине проф деформации - ты долго так играл и привык к извращенному восприятию вещей. Грубо говоря, ты долго играл в игру, где помидоры были синие, и теперь жалуешься на рендер, где они рисуются красным цветом, говоря что синий цвет помидор - естественный)
На самом деле, естественно будет именно то, что снимет твой смартфон. И как ты заметишь, на смартфоне будут те же самые искажения, что и на твоих скриншотах хардварного рендера (а если будет отличаться, значит гздум недостаточно хорошо имитирует реальный мир, там есть недочеты в коде, которые при желании реально пофиксить)
блин, чего ты не можешь представить? Софтварный рендерер ведь работает? Работает. Вот и я хочу такой же способ проецирования, только с лучшей прорисовкой текстур (возможно, что нормальная дискретная видеокарта может её дать).
вот здесь ты видимо проморгал ключевой момент, так как невнимательно читал что пишет собеседник. Смотри - вот моя цитата:
Если же видео и в гздуме и в квартире будет примерно одинаково, тогда то что ты хочешь, будет реализовать или адски сложно или невозможно в принципе
Почему невозможно - потому что у кого-то здесь, вроде у shadowman-а, есть подпись "маппер от генератора карт отличается тем, что сначала построил карту у себя в голове", и вот в рамках этой подписи, я даже в голове не могу построить, как должен выглядеть просмотр вверх вниз даже на 45 градусов, без искажения линий, при условии, что у нас именно полигональный 3д мир
при условии, что у нас именно полигональный 3д мир
почему эту часть моего сообщения ты не прочитал? Ты в курсе, что в software рендере у нас не полигональный 3д мир, а плоский 2.5д мир?
OpenGL с его хардварным рендером проектировались с рассчетом в первую очередь исключительно на полигональный 3д мир. Даже если ты не планируешь смотреть вверх вниз, то линии там будут рендериться именно как в реальной жизни. И, внимание: то, как у тебя в гздуме рендерятся текстуры в хардварном рендере в opengl - это в первую очередь заслуга именно того факта, что мир рендерится по законам реальной жизни, тобишь когда мир у нас полигональный, и трехмерный
Если у тебя на текстуре освещение - оно там потому, что вычисляется по трехмерным законам. Если у тебя там спрайт пикап оружия, нижняя часть которого утонула в полу - это потому, что спрайт оружия в полигональном 3д мире - это прямоугольник (состоящий из двух треугольников), часть которого пересекла видимый пол в трехмерном мире, и ушла в слепую зону ниже пола (когда в плоском 2.5д software мире спрайт оружия просто нарисовался бы поверх пола, независимо от Z координаты оружия). И так далее
Соответственно, чтобы получить все те преимущества текстур хардварного рендера, которые рисуются исключительно по математическим формулам реального трехмерного мира, надо рендерить игру в таком трехмерном мире, где у игрока будет возможность смотреть вниз и вверх на 90 градусов, ДАЖЕ в случае, если ты запретишь игроку это делать, иными словами, линии будут искажаться строго так, как они искажаются при съемке видео смартфоном (представь что человеку со смартфоном например запретят смотреть вверх вниз, или запретят смотреть вверх и вниз больше чем на 45 градусов - "рендер" и его математика все равно не поменяются, освещение все равно будет работать так, как будто это реальный мир)
Весь вопрос будет в том, как много OpenGL фич из коробки ориентированы на трехмерный мир, и насколько геморно их будет переписывать на 2.5д мир, а самое главное, какой эффект даст перепись этого кода на 2.5д мир, ведь вполне возможно, что текстуры будут рендериться уже не так как ты хочешь (например то же освещение)
Здесь я тебе приведу обратный пример: уже были попытки дописывать software рендер новыми фичами: сначала ему присобачили труколор, затем сделали там вариант динамического освещения, но - оно там выглядит не так как в opengl
Исходя из вышенаписанного, твою исходную задачу "чтобы линии были прямыми без искажений, но стиль отрисовки текстур был такой, как в хардварном opengl", я вижу либо решаемой через адский геморрой (кучу нативных opengl функций тебе придется переписывать) либо нерешаемой в принципе (так как результат будет выглядеть не так, как сейчас в гздуме при хардварном рендере)
Тогда лучше потрать чуть побольше времени, чтобы внимательнее прочитать то, что пишет собеседник.
написал мне человек, который потратил недостаточно времени чтобы понять что я написал (невнимательно читал видимо, что пишет собеседник в лице меня), и мне пришлось ему сейчас ответить более подробно:)
Да даже не смартфон, достаточно сделать ладонями "окошко", чтобы ребро ладони формировало прямую линию. Наклонив голову, увидишь, что линии стен не по центру стали под углом.
Т.е. по сути смотр вверх-вниз в софтваре это как движение глаз. Но ты и глаз не сделаешь в упор в пол или потолок -- это довольно больно.
Я конечно не знаю, как работают всякие там матрицы преобразования координат вертексов в пространстве, в смысле, я не мог бы заявить конкретно, может ли быть матрица, которая сломает привычную нам перспективу и оставит все вертикальные линии вертикальными, но чисто ради любопытства мне хочется воспроизвести этот эффект простым шейдером в родной мне юнити и посмотреть, как дико будет смотреться. Если что-нибудь получится, запощу скринов или видос.
Antroid, а зачем? Всё уже сделано. Просто включи софтварный рендерер в Гоззе. Или в PrBoom+ включи наклоны.
Если ты сделаешь что-то другое, оно уже не будет относиться к данной дискуссии.
Antroid, а зачем? Всё уже сделано. Просто включи софтварный рендерер в Гоззе. Или в PrBoom+ включи наклоны.
Если ты сделаешь что-то другое, оно уже не будет относиться к данной дискуссии.
Из любопытства Типа чтобы доказать примером, что это возможно в хардварных рендерах...
Сделал тестовый билд (ссылка на гугл драйв, гоняйте сами - записывать видео лень было ). Ограничение угла наклона головы - 80 градусов вверх/вниз. Очень всё базовое, никаких настроек нету (типа чувствительности мыши), потому что их прикручивать муторно. Еще есть издержки метода - например, предметы над головой пропадают, если очень сильно смотреть наверх с софтварной перспективой. Это потому, что движок рассчитывает видимость, не учитывая те искажения, которые делает мой шейдер. Чинить это тоже муторно
Ты Y-shearing воспроизводишь или что-то другое? Если его, то, наверное, интересно. А если другое, то тут сложно что-то говорить, поскольку это уже не то, что в Думе есть и хорошо обкатано.
exe-шники я не запускал, если что. Если будет что показать, видос был бы предпочтительнее.
Добавлено спустя 19 минут 53 секунды:
Хотя на самом деле я не знаю, как делается проекция в софтваре в Гоззе и в ПроБуме. Просто lafoxxx [B0S] сослался на Y-shearing.
Внутренне оно работает по-другому (все-таки думовский софт рендер и современный 3д рендер - совершенно разные звери под капотом), но выглядит так же, как взгляд вверх/вниз в софтваре. В моем случае, шейдер просто тащит всю геометрию уровня по вертикальной оси пропорционально расстоянию от камеры, и пропорционально "углу наклона". Можно переключать перспективу нажатием кнопки в реальном времени, угол наклона сохраняется.
Записал таки короткий видос. Это просто с экзешника по ссылке - он уже готов к употреблению, меняться не будет.
Вроде не так уж плохо! Видно, что оба метода имеют плюсы и минусы, и тут уж кому что и на какой карте.
Только что-то камера низко. Традиция думгая, у которого не только рост маленький, но и глаза где-то ниже головы?
Вообще, камера вроде как находится на высоте трех метров. Мы просто ну очень быстро двигаемся, да и квадраты на стенах крупные, отчего наверное всё вокруг кажется больше, чем оно есть. К тому же, наш персонаж - пузатик радиусом в один метр.
Вообще, "софтварная" перспектива смотрится интересно, но я лично не вижу ни единого плюса в сравнении с "реальной", кроме разве что аутентичности старому и костыльному способу из еретика и далее. Ни в какой другой игре я никогда бы не выбрал этот "софтварный" вариант - слишком искажает перспективу в сравнении с тем, как всё выглядит в реальности.