Topics
- Scenes overview
- Terminology
-
Editor
-
Tutorials
-
Expression port
-
Shader port
-
Nodes
Shader snippets
Here is a few snippets of shader code that can be useful from time to time.
Math
Smooth bumpCreates 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 lambertNice 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 axisfloat3 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 correctionfloat 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;
