如何用OpenGL模拟PSX的图形?


13

我想知道要设置哪些选项(或着色器),以便我的OpenGL游戏看起来像Playstation 1游戏。我知道它可能无法100%实现,因为PSX使用的电视和电视渲染的显示器不同。谢谢。:)


1
您可以在Wiki页面上找到一些有用的硬件信息。
乔纳森·康奈尔

2
我记得最近有一个人链接到创建着色器,以在带有LCD监视器的PC上复制SNES游戏的CRT感觉。我被说服了。altdevblogaday.com/2011/07/18/...
dascandy

Answers:


24

在我看来,使OpenGL场景看起来像PSX场景的最重要的方面是确保关闭过滤(PS1只有最近的邻居),并关闭Z缓冲(没有)并渲染用画家算法绘制场景。

照明仅针对每个顶点,实际上实际上没有任何照明硬件仅使用gouraud阴影顶点着色。照明是由软件驱动的,因此您可以在CPU时间限制内做任何事情,其中​​没有太多余地用于诸如“照明”之类的智能高级操作。:)我们设法在某一点得到镜面反射,但是由于它是每个顶点,所以场景看起来很闪亮,因此我们将其删除。我们从来没有想过要使用镜面反射来将蒙皮网格用作混合法线,然后使用它们就花费了太多时间。

PS1也有一些纹理变化,我不确定您如何使用OpenGL来实现,但是如果您追求真实的体验,也许只是想在靠近屏幕边缘时使UV崩溃即可会给出一个合理的近似值。

我还建议您查看顶点变换:PS1没有浮点,因此渲染是使用固定点管线进行的,这是播放动画时抖动的原因。一个顶点只能处于这么多的位置,而在16位固定点上,甚至还没有那么多的位置。观看一些PS1 youtube视频,以了解其如何影响游戏,http://www.youtube.com/watch?v = RSV4IBa1pMI您可以在此处看到,这意味着当相机接近水平时,直线会抖动。我认为,模拟此问题的一种好方法是使用软件来改变您的世界(就像PS1一样),并始终将整数屏幕坐标输出为模拟的屏幕大小(这是多边形在周围晃动的主要原因之一,它们无法渲染为子像素)。

编辑

纹理游动归因于PS1根本没有3D插值。如用户712092所述,仿射渲染器只能在屏幕空间内插值,因此最终导致对角线全部错误。这可以通过打开noperspective插值限定符来实现,也可以通过手动变换场景进行仿真,然后将x和y屏幕坐标除以该z值,然后丢弃顶点中的最终Z值。


很好的见识;)
乔纳森·康奈尔

@理查德纹理游泳吗?是部分还是完全缺乏透视矫正?例如Quake对每N个像素进行了透视校正。
user712092 2011年

@Richard因此,这意味着我必须求助于a)顶点着色器以模拟16位固定点b)不确定glVertex3s是否解决了该问题c)有一些固定点OpenGL库。
user712092 2011年

3
哇。你怎么知道这一切?
ashes999 2011年

@ ashes999我已经成为专业游戏开发人员超过10年了。
理查德·法比安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.