S&box Wiki


RenderEntity is a clientside-only entity class that lets you draw simple meshes. The API is pretty simple and lets you provide dynamic vertex data on a per-frame basis.

Creating a basic sprite

For most use cases it's sufficient to just derive from the RenderEntity class and override the DoRender method:

using Sandbox; // It's just a square with a material slapped onto it. public class Sprite : RenderEntity { public Material SpriteMaterial { get; set; } public float SpriteScale { get; set; } = 18f; public bool Enabled { get; set; } = true; public override void DoRender(SceneObject obj) { if (!Enabled) return; // Allow lights to affect the sprite Render.SetupLighting(obj); // Create the vertex buffer for the sprite var vb = Render.GetDynamicVB(); // Vertex buffers are in local space, so we need the camera position in local space too var normal = Transform.PointToLocal(CurrentView.Position).Normal; var w = normal.Cross(Vector3.Down).Normal; var h = normal.Cross(w).Normal; float halfSpriteSize = SpriteScale / 2; // Add a single quad to our vertex buffer vb.AddQuad(new Ray(default, normal), w * halfSpriteSize, h * halfSpriteSize); // Draw the sprite vb.Draw(SpriteMaterial); } }

Then you can spawn them like this:

// Somewhere in client code... var sprite = new Sprite { SpriteMaterial = Material.Load("materials/goatse.vmat"), SpriteScale = 24f };

Keep in mind that creating RenderEntities serverside does not work-- they simply won't spawn.

Dynamic expressions

If your materials have dynamic expressions, you can write to their variables by calling Render.Attributes.Set inside your DoRender method. The values you set will affect all subsequent draw calls in the method body.

Render.Attributes.Set("rendercolor", Color.Red);


Due to the large size of the RenderEntity vertex format, vertex buffers created with Render.GetDynamicVB() can only contain approximately 600 vertices. If you exceed this limit, you may experience crashes.

If you need more vertices, you can either use multiple vertex buffers or use the Mesh class instead (which allows you to use a custom vertex format).