LTCGI for VRChat
For Dummies (Like Me)
First of all, mad props to Pi. Here’s their official documentation and tutorials on incorporating LTGCI into your own VRChat worlds.
So if there’s a whole wiki for this tool, why would I write a tutorial?
Well, mainly because I don’t find the docs super user-friendly.
I need tuts for dummies. Like me.
TLDR; Deac’s LTCGI Checklist
🗹 ProTV: Add ProTV (with Shim) & LTCGI Controller Prefabs
🗹 ProTV: Hit the LTCGI AutoSetup Button (Creates “Simple (ProTV)”)
🗹 ProTV: Set the Render Texture Target to Simple (ProTV)
🗹 Material: Make an LTCGI/Surface material, black, ~70% smoothness
🗹 Material: Alternatively, Orels, Pi, and Poiyomi all have LTCGI
🗹 Meshes: Add LTCGI Material to nearby meshes
🗹 Meshes: Set to Static, Add a Reflection Probe, & Bake Lighting
🗹 Main Screen: Add LTCGI_Screen Script (Must be a quad)
🗹 Main Screen: Change Diffuse Mode to LTC Diffuse
🗹 Main Screen: Change ColorMode to Texture
🗹 Main Screen: Set a Lightmap Channel (eg: Red)
🗹 LTCGI Controller: Add LTCGI Controller prefab to the scene
🗹 LTCGI Controller: Set Video Texture to “Simple (ProTV)”
🗹 LTCGI Controller: Hit “Bake LTCGI Shadowmap & Standard Lightmap”
🗹 Test in Editor
🗹 Enjoy (Be veeery wary of the performance impact on Mobile/Quest)
What is LTCGI?
Linearly Transformed Computer Generated Imagery (LTCGI) is an optimized plug-and-play real-time area light solution using the linearly transformed cosine algorithm for standalone Unity and VRChat. Free to use with attribution. It can utilize the Unity built-in light-mapper or Bakery for realistic shadows on static objects.
Basically, stunning real-time reflections.
Setting Up
LTCGI for VRChat has a few vital dependencies:
- VRChat Creator Companion (VCC)
- VRChat SDK (& Friends)
- LTCGI Itself
- And your favorite Video Player (I like TV Pro)
And some patience and persistence. ;)
0. Unity
First, make sure you’re running the right version of Unity. VRChat keeps updated documentation here. As of September 2023, it’s still 2019.4.31, but it won’t be for long…
1. VRChat Creator Companion (VCC)
The VCC is a great. It’s a 3rd Party app for managing VRChat packages.
VRChat calls it the “Entry Point for creating things for VRChat”. It currently includes the new VRChat Package Manager (VPM), and houses official packages, community packages, learning resources, tools, and more.
It also helps keep our Assets folder tidy, since prefab packages are now stored in the Packages folder (where they belong).
2. Add the VRChat SDK (& Friends)
Add the new Unity project to your VCC.
I like to build worlds, so the worlds SDK is my go-to.
All these other packages are super helpful, though.
Take the time to find out what they do. :)
NB: Be sure to include these two really powerful tools
- UdonSharp — Enables scripting in VRChat projects
- ClientSim — Lets us test our scene in the Unity editor
Here’s my standard setup for worlds & AV goodies:
(don’t worry about the versioning — it always changes)
3. LTCGI
Like I’ve done above, Add Pi’s Repo to your VCC to always have access to the latest version of LTCGI. This way, if Pi makes an update to the package, you’ll get access to the update really quickly and conveniently.
Once you’ve added the repo to your own VCC, you should be able to easily pull it into any old VRChat project in the future via the VCC. No more messing with iffy, outdated GitHub links.
4. TV Pro
Architechanon has also made an incredible prefab, the best video player for VRChat, imo, queue TV Pro, a ready-made video player solution for VRChat.
Download it here:
NB: ProTV 3.0 (VCC) is now in beta!
Let Pro TV install TextMeshpro (aka TMPro). The essentials should be fine. This adds nice-looking fonts & formatting options.
One of the biggest criticisms of Pro TV is that it’s tricky to get the video streamer to run in the Unity Editor.
Get deacōnline’s stories in your inbox
Join Medium for free to get updates from this writer.
This requires 2 additional packages:
- Unity Plugin AVProVideo
- Video Player Shim
Luckily, with newer versions of Pro TV, this process is super simple.
Just follow and accept the prompts.
Once they’re successfully installed, that last prompt will look like this:
Hitting Play should now run the ClientSim…
…which might have some simple project setup recommendations.
Just trust and accept the recommendations. (A restart may be necessary.)
While we’re at it, the VR World Toolkit’s World Debugger will also have some good suggestions and “auto fix” buttons. Bless their souls.
Hit Run, again, and we should be good to go.
Preparing the Prefabs
Static Mesh
Set a mesh to static lighting. This allows lighting data to be “baked” (lightmapped) onto the mesh.
NB: Use either the Orels LTCGI shader or the Poiyomi LTCGI shader for your meshes material.
LTCGI Prefabs
Drop the LTCGI attribution prefab (Packages > LTCGI) into the scene. According to the License you are free to use LTCGI in your world, but you need to give credit. You are free to do so in whichever way, but you must provide a link to the GitHub repository, such as to fulfill the imported license of the LTC example code used as a base for this project.
Drop the LTCGI controller prefab (Packages > LTCGI) into the scene
Setting up the Controller
The main component of LTCGI is the LTCGI_Controller. It controls everything related to LTCGI and bakes the required data into new builds. Note that the controller itself does not get uploaded to VRChat or included into your final build! It only exists in the editor.
Force Update
Updates the state of the scene. Generally, LTCGI tries its best to keep this up-to-date for you automatically, but sometimes materials or objects may get out of sync. If you experience any kind of issue, pressing this button should be your first recourse. Can also be reached via Tools > LTCGI > Force Material Update
Bake Shadowmap and Normal Lightmap
Starts a shadowmap bake using either the built-in lightmapper or Bakery (if installed), then follows it up by a regular light bake. This is probably the button you want. See section on Shadowmaps.
Video Texture
If you want to make use of real-time video reflections and lighting, you need to put a (Custom) Render Texture in this field. Note that by virtue of this being a single field, you can only ever have a single video input into LTCGI. For more flexibility, you can use UV Maps on your LTCGI_Screen components or use the U# API to change the video texture at runtime.
The LTCGI_Screen component
The LTCGI_Screen component is the most important part of LTCGI.
Add an LTCGI script to your screen.
(Note: The mesh must have exactly 3 or 4 vertices)
This is what controls the emission of light into your scene. It must be placed on an object containing a Mesh Filter (generally in combination with a Mesh Renderer, but that part is not mandatory — you can have an invisible light source that way). Light will be emitted (and reflected) in the shape of the mesh selected on the Mesh Filter. UV Maps are supported, so textured light sources (video or static) can be UV’d.
Note: Higher levels of smoothness & metallic will result in sleeker reflections.
ProTV v2x (Old)
LTCGI comes with ready-made adapters for certain major VRChat video players.
This option is only available for the VRChat version of LTCGI.
Supported video players:
- ProTV video player
- USharpVideo
After importing the corresponding video player package, your LTCGI Controller should detect any video players of the specified type automatically (a display box should appear). Press the offered button on the controller to perform the automatic setup.
When the setup is done, you need to ensure that the Quad generated by LTCGI matches with your actual video screen position. To do so, you can enable its Mesh Renderer component to see where it is in your scene. Make sure to disable the Mesh Renderer afterwards, if you do enable it!
Do not do anything else to either the video player, the LTCGI Controller or the LTCGI Screen component! All settings are configured automatically, and are ready to go! Upload your world to VRChat and test in-game to see if it worked.
ProTV v3+ (New)
You do not need to use the provided adapters. In fact, the option doesn’t show up, since the TVPro and LTCGI folders are now located in the Packages folder.
NB: ProTV3 integrates with LTCGI by an explicit render texture defined on the TVManager.
There is a button to automatically generate a new render texture.
This texture can be directly connected up to the LTCGI controller in the Video Texture slot.
Just drag and drop the new texture into your controller script.
Then just setup the LTCGI screens for texture to use the live video option:
- Add an “LTCGI Screen” script to your quad (4-sided screen)
- Change Diffuse Mode to “LTC Diffuse”
- Change Color Mode to “Texture”
There might not be a nice shiny preview of your video in the editor, but hitting run should show the LTCGI effect working properly.
Updating LTCGI
Remember to Force Update and Re-Bake the Shadow Map if you move the screen around.
And don’t forget that only LTCGI savvy materials will display these real-time reflections.










