I'm not really into 3D, however this is a cool setup nonetheless.
Setting up the HPSXRP
What is the HPSXRP
The HPSXRP (short for: Haunted PSX Render Pipeline) is a render pipeline for Unity3d that emulates the hardware limitations of the PS1.
The pipeline is developed by @pastasfuture (itch, twitter) and the Haunted PS1 community (itch, twitter, discord).
If you're into PSX graphics, you recognize these peeps from the Haunted PS1 Demo Disk 2020 or the MADVENT Calendar. It's a great community full of nice people, so definitely check out their games and their discord.
Setting up the HPSXRP
The HPSXRP github page basically contains all the information for setting up the render pipeline in the wiki. This article is essentially going to provide you the same information, just with some additional images and a couple of gifs.
In order for the Unity package manager to properly display the RP as a package, you'll need to have git and git lfs installed. Download it here:
Starting a new project
The easiest way to get started is to create a new 3D project. Not High Definition RP, not the Universal or Lightweight RP. Just the empty 3D template.
Once you created your project, navigate to the project folder and open up your manifest.json file
and add the line
This line will add the github repository to your packages. Once you head back into Unity, the Render Pipeline should show up when opening the package manager.
Switching to HPSXRP
Before switching to HPSXRP, I suggest putting something to render into the scene. I'm using a simple cube in my example. Next we'll go to the HauntedPS1 menu and create both the RenderPipelineAsset and the Resources. After that, we can finally switch the pipeline in the Project Settings/Graphics, by using the RenderPipelineAsset we just created.
Make it render
To make our test cube render again, we'll have to do two things:
- Enable PSX Quality Post Processing Effect
- Update materials
Create a new Global Volume in your scene and add two post processing effects: Quality Override Volume and Cathode Ray Tube Volume. Once you enable the Quality Override Volume, you'll see colored noise, vignette and artifacts. This is the Cathode Ray Tube post effect that's enabled by default. As I like to start with a blank slate, I add an override into the post processing profile, essentially disabling the Cathode Ray Tube Volume that makes the game look like its played on an old CRT TV.
But still no cube! That's because our test cube is still using the old default material. But the HPSXRP only renders its own shaders, meaning we have to update existing materials to use the PSXLit shader. Alternatively, we can simply create and assign a new material, as they default to using the PSXLit Shader.
Now we're able to see the cube again. At this point, we can start adding the textured models or update the existing materials to the PSXLit material. To utilize all options the HPSXRP provides, I suggest setting the filtering of your textures to bilinear. You can still default back to point filtering (pixely textures) in the material itself.
Here's my character Gertie, rendered in the HPSXRP. You can see the vertex jitter and the pixelation post processing. All the good stuff the Render Pipeline comes in.
Now, what are you waiting for? Go ahead and try it for yourself!
In the next post, I'll share some insights into my character workflow. Stay tuned!
Log in with itch.io to leave a comment.
This is really fucking cool, thank you so much for putting this together!
First of all I wanted to thank you for the tutorial and to everyone who worked on HPSXRP for making it open-source.
After carefully following every step i got the following error:
MissingReferenceException: The object of type 'Texture2D' has been destroyed but you are still trying to access it.The Scene window is basically all gray and the error pops every few seconds. I'm running Unity 2019.4.12f1.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.Texture.get_width () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Graphics/Texture.bindings.cs:38)
HauntedPSX.RenderPipelines.PSX.Runtime.PSXRenderPipeline.PushGlobalRasterizationParameters (UnityEngine.Camera camera, UnityEngine.Rendering.CommandBuffer cmd, System.Int32 rasterizationWidth, System.Int32 rasterizationHeight, System.Boolean hdrIsSupported) (at Library/PackageCache/com.hauntedpsx.render-pipelines.psx@1fe91ca2f5/Runtime/RenderPipeline/PSXRenderPipeline.cs:714)
HauntedPSX.RenderPipelines.PSX.Runtime.PSXRenderPipeline.Render (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera cameras) (at Library/PackageCache/com.hauntedpsx.render-pipelines.psx@1fe91ca2f5/Runtime/RenderPipeline/PSXRenderPipeline.cs:235)
UnityEngine.Rendering.RenderPipeline.InternalRender (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera cameras) (at /Users/bokken/buildslave/unity/build/Runtime/Export/RenderPipeline/RenderPipeline.cs:34)
UnityEngine.Rendering.RenderPipelineManager.DoRenderLoop_Internal (UnityEngine.Rendering.RenderPipelineAsset pipe, System.IntPtr loopPtr, Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle safety) (at /Users/bokken/buildslave/unity/build/Runtime/Export/RenderPipeline/RenderPipelineManager.cs:86)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:197)
Thanks in advance!
I'm not a technician myself but maybe I can still help.
In general, a good entry point for getting help would be the Haunted PS1 discord. There's a dedicated #hpsxrp channel with a valuable history of problem-solving. I did a quick search. It seems that some people have run into this exact issue.
One person was able to resolve this by checking whether git LFS is installed and installing it if this wasn't the case.
If that doesn't do the trick, check out the discord. The peeps there will gladly help where they can, I'm sure.