Как эмулировать графику PSX с OpenGL?

13

Я хочу знать, какие параметры (или шейдеры) установить, чтобы моя игра OpenGL была похожа на игру Playstation 1. Я знаю, что это, вероятно, не может быть достигнуто на 100%, потому что PSX использовал телевидение и телевизионные изображения по-разному, что монитор. Благодарю. :)

user712092
источник
1
Вы можете найти полезную информацию об оборудовании на вики- странице.
Джонатан Коннелл
2
Я помню, что недавно была ссылка на кого-то, кто создал шейдеры, чтобы воспроизвести ощущение CRT игр SNES на ПК с ЖК-монитором. Я был убежден. altdevblogaday.com/2011/07/18/…
dascandy

Ответы:

24

На мой взгляд, наиболее важные элементы, которые должны сделать сцену OpenGL похожей на сцену PSX, - это убедиться, что фильтрация отключена (у PS1 был только ближайший сосед), отключить буферизацию Z (там не было) и выполнить рендеринг. Ваша сцена с алгоритмами художников.

Освещение было только на одну вершину, на самом деле не было никакого осветительного оборудования, только раскраска вершин gouraud затенена. Освещение было программно управляемым, поэтому вы могли делать все что угодно в пределах времени процессора, из которого не было много свободного места для умных продвинутых вещей, таких как «освещение». :) В какой-то момент нам удалось получить зеркальное отражение, но, так как это было для каждой вершины, это сделало сцену блестящей, поэтому мы ее отбросили. Нам никогда не удавалось заставить зеркально работать с сетчатыми сетками в качестве нормалей, а затем их использование заняло слишком много времени.

У PS1 также было небольшое плавание текстур, я не уверен, как бы вы реализовали это с OpenGL, но если вы после подлинного опыта, возможно, просто пытаетесь разбить UV, когда они находятся у края экрана даст разумное приближение.

Я также рекомендую вам взглянуть на преобразования вершин: у PS1 не было поплавков, поэтому рендеринг выполнялся с конвейерами с фиксированной запятой, это является причиной дрожания при воспроизведении анимации. В 16-битной фиксированной точке может быть только столько позиций, в которых может находиться вершина, это даже не так много позиций. несколько видео на YouTube для PS1, чтобы понять, как это повлияло на игру. Здесь http://www.youtube.com/watch?v=RSV4IBa1pMIВы можете видеть здесь, что это означает, что прямые линии дрожат, когда камера находится близко к горизонтали. Я думаю, что хорошим способом эмулировать это было бы преобразование вашего мира в программном обеспечении (как это делала PS1) и всегда выводить целые числовые координаты экрана в размер эмулируемого экрана (что было одной из основных причин, по которым полисы дрожали вокруг, они не может быть визуализировано в подпиксели).

РЕДАКТИРОВАТЬ

Плавание текстуры было связано с тем, что PS1 вообще не имел 3D-интерполяции. Как упомянуто пользователем712092, аффинный рендерер мог интерполировать только в пространстве экрана, поэтому мы ошиблись с нашими диагоналями. Это может быть реализовано включением noperspectiveваших квалификаторов интерполяции или имитацией ручного преобразования сцены и отбрасыванием окончательного значения Z в вашей вершине после того, как вы разделите экранные координаты x и y на это значение z

Ричард Фабиан
источник
Хорошее понимание;)
Джонатан Коннелл
@ Ричард Текстура плавать? Это частичное или полное отсутствие коррекции перспективы ? Например, Quake делал коррекцию перспективы каждые N пикселей.
user712092
@Richard Таким образом, это означает, что я должен прибегнуть к a) вершинным шейдерам для эмуляции 16- битной фиксированной точки b) не уверен, что glVertex3s решит ее c) есть некоторые библиотеки OpenGL с фиксированной точкой.
user712092
3
Вау. Откуда ты все это знаешь?
ashes999
@ ashes999 Я профессиональный разработчик игр более 10 лет.
Ричард Фабиан