<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.vrchat.com/index.php?action=history&amp;feed=atom&amp;title=Community%3AShaderMotion</id>
	<title>Community:ShaderMotion - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.vrchat.com/index.php?action=history&amp;feed=atom&amp;title=Community%3AShaderMotion"/>
	<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=Community:ShaderMotion&amp;action=history"/>
	<updated>2026-06-04T02:49:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki.vrchat.com/index.php?title=Community:ShaderMotion&amp;diff=66779&amp;oldid=prev</id>
		<title>Usr 40be82e7-f7d5-4548-b314-3fc7b26d22ee: Usr 40be82e7-f7d5-4548-b314-3fc7b26d22ee moved page Community:Shader Motion to Community:ShaderMotion</title>
		<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=Community:ShaderMotion&amp;diff=66779&amp;oldid=prev"/>
		<updated>2026-03-30T21:41:53Z</updated>

		<summary type="html">&lt;p&gt;Usr 40be82e7-f7d5-4548-b314-3fc7b26d22ee moved page &lt;a href=&quot;/wiki/Community:Shader_Motion&quot; class=&quot;mw-redirect&quot; title=&quot;Community:Shader Motion&quot;&gt;Community:Shader Motion&lt;/a&gt; to &lt;a href=&quot;/wiki/Community:ShaderMotion&quot; title=&quot;Community:ShaderMotion&quot;&gt;Community:ShaderMotion&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:41, 30 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key vrchat_wiki:diff:1.41:old-66776:rev-66779 --&gt;
