As others have mentioned, having some formal math knowledge is good, in particular linear algebra and multivariable calculus (usually calc 3). Though that's not very practical...
I find that the hardest part of graphics programming is understanding all the boilerplate, setting up GPUs, buffers, etc. So I'd recommend skipping this part as you're learning since it's hardly rewarding. If you just want to draw pixels on a screen there's a few libs that do the heavy lifting and give a frame buffer to write to:
https://crates.io/crates/pixels
https://crates.io/crates/minifb
Writing to a pixel buffer is the most low level way to do graphics programming, but it can also be the slowest in comparison to sophisticated libraries or using a GPU. I'd recommend doing some sort of experiment on a frame buffer to get familiar with it since it never goes away, just abstracted.
The next step up in complexity would be using a 2d or 3d rendering library. These provide primatives like circles or spheres that you can put together to make a larger scene. Here's some I've used:
http://raylib.com/
https://crates.io/crates/tiny-skia
You can put things together pretty easily with these libs. And they also let you skip the gpu boilerplate (I should note that tiny-skia works only in the CPU).
Lastly, you have shader programming (OpenGL, Vulkan, etc.). If you're writing "production code" you'll have to do some setting up of the GPU, and the actual graphics code will be in a separate shader language. Shader languages are similar to C but with restrictions that allow for a high level of parallism, making it extremely fast. If you want to get started with this I'd recommend playing around on a site like shadertoy[1] where you can start writing shaders right away. I haven't done much of this myself but as far as Rust goes I've seen a lot of references to the gfx crate:
https://crates.io/crates/gfx
I hope this helps
[1] https://www.shadertoy.com/