How to get old Roblox Studio Future is Bright versions, bypass the log in screen and try VoxelGPUCascaded, AutoExposure and Volumetric Lighting

Hello! Back in 2017-2018, when Roblox was working on Future lighting, they released several amazing features that didn’t make it into modern Roblox, such as the VoxelGPUCascaded technology which introduced particle shadows and more, auto exposure and even volumetric lighting.


I. How to download these Roblox Studio builds?

Roblox used to save these builds in a designated GitHub repository which is now deleted. Luckily, we can still access it on the Web Archive and download the builds from there.
Here’s the link: Wayback Machine


Wait for it to load. Web Archive tends to take more time than other websites.

II. Which builds do you need?

There are quite a bit of interesting builds uploaded, however, the most notable ones are Patch release (Sep 28, 2018 | v15) which is the last version that supports volumetric lighting and Bugfix release (Dec 7, 2017 | v11) which is the last version that features the VoxelGPUCascaded mode.

III. How to install these builds?

It’s pretty simple. Unlike the modern Roblox Studio version, it doesn’t have an installation process; you just need to extract it in a folder.

IV. How to bypass the log in screen?

Sadly, older Roblox Studio builds do not let you get past the log in screen because they use older protocols which cannot connect to the modern servers, thus not letting you to log in and proceed.
However! There’s a clever workaround which I have found.

  1. First, open the normal Roblox Studio build and create a new baseplate project.
  2. Save it to file.
  3. You can now close Roblox Studio.

Next, you need to disable your internet. Here’s how to do so on Windows 11:

  1. Press Win+I. This will open the settings app.
  2. Proceed to Network & internet.
  3. Select Advanced network settings.
  4. Located next to your Ethernet/WiFi adapter, click ‘Disable’.

Now you need to:

  1. Open the RobloxStudioBeta.exe file in the folder where you have extracted the build.
  2. You will be met with an error; this is expected behavior, just click OK and it’ll go away.
  3. Then, you need to Drag’n’Drop the saved place file from earlier onto the build window.
  4. This part is VERY important! Place down a part.
  5. When the previous step is done, you can turn your internet back on.
  6. A few seconds later, your studio will freeze for a couple of seconds; this is expected behavior, as studio will attempt to close itself but wont because you have unsaved changes.
  7. A confirmation window will appear, make sure you click cancel.
V. FiB v15 section: how to enable Future is Bright and how to get volumetric lighting.

Future is Bright is not enabled by default, so you’ll need to enable it yourself and relaunch studio following the same steps from earlier.

  1. Click File → Settings.
  2. Navigate to Rendering.
  3. Scroll down to the General section; you’ll find the FutureIsBright setting. Make sure you tick it.
  4. Relaunch studio following the same steps from earlier.

Now, you should have Future lighting enabled. But in order to get volumetric lighting, you must take additional steps:

  1. Add a LocalScript inside of StarterPlayer → StarterPlayerScripts.
  2. Add a ModuleScript inside of the LocalScript which you have just created. Name it ‘VolumetricCamera’,
  3. Paste the following code inside the LocalScript:
local VolumetricCamera = require(script:WaitForChild("VolumetricCamera"))
local RunService = game:GetService("RunService")
local Camera = workspace.Camera

local cameraPart = Instance.new("Part", workspace)
	cameraPart.Transparency = 1
	cameraPart.Size = Vector3.new(1, 1, 1)
	cameraPart.CanCollide = false
	cameraPart.Anchored = true
	cameraPart.Name = "CAMERA"
	
local volumetricCamera = VolumetricCamera.new(
	cameraPart, 
	Camera.ViewportSize, 
	Camera.FieldOfView, 
	150,
	0.7, 
	NumberSequence.new(0.996), 
	1,
	ColorSequence.new(
		Color3.new(0, 0, 0)
	)
)

volumetricCamera.LayerColor = ColorSequence.new(Color3.new(0.8, 0.8, 0.8))
volumetricCamera:ReDraw()

do
	local viewport = Camera.ViewportSize
	cameraPart.Parent = workspace
	RunService.RenderStepped:Connect(function()
		if Camera == nil then
			Camera = workspace:WaitForChild("Camera")
		end
		if cameraPart.Parent == nil then
			local s = pcall(function() cameraPart.Parent = workspace end)
			
			if s == false then
				local newCamera = cameraPart:Clone()
				volumetricCamera.CameraPart = newCamera
				volumetricCamera:UpdateView(Camera.ViewportSize, Camera.FieldOfView)
				
				newCamera.Parent = workspace
			end
		end
		
		cameraPart.CFrame = Camera.CFrame
		if Camera.ViewportSize ~= viewport then
			volumetricCamera:UpdateView(Camera.ViewportSize, Camera.FieldOfView)
			viewport = Camera.ViewportSize	
		end
	end)
end
  1. Paste the following code in the ‘VolumetricCamera’ ModuleScript.
