The effect your describing is called chromatic aberration(kind of).
While there is no really good way of making it in Roblox, but you can try to mess around with viewports.
I made something like this, while not identical, I think it looks quite close:
local cameras = {} :: {Camera}
local cameraHistories = {} :: {{CFrame}}
local RunService = game:GetService("RunService") :: RunService
local Players = game:GetService("Players") :: Players
local camera = workspace.CurrentCamera :: Camera
local player = Players.LocalPlayer :: Player
local character = player.Character or player.CharacterAdded:Wait() :: Model
local viewports = script.Parent.Viewports :: Folder
for i, vp in viewports:GetChildren() do
if not vp:IsA("ViewportFrame") then continue end
local vpcamera = Instance.new("Camera") :: Camera
vpcamera.Parent = vp
vp.CurrentCamera = vpcamera
table.insert(cameras, vpcamera)
local worldModel = Instance.new("WorldModel") :: WorldModel
worldModel.Parent = vp
cameraHistories[i] = {}
for _ = 1, #viewports:GetChildren() do table.insert(cameraHistories[i], camera.CFrame) end
for _, obj in workspace:GetChildren() do
if not obj:IsA("BasePart") or obj:IsA("Terrain") then continue end
local clone = obj:Clone() :: Instance
clone.Parent = worldModel
end
end
RunService.RenderStepped:Connect(function(dt : number)
for i, cam in cameras do
local history = cameraHistories[i]
table.insert(history, 1, camera.CFrame)
if #history > #viewports:GetChildren() then
table.remove(history, #history)
end
cam.CFrame = cam.CFrame:Lerp(history[#history], 0.2)
end
end)
I have a ScreenGui with a Folder with 3 viewports with different colors on them, and they are all offset from each other by a couple of pixels, and a script outside the folder.
All this code does it get the position of the players camera 3 times, gets the oldest camera position, and just tweens the viewports camera to that old position.
In this case I have used workspace for the objects, but it can get pretty preformance intensive, this script can work on simple things like the basic baseplate, but if you want to improve preformance, you’ll need to specify a specific area, doing the whole workspace will definitely cause it to lag.
Also this script checks inside the workspace if the objects contained inside are only BaseParts and Terrain, if you have more object types you don’t want to include, you’ll have to tweak the code.
But thats basically it, let me know if you don’t understand something.