I've noticed that finding good shader programming resources can be difficult, especially for people with an artistic or non-technical background. Fortunately, access has really increased since node-based shader editors became something that was a great entry point for many artists. But nodes have their limitations, and I've found that they work even better when they're complementary to shader knowledge, rather than replacing it.
Below I'm going to share some resources that I came across. Their usefulness depends on what situation you are in. I strongly recommend everyone to share their tips too! I am by no means an authority on this, but if you are curious about anything in particular, don't hesitate to ask. I'm currently working on a tutorial on creating a rudimentary GPU particle system in Unity using shader programming. So stay tuned
I know my way around node-based editors, but the programming is intimidating!
It's always daunting to start from scratch. However, if you know how to create shaders in a node-based editor, you are already halfway there. The principles are the same, but the approaches are slightly different. If all you want to do is get your toes wet programming, I recommend the Codecademy and their course on Python. It does not require any previous knowledge and progresses at a very manageable pace. While Python doesn't look or read quite like shader code, it's a fantastic way to learn about basic programming concepts and practices.
I would also recommend a series on Youtube called Let's Learn C ++. It is aimed at beginners as well and is a great introduction to one of the most daunting programming languages out there. Once you are familiar with the C ++ syntax, shader languages like HLSL and Cg should be a matter of course for you.
I'm familiar with programming in general, now I want to start with shaders!
I think this is the toughest scenario and the reason I even created this post. If you're like me, you've probably come across Unreal's "introduction" to shader programming and are more confused than when you arrived.
Most of the resources I've found are aimed at graphics programmers, which really starts you at the end of things. It gets even harder when you want to create vertex animation, screen-based effects, or anything other than your everyday Lambertian pixel shader.
Most of the examples given are specific to Unity. This isn't bad in and of itself, but they rely on some Unity-specific functionality that may be difficult to replicate elsewhere. I'm afraid the other resources I found are a little off-topic, but I thought I would mention them anyway:
I get the programming stuff, but I don't fully understand the math!
You are not alone, let me tell you. I doubt I'll be the only one who's used things like Sinus without ever knowing what it actually does other than "making things blink". Node-based editors tend to teach you what things are used for, but not how they work. Learning the math behind shaders really helps with this, and it can't be emphasized enough how much it will help your shader build confidence and efficiency.
Khan Academy is my go-to place for this stuff, and I visit them regularly. They explain scary topics like vectors and matrices in a very engaging way. The material they have on trigonometry is a little more challenging, but also extremely useful. If you really want to go in-depth, the Essence of Linear Algebra course is for you.
There is also a series on Youtube called "Math for Game Developers" by Jorge Rodriguez. While it does take some programming knowledge, it does a fantastic job of explaining specific math concepts that are relevant to all aspects of game development. It's platform independent and focuses more on theory than implementation.
If you're learning visually, Immersive Math is a really cool “interactive math book” that you can play around with different examples in real time.
I'm new to shaders and not even that good with node-based editors. Where can I find out more about it?
Fortunately, there are tons of resources for that! This topic has become relatively accessible lately. Honestly, my best advice would be to find out what you're trying to achieve and just google it.
While different packages all have their own editors, they still create the same type of shaders, which means that knowledge can be easily transferred between them. Often times, it's just about learning a new word for something you're already familiar with (e.g., Clamp and Saturate basically do the same thing).
The best place to start is of course the official documentation, e.g. UE4 or Shader Forge. Additionally, here are some very practical examples