&lt;/table&gt;</summary>
		<author><name>Usr 40be82e7-f7d5-4548-b314-3fc7b26d22ee</name></author>
	</entry>
	<entry>
		<id>https://wiki.vrchat.com/index.php?title=Community:ShaderMotion&amp;diff=66776&amp;oldid=prev</id>
		<title>Usr 40be82e7-f7d5-4548-b314-3fc7b26d22ee: Just a cool shader B)</title>
		<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=Community:ShaderMotion&amp;diff=66776&amp;oldid=prev"/>
		<updated>2026-03-30T21:40:08Z</updated>

		<summary type="html">&lt;p&gt;Just a cool shader B)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Noticebox/Community}}&lt;br /&gt;
{{Infobox/Asset&lt;br /&gt;
|name=ShaderMotion&lt;br /&gt;
|author=lox9973&lt;br /&gt;
|license=MIT&lt;br /&gt;
|github=CuteWaterBeary/ShaderMotion&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ShaderMotion&amp;#039;&amp;#039;&amp;#039; is an open-source, shader-based motion-to-video codec for Unity humanoid [[Special:MyLanguage/Avatars|avatars]], originally developed by lox9973. It encodes the bone rotations of a humanoid avatar into colored blocks within a video frame, which can be transmitted via live-streaming platforms and decoded back into motion for playback on a different avatar. The core encoding and decoding system is written entirely in HLSL shader language.&lt;br /&gt;
&lt;br /&gt;
ShaderMotion is designed for streaming full-body motion across VR platforms using live-streaming services. It is used in the VRChat community for live music performances, 3D films, and animation recording. Audiences watching a ShaderMotion-encoded video stream can see a 3D avatar performing the encoded motion in real time, and can move around the performer to view the performance from any angle.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
ShaderMotion operates as a sender-receiver system:&lt;br /&gt;
&lt;br /&gt;
* The &amp;#039;&amp;#039;&amp;#039;sender&amp;#039;&amp;#039;&amp;#039; (recorder) converts the bone rotations of a humanoid avatar into a grid of color blocks embedded in a video frame.&lt;br /&gt;
* The &amp;#039;&amp;#039;&amp;#039;receiver&amp;#039;&amp;#039;&amp;#039; (player) converts the color blocks back into bone rotations and applies them to a different avatar, enabling &amp;#039;&amp;#039;&amp;#039;motion retargeting&amp;#039;&amp;#039;&amp;#039; — the same motion can be played back on any humanoid avatar regardless of body proportions.&lt;br /&gt;
&lt;br /&gt;
Because the motion data is encoded into a standard video stream, it can be transmitted using any video delivery method, including live-streaming platforms, pre-recorded video files, or in-world video players in VRChat.&lt;br /&gt;
&lt;br /&gt;
== Technical details ==&lt;br /&gt;
&lt;br /&gt;
=== Encoding scheme ===&lt;br /&gt;
&lt;br /&gt;
ShaderMotion uses a &amp;#039;&amp;#039;&amp;#039;base-3 Gray curve&amp;#039;&amp;#039;&amp;#039; as its encoding curve. The encoding maps a bounded real number (representing a bone angle) into RGB color values. The curve is chosen to be continuous, which avoids jitter from quantization errors during video compression.&lt;br /&gt;
&lt;br /&gt;
The encoding process:&lt;br /&gt;
# Normalize the input angle from the range [-1, +1] to [0, 1].&lt;br /&gt;
# Apply a base-3 Gray curve with six dimensions to produce six values in [0, 1].&lt;br /&gt;
# Interpret the six values as two RGB colors in GRB order (green, red, blue), chosen because H.264 video compression encodes in YCrCb color space where the green axis provides the highest precision.&lt;br /&gt;
&lt;br /&gt;
=== Frame layout ===&lt;br /&gt;
&lt;br /&gt;
Each video frame is divided into an 80x45 grid of squares. Horizontally adjacent squares are paired into &amp;#039;&amp;#039;&amp;#039;slots&amp;#039;&amp;#039;&amp;#039;, producing a 40x45 matrix of real numbers between -1 and +1 per frame.&lt;br /&gt;
&lt;br /&gt;
A humanoid avatar occupies the first three columns (slots 0-44, 45-89, and 90-134), with data assigned up to slot 129:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Slots&lt;br /&gt;
! Data&lt;br /&gt;
|-&lt;br /&gt;
| 0-11&lt;br /&gt;
| Hips position, rotation, and avatar scale&lt;br /&gt;
|-&lt;br /&gt;
| 12-26&lt;br /&gt;
| Spine, Chest, UpperChest, Neck, Head&lt;br /&gt;
|-&lt;br /&gt;
| 27-44&lt;br /&gt;
| Upper legs, lower legs, feet&lt;br /&gt;
|-&lt;br /&gt;
| 45-68&lt;br /&gt;
| Shoulders, upper arms, lower arms, hands&lt;br /&gt;
|-&lt;br /&gt;
| 69-70&lt;br /&gt;
| Toes&lt;br /&gt;
|-&lt;br /&gt;
| 71-76&lt;br /&gt;
| Eyes (Jaw deprecated)&lt;br /&gt;
|-&lt;br /&gt;
| 90-129&lt;br /&gt;
| All finger bones (left and right)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Most slots store swing-twist angles in XYZ order, scaled from [-180, +180] degrees to [-1, +1].&lt;br /&gt;
&lt;br /&gt;
=== Hips encoding ===&lt;br /&gt;
&lt;br /&gt;
The Hips bone is handled differently from other bones because it can both translate and rotate freely. Its position is scaled down by a factor of 2 and encoded into two parts approximating integral and fractional components. The rotation is represented as a rotation matrix (rather than swing-twist or quaternion) to avoid mathematical discontinuities.&lt;br /&gt;
&lt;br /&gt;
The avatar scale (height of the Hips bone in T-pose) is encoded in the ratio of the lengths of the scaled y-axis and z-axis columns of the rotation matrix, enabling motion retargeting across avatars of different sizes.&lt;br /&gt;
&lt;br /&gt;
=== Bone rotation ===&lt;br /&gt;
&lt;br /&gt;
Bone rotation is computed from each bone&amp;#039;s neutral pose (the &amp;quot;motorcycle pose&amp;quot; visible in Unity&amp;#039;s muscle settings) relative to its parent bone. Rotations are expressed as &amp;#039;&amp;#039;&amp;#039;swing-twist angles&amp;#039;&amp;#039;&amp;#039; rather than Euler angles or quaternions, for compatibility with Unity&amp;#039;s muscle system and for easier interpolation.&lt;br /&gt;
&lt;br /&gt;
The resulting swing-twist angles correspond to Unity&amp;#039;s animator muscle values, scaled by the bone&amp;#039;s range limit.&lt;br /&gt;
&lt;br /&gt;
== Avatar setup ==&lt;br /&gt;
&lt;br /&gt;
ShaderMotion provides two Unity addons for VRChat integration:&lt;br /&gt;
&lt;br /&gt;
=== VRC Avatar Addon ===&lt;br /&gt;
&lt;br /&gt;
The VRC Avatar Addon configures a VRChat avatar for ShaderMotion recording and playback. It supports Avatar 3.0 and Avatar 2.0, though Avatar 3.0 provides fuller functionality.&lt;br /&gt;
&lt;br /&gt;
=== VRC World Addon ===&lt;br /&gt;
&lt;br /&gt;
The VRC World Addon provides a sample VRCSDK3 world with a video player that drives a puppet avatar from a ShaderMotion-encoded video stream. This enables audiences to watch motion-captured performances in VRChat.&lt;br /&gt;
&lt;br /&gt;
== Animation export ==&lt;br /&gt;
&lt;br /&gt;
ShaderMotion includes an &amp;#039;&amp;#039;&amp;#039;AnimationRecorder&amp;#039;&amp;#039;&amp;#039; tool that can export avatar motion as Unity &amp;lt;code&amp;gt;.anim&amp;lt;/code&amp;gt; files. In the Unity editor, a C# MotionPlayer component drives an animator from the motion texture. While playing back a ShaderMotion-encoded video, the AnimationRecorder captures the resulting bone motion into an animation clip.&lt;br /&gt;
&lt;br /&gt;
Exported &amp;lt;code&amp;gt;.anim&amp;lt;/code&amp;gt; files can be used directly in Unity animator controllers. For use in other software, third-party conversion tools can convert them to &amp;lt;code&amp;gt;.fbx&amp;lt;/code&amp;gt; format.&lt;br /&gt;
&lt;br /&gt;
== Streaming settings ==&lt;br /&gt;
&lt;br /&gt;
The ShaderMotion documentation suggests the following OBS settings for live streaming ShaderMotion-encoded motion:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Recommended value&lt;br /&gt;
|-&lt;br /&gt;
| Output resolution&lt;br /&gt;
| At least 640x360&lt;br /&gt;
|-&lt;br /&gt;
| Frame rate&lt;br /&gt;
| 60 FPS (lower frame rates are noticeable in VR)&lt;br /&gt;
|-&lt;br /&gt;
| Bitrate&lt;br /&gt;
| 400-800 Kbps (scale proportionally for higher resolution or FPS)&lt;br /&gt;
|-&lt;br /&gt;
| Color space&lt;br /&gt;
| 709&lt;br /&gt;
|-&lt;br /&gt;
| Color range&lt;br /&gt;
| Partial&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/CuteWaterBeary/ShaderMotion ShaderMotion] on GitHub&lt;br /&gt;
* [https://gitlab.com/lox9973/ShaderMotion Original ShaderMotion repository] on GitLab&lt;/div&gt;</summary>
		<author><name>Usr 40be82e7-f7d5-4548-b314-3fc7b26d22ee</name></author>
	</entry>
</feed>