
Normal 1: what normal maps are and how they work - atomlib
https://www.artstation.com/typhen/blog/GMyG/this-is-normal-1-what-normal-maps-are-and-how-they-work
======
jedimastert
Subtle (or I guess just more technical) distinction to make: the red, green,
and blue components of a particular pixel in a normal maps are the "x", "y",
and "z" components of the normal vector, where "z" is defined as the tangent
to the plane the image is taken from, and x and y are relative to the image.

It's basically the same thing, but might help if you're more familiar with
vector/matrix math

------
ehnto
I'm an "enterprisey" software developer and have tried a few times to make a
game by myself. When it comes to putting software and math to work, I've never
been more impressed than with graphics rendering pipelines. It's a realm of
software I'm not sure I will ever dive into, just marvel from afar. I "get" a
lot of the techniques on a conceptual level, but I'm not sure I'll ever grok
the code that pulls it off without spending much more time than I'm willing to
commit to it.

~~~
jayd16
It's actually not so hard to groc once you emerce yourself in it. The hard
part is you don't really experience these same patterns in enterprise work.
It'll click eventually.

The main thing for me was realizing the goals of the pipeline. You need to
process each pixel on its own in parallel to get the speed you need. All these
texture techniques are in service of prebaking data down such that it can be
effeciently prefetched before the shader needs it.

At least for me, understanding the why helped me understand the what.

------
bane
This is a pretty old technique in the demoscene ('called bump mapping there').
There's probably a few hundred demos from the late 90s that use this technique
on everything from Amigas to DOS systems of the time.

~~~
Jasper_
Normal mapping has a long history. Jim Blinn did the original work in 1978,
with "Simulation of Wrinkled Surfaces" [0] which precomputes the normal
pertubation into a height texture ("bumpmap") and does some sleight of hand
arithmetic to integrate it back, and there was a ton of noise about putting it
in hardware around 1998 or so.

The modern normal map was introduced by Kilgard as a rotation on top of the
unperturbed surface normal [1] in surface tangent space, allowing it to be
encoded with three channels, and compressed to two.

[0] [https://www.microsoft.com/en-us/research/wp-
content/uploads/...](https://www.microsoft.com/en-us/research/wp-
content/uploads/1978/01/p286-blinn.pdf) [1]
[http://developer.download.nvidia.com/assets/gamedev/docs/GDC...](http://developer.download.nvidia.com/assets/gamedev/docs/GDC2K_gpu_bump.pdf)

~~~
airstrike
How the hell people like you have links to things like [0] will never cease to
amaze me. This is why HN is irreplaceable imho. This place is too damn
interesting

Thank you for sharing!

~~~
chadcmulligan
If you want a nice trip through the history have a look at graphics gems - all
online now
[http://www.realtimerendering.com/resources/GraphicsGems/](http://www.realtimerendering.com/resources/GraphicsGems/)

------
crazygringo
Very interesting and now I understand the concept of how bump mapping works
better.

But there seems to be an error: the first example that shows it applying to a
sphere:

[https://cdnb.artstation.com/p/media_assets/images/images/000...](https://cdnb.artstation.com/p/media_assets/images/images/000/444/501/medium/Comparacion_esferas.jpg?1560566676)

The hard-transition version on the left shows the outline of the sphere with
clear line segments, but the smooth-transition one on the right shows a
perfectly circular outline. (The clearest comparison can be seen in the
darkest section, the bottom-left edge.)

So smoothing groups are clearly doing something _in addition to_ changing how
light reflects and this is not the full story.

Does anyone know how the perfectly smooth, non-polygonal _outline_
(silhouette) is achieved? This post is clearly not providing the full story.

~~~
magicalhippo
These are not the same objects, or he turned on some tessellation as well.
Normal mapping by itself does not help with the silhouette.

------
robbrown451
This is interesting, but one thing throughout is that he keeps talking about
how normals control how the light "bounces" off the surface, for instance:
"Normals are vectors that we use to define how light bounces from a surface."

This makes sense for such things as specular highlights, but most of what we
are seeing is simply shading. That is, the brightness of the surface is simply
a matter of how much light is hitting the surface, due to the angle of the
surface to rays of light from the light source. I would word it "how a surface
is illuminated" rather than "how light bounces from a surface."

~~~
fenwick67
Normal maps influence diffuse lighting as well. All lighting is just light
bouncing off of things, I'm not sure why you're quibbling over this.

~~~
robbrown451
I agree that normal maps influence diffuse lighting. Not sure I agree that
lighting is always "light bouncing off things", since with a diffuse surface,
it scatters it in all directions approximately equally. If you consider that a
bounce, ok, but it isn't the same as "mirror type" reflection where the bounce
angle works similarly to a ball bouncing off a surface (angle of incidence
equals angle of reflection).

So, I don't agree that the normal's effect on diffuse lighting is on the way
light bounces off things, instead it is the quantity of light that hits the
surface.

I just think he could change the wording (as I suggested) to make it more
accurate, so it betters people's understanding of the more general subject. It
would be a simple change that would be easy to make, so it's intended as
constructive criticism rather than just quibbling.

~~~
Negitivefrags
If you want to quibble, then in reality, there is only specular light
reflection. It’s just that rough surfaces bounce light in many directions
because the surface is rough.

In theory, if you had a high enough resolution texture and used enough samples
you could actually represent all materials with only specular reflection.

Diffuse light is simply an approximation we use. We effectively have a value
for “roughness” of a surface and assume that some percentage of the lights
scatters in all directions using various approximations of how rough surfaces
typically reflect light.

So yeah, it’s always “light bouncing off things”

~~~
Jasper_
> It’s just that rough surfaces bounce light in many directions because the
> surface is rough.

Sort of, but not entirely, or you would get micro-flares on the surface, which
we don't observe in reality. The other half of the equation is light that
bounces around _inside_ the object, and then comes out effectively in a random
location. The majority of diffuse light is light that has been subsurface
scattered. A huge simplification we make is assuming that that light can be
modelled with a uniform constant factor, e.g. Lambertian diffuse. For surfaces
with with microgeometry larger than the scattering distance, you need a more
robust diffuse model, like Oren-Nayar.

------
klodolph
It would be nice to see object space / tangent space normal maps make an
appearance. The article only talks about tangent space normal maps, which are
actually more complicated than object space normal maps.

~~~
bluescrn
It’s extremely rare to see anything other than tangent-space normal maps used
these days, at least in games - as they allow the same map to be used on
surfaces of any orientation, or on animated meshes

~~~
klodolph
It’s not _that_ rare. The surfaces can have any orientation, they just can’t
be deformed easily.

But the idea here is that it’s easier to understand. If you show an object
space normal map, and then show the rendered model, you can say, “aha, it’s
really obvious how that works”.

And then you can introduce the tangent space normal map, and describe how you
use transformation matrices to convert tangent space to object space. Showing
the object-space normal map gives you insight into how tangent space normal
maps work.

------
airstrike
artstation.com is always so good. its community is as valuable as HN's except
it's got digital artists rather than coders