--Feel free to edit and do what ever with this
local ATTACHMENT_OBJECT = Instance.new("Attachment")
ATTACHMENT_OBJECT.Visible = false
local BEAM_OBJECT = Instance.new("Beam")
BEAM_OBJECT.TextureMode = Enum.TextureMode.Static
BEAM_OBJECT.TextureLength = 1
BEAM_OBJECT.Segments = 1
--BEAM_OBJECT.Texture = "rbxassetid://2957618348"
BEAM_OBJECT.TextureSpeed = 0
BEAM_OBJECT.FaceCamera = false
BEAM_OBJECT.LightEmission = 1
local VolumetricCamera = {}
VolumetricCamera.Layers = {}
VolumetricCamera.LayerSpacing = 0.5
VolumetricCamera.CameraPart = nil
VolumetricCamera.LayerLightInfluence = 1
VolumetricCamera.LayerColor = ColorSequence.new(Color3.new(.5, .5, .5))
VolumetricCamera.LayerTransparency = NumberSequence.new(0.996)
local function updateLayers(layers, viewport, fov, layerSpacing, cameraPart)
	local tan = math.tan(math.rad(fov/2))
	local ratioY = (0.1*tan)/0.1
	local ratioX = (0.1*viewport.X*tan)/viewport.Y/0.1
	
	for i=1, #layers do
		local layer = layers[i]
		
		local b = layer[1]
		local a1 = layer[2]
		local a2 = layer[3]
		
		local index = (i-1)*layerSpacing	
		
		a1.Position = Vector3.new((ratioX*index), 0, -index)
		a2.Position = Vector3.new(-(ratioX*index), 0, -index)		
		b.Width0 = (ratioY*index)*2
		b.Width1 = (ratioY*index)*2
		
		a1.Parent = cameraPart
		a2.Parent = cameraPart
		b.Parent = cameraPart
	end
end
--[[
	This will redraw the beams with the defined color, transparency, and light
	influence defined in the properties	
--]]
VolumetricCamera.ReDraw = function(self)
	local layers = self.Layers
	local color = self.LayerColor
	local trans = self.LayerTransparency
	local influ = self.LayerLightInfluence	
	
	for i=1, #layers do
		local beam = layers[i][1]
		beam.Color = color
		beam.Transparency = trans
		beam.LightInfluence = influ
	end
end
--[[
	This will resize and position the layers, usefull for when the screen resizes, or when
	the camera part changes
--]]
VolumetricCamera.UpdateView = function(self, viewport, fov)
	updateLayers(self.Layers, viewport, fov, self.LayerSpacing, self.CameraPart)
end
--[[
	This will construct a new VolumetricCamera object
--]]
VolumetricCamera.new = function(camera, viewport, fov, layerDepth, layerSpace, transparency, lightInfluence, color)
	local self = {}
	
	local layers = {}
	do
		local nLayers = 1
		BEAM_OBJECT.Transparency = transparency
		BEAM_OBJECT.LightInfluence = lightInfluence
		BEAM_OBJECT.Color = color
		
		local tan = math.tan(math.rad(fov/2))
		local ratioY = (0.1*tan)/0.1
		local ratioX = (0.1*viewport.X*tan)/viewport.Y/0.1
		for i=1, layerDepth do
			local b = BEAM_OBJECT:Clone()
			local a1 = ATTACHMENT_OBJECT:Clone()
			local a2 = ATTACHMENT_OBJECT:Clone()
			b.Attachment0 = a1
			b.Attachment1 = a2
			
			layers[nLayers] = {b, a1, a2}
			nLayers = nLayers + 1
		end
	end
	updateLayers(layers, viewport, fov, layerSpace, camera)
	
	--Set object's values
	self.Layers = layers
	self.LayerDepth = layerDepth
	self.CameraPart = camera
	self.LayerLightInfluence = lightInfluence
	self.LayerColor = color
	self.LayerTransparency = transparency
	
	return setmetatable(self, {__index = VolumetricCamera})
end
--And return the class
return VolumetricCamera

Attention! I didn’t write this code! It’s available publicly here: https://create.roblox.com/store/asset/7660065009/VolumetricLightingOld

  1. Make a small test map: you need to make at least one light source and set it’s Shadows property to true. It’s also recommended that you put the Brightness of Lighting to 0, Ambient and OutdoorAmbient to (0,0,0), and ClockTime to 0.
  2. Playtest! Unfortunately it doesn’t perform well on low-end hardware; My PC runs it just fine. My PC: RTX 2060 Super, 16GB of DDR4 RAM, R7 2700X CPU.
VI. FiB v11 section: how to enable VoxelGPUCascaded mode.

VoxelGPUCascaded is a lighting technology that vastly improves the Voxel technology. It introduces particle shadows amongst other technical things.
For some reason, FiB v11 is much easier to use. You don’t need to disable your internet connection as there is no log in screen.

  1. Open the build.
  2. Drag’n’Drop the baseplate file.
  3. Navigate to Lighting, scroll down to Experimental and set LightingMode to VoxelGPUCascaded.
  4. Try it out!

Huge thanks to the author of this video! https://www.youtube.com/watch?v=vLHh3d2x6Gc

7 Likes