## Topics for v1.x

Here is a few snippets of shader code that can be useful from time to time.

## Patterns

Creates a grid pattern

``````float cellcount = 15;
//float2 cell = floor(pi.tex * cellcount);
//float2 oddeven = fmod(cell, 2.0);
float2 cellUV = frac((pi.tex+float2(0.5,0.5)) * cellcount) - float2(0.5,0.5);
``````

## Math

Smooth bump

Creates a smooth bump that is flat from 0.5 to 1.5. Good for creating rings in a shader

``````float v = smoothstep(0,0.5,x)*(1-smoothstep(1.5,2,x));
``````

## Lightning

Half lambert

Nice but simple lightning as seen in Valve Half lambert

``````light = dot(vec1, vec2)*0.5+0.5;
``````

Rotate normal

When rotating a normal vector care must be taken not to also accidentally translate it with the objects position. The WorldInverseTransponse matrix handles this for us

``````float3 normalInWorldSpace = mul(gWIT, normal)
``````

Direction vector from camera to a world position

``````float3 eyeDir = normalize(float3(gVI[0].w, gVI[1].w, gVI[2].w) - worldSpacePos)
``````

## Rotation

Rotate vector around X axis

``````float3 rotateX(float3 v, float angle)
{
float s, c;
sincos(angle, out s, out c);
return float3(v.x, c*v.y + s*v.z, -s*v.y + c*v.z);
}
``````

Rotate vector around Y axis

``````float3 rotateY(float3 v, float angle)
{
float s, c;
sincos(angle, out s, out c);
return float3(c*v.x + s*v.z, v.y, -s*v.x + c*v.z);
}
``````

Rotate vector around Z axis

``````float3 rotateZ(float3 v, float angle)
{
float s, c;
sincos(angle, out s, out c);
return float3(c*v.x + s*v.y, -s*v.x + c*v.y, v.z);
}
``````

## Post processing

Color correction

``````float inBlack=20, inGamma=1.7, inWhite=170;
float outBlack = 0, outWhite = 255;
float3 newColor =
(pow(((originalColor*255.0)-inBlack)/ (inWhite-inBlack), inGamma)*(outWhite-outBlack)+outBlack)/255.0;
``````

Brightness

``````float3 newColor = brightness * originalColor;
``````

Contrast

``````float3 newColor = (originalColor-float3(0.5)) * contrast +  float3(0.5);
``````

Grayscale

``````float3 newColor = dot(float3(0.222, 0.707, 0.071), originalColor);
``````

Emboss

``````float3 embos = tex2D( tex1, pi.tex-0.001)*2.0f- tex2D( tex1, pi.tex+0.001)*2.0f;
float3 newColor = (embos.r+embos.g+embos.b)/3.0f;
``````

Posterization

``````float gamma = 0.6;
float numColors = 8.0;

float3 c = pow(originalColor, float3(gamma));
c = floor(c * numColors) / numColors;
float3 newColor = pow(c, float3(1.0/gamma));
``````

Black and white

``````float3 newColor = float3(1.0);
float t = (originalColor.r+originalColor.g+originalColor.b)/3.0f;
if (t<0.1 || t>0.9) newColor = float(0.0);
``````

Invert

``````float3 newColor = 1-originalColor;
``````