Getting Started With Gradients in Roblox
Gradients in Roblox are simpler than most people make them. You use either a Material gradient on a part or a GUI Gradient instance, and both follow the same basic pattern of color stops along a defined direction. I spent the better part of last year cleaning up shader issues on a game's UI layer and can tell you that the part-based gradient approach causes way more problems than the GUI one, which is why I prefer it almost exclusively. The quickest way to create a gradient on a standard part is to select the part, go to the Part properties panel, and find the Material section. There's a property called GradientType that controls how the colors flow across the surface. Set that to Linear for a straight left-to-right or top-to-bottom transition, or Radial if you want the color to emanate from a central point outward. Then adjust GradientCenter and GradientRadius for radial setups. The default values work fine for basic needs, but they often look wrong when your part isn't square or when you're scaling it after creation.
How To Make Gradients In Roblox Studio
If you're asking how to get this done properly, here's the practical workflow. Select your part, open the Properties window, and scroll to Material. Choose any base material — the gradient renders on top of it regardless. Then set the GradientColor property, which is a ColorSequence type. Click the color bar that appears and add stops by clicking anywhere along the bar. Each stop has its own color and position value ranging from 0 to 1. Change the color by clicking the dot and picking from the color picker, or type a hex value directly. For GUI elements, the process is slightly different. Create a Frame or TextLabel, then in its properties find the BackgroundTransparency or TextColor property depending on what you're gradienting. Add a UIGradient object as a child of that GUI element. Set the GradientType to Linear or Radial, adjust Rotation for angle control, and configure Offset to shift where the gradient starts and ends. This method gives you much finer control because you're not fighting with 3D mesh UV mapping. I ran into a specific issue recently that I still think about. A client had a long narrow corridor in their game and wanted a gradient running along the floor that appeared to stretch from one end to the other. Using a standard linear gradient on a rectangular part made the colors compress awkwardly because Roblox maps the gradient along the part's local axes, not along the visual length of the object. The workaround was straightforward — I scaled the part down on the axis perpendicular to the gradient direction until it was nearly square, applied the gradient, then visually adjusted the lighting to make it look like the original dimensions. It took maybe twenty minutes compared to the two hours I initially estimated for a custom shader solution.
Here's something beginners consistently miss: the GradientAngle property exists separately from the Rotation property in UIGradient, and they do different things. GradientAngle rotates the entire gradient field, while Rotation in UIGradient rotates the gradient within the bounds of the parent object. Mixing these up will make your gradient look completely wrong, especially on rotated parts. I've seen this mistake in countless developer forums and it always takes me about thirty seconds to spot because I've made it myself more than once. Another thing that trips people up is the interaction between gradients and lighting. Gradients on parts are affected by the scene's ambient light and direct sun rays, which means a gradient that looks perfect under Test mode lighting will look washed out or too dark once deployed. The fix is to either set the part's Material to something like Neons or Translucent, or adjust the Brightness property of the part itself. I usually bump brightness up by 0.2 to 0.3 above the default because the gradient tends to absorb a bit of the light.
Get the Full Details

Common Pitfalls and Workarounds
Performance is one area where gradients can become a real problem. Each gradient on a part adds a small rendering cost because Roblox has to calculate the color per pixel based on the gradient's position relative to the mesh. If you're putting gradients on fifty parts in the same scene, you might notice frame rate drops on lower-end devices. The solution is to bake the gradient into a texture atlas instead. Create your gradient in an external tool like Photoshop or even Roblox's built-in image editor, export it as a PNG, and apply it as a decal or texture. This is significantly faster at runtime and gives you more precise control over the color values. Cloning parts with gradients doesn't always preserve the gradient settings correctly. If you create a gradient on a part, clone it, and then modify the original's gradient, the clone sometimes shows the updated colors instead of staying independent. This happens because Roblox shares the underlying data table for identical properties. The workaround is to explicitly set the cloned part's GradientColor and GradientType properties after cloning, even if you're setting them to the same values. It forces a copy instead of a reference, and it adds about five seconds to your workflow per clone but prevents headaches later. Radial gradients on non-uniformly scaled parts produce distorted results because the gradient treats the part as if it were a square sphere. The fix is to either make the part uniformly scaled before applying the gradient, or switch to a Linear gradient and manually adjust the GradientCenter and GradientRadius values to compensate for the distortion. I found that setting the radius to roughly half the longest side of the part gives a reasonably centered radial effect on rectangular prisms.
Advanced Techniques
For more complex gradients, consider using multiple UIGradient objects stacked on the same GUI element. You can overlay a second gradient with a different rotation and offset to create multi-stop effects that go beyond the default two or three color stops. This technique is commonly used for background elements in menus and loading screens. Set the second gradient's Transparency property so it fades in and out at the edges, and adjust the offset values to create a layered depth effect. If you need animated gradients, the approach depends on whether you're working with parts or GUI. For GUI, you can tween the GradientOffset property over time to create a flowing effect. For parts, you'd need to tween the GradientCenter property instead, since parts don't support Offset changes in the same way. I typically use a loop that moves the center point back and forth over a period of about three to five seconds, which creates a subtle shimmer without being distracting. This method uses minimal CPU because it's just moving a coordinate value, not recalculating textures. The biggest limitation of Roblox's native gradient system is that you can't create true multi-stop gradients with smooth blending between four or more colors on parts. The ColorSequence property supports multiple stops, but the interpolation between them can look harsh if the stops aren't spaced evenly or if the colors have very different saturation levels. For smooth multi-color transitions, I recommend using a pre-baked gradient texture as I mentioned earlier. The texture approach also lets you include opacity variations within the gradient, which the native system handles poorly on parts.