Code: Select all

```
tsNormal.z = sqrt( 1.0 - max( 0, tsNormal.x * tsNormal.x - tsNormal.y * tsNormal.y ) );
```

Code: Select all

```
tsNormal.z = sqrt( 1.0 - max( 0, tsNormal.x * tsNormal.x + tsNormal.y * tsNormal.y ) );
```

And in this case the max isn't necessary there, reducing it to:

Code: Select all

```
tsNormal.z = sqrt( 1.0 - ( tsNormal.x * tsNormal.x + tsNormal.y * tsNormal.y ) );
```

Code: Select all

```
tsNormal.z = sqrt( 1.0 - tsNormal.x * tsNormal.x - tsNormal.y * tsNormal.y );
```

Z² + X² + Y² = 1

Z² = 1 - X² - Y²

Z = sqrt(1 - X² - Y²)

Z = sqrt(1 - (X² + Y²))

Note that if you fail to switch the signal the equation gets invalidated, this isn't the same as:

Z = sqrt(1 - (X² - Y²))

And this last line doesn't equate to this: Z² + X² + Y² = 1, meaning that the vector isn't normalized anymore, instead, it seems the normal vectors from the normalmaps could be having lengths equal to (1 - 2Y²), and not 1.

I couldn't find a reason why the first version is there, for me it makes more sense doing the latter, am I missing something here?