» ShaderSnippets
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.


Why reinvent the wheel? There're some handy little functions for the everyday HLSL writer. Please add your snippets in this wiki page.

General snippets

get clipping planes of a Perspective Projection

float FarPlane = 1 / (tPI[2][3] + tPI[3][3]);
float NearPlane = 1 / distance(tPI[2][3], tPI[3][3]);

VertexShader snippets

apply rotation to vertices via texture

rotation function:

float4x4 Vrotate(float rotX, 
         float rotY, 
         float rotZ)
   rotX *= TwoPi;
   rotY *= TwoPi;
   rotZ *= TwoPi;
   float sx = sin(rotX);
   float cx = cos(rotX);
   float sy = sin(rotY);
   float cy = cos(rotY);
   float sz = sin(rotZ);
   float cz = cos(rotZ);
   return float4x4( cz*cy+sz*sx*sy, sz*cx, cz*-sy+sz*sx*cy, 0,
                   -sz*cy+cz*sx*sy, cz*cx, sz*sy+cz*sx*cy , 0,
                    cx * sy       ,-sx   , cx * cy        , 0,
                    0             , 0    , 0              , 1);

use the function like this:

PosO = mul(PosO, Vrotate(Sampler.r, Sampler.g, Sampler.b));
NormO = mul(NormO, Vrotate(Sampler.r, Sampler.g, Sampler.b));

Sampler.rgb are the corresponding values from the texture

Render to Texture/UV (useful for e.g. texture baking)

Calculate screenspace coordinates based on UV instead of object space and pass it to PS

Out.Pos = float4((TexCd.xy-0.5)*2*float2(1,-1),0,1);

PixelShader snippets for Image processing



col.rgb = 1 - col.rgb;


col.rgb = ((col.rgb - 0.5) * var) + 0.5;

if var > 1, the contrast is greater. var = 0 gives a grey picture
The 0.5 can be replaced with a variable to give a gamma or centre
point for the contrast as well, for more fine tuning...


const float4 lumcoeff = {0.299, 0.587, 0.114, 0};
col = dot(col, lumcoeff);

the dot product of the color (col) and the luminace coefficients results in a correct b&w image


const float4 lumcoeff = {0.299, 0.587, 0.114, 0};
float luma = length(dot(col, lumcoeff));
col.a = step(var, luma);

var is the keying amount. the rest works like the b&w conversion.

scene alpha

return(tex2D(Samp, float2(IN.TexCd.xy)).wwww);

Texture input must be in A8R8G8B8 format.

working alpha channel in 3d

needs 2 passes so connect an iobox with 2 rows to the pass pin and fill it with 0,1

technique workingalpha
    pass P0
        VertexShader = compile vs_1_0 VS();
        PixelShader  = compile ps_2_0 PS();
        AlphaBlendEnable = false;
        AlphaTestEnable = true;
        AlphaFunc = Greater;
        AlphaRef = 245;
        ZEnable = true;
        ZWriteEnable = true;
        CullMode = None;
    pass P1
        VertexShader = compile vs_1_0 VS();
        PixelShader  = compile ps_2_0 PS();
        AlphaBlendEnable = true;
        SrcBlend = SrcAlpha;
        DestBlend = InvSrcAlpha;
        AlphaTestEnable = true;
        AlphaFunc = LessEqual;
        AlphaRef = 245;
        ZEnable = true;
        ZWriteEnable = false;
        CullMode = None;

DX11 Set DepthBuffer

Put this up near the start of your shader
DepthStencilState DisableDepth

    DepthEnable = FALSE;
    DepthWriteMask = ZERO;
    DepthFunc = LESS_EQUAL;
    StencilEnable  = FALSE;


and add this when you create the pass
and SetVertexShader etc
SetDepthStencilState( DisableDepth, 0 );

DX11 Access TextureArray

// declare array of N textures
Texture2D MyTextureArray[N];

// sample texture of index I from array (0 to N-1)
MyTextureArray[I].Sample(MySampler, UV);

Will the real texture array please stand up

note that the above is an array of textures- which is NOT the same thing as a actual texture array! Example of that below:

//Control Texture Array
bool useControlMap;
Texture2DArray cTex <string uiname="Texture";>;
SamplerState sam //can be set in vvvv

    Filter = MIN_MAG_MIP_LINEAR; 
    AddressU = Wrap;
    AddressV = Wrap;


float controlTexSample(float2 uv, float iid)
float control = 1;
if (useControlMap)
uint d,textureCount;
float3 coords = float3(uv, iid % textureCount); //make sure Instance ID buffer is in floats
control *= cTex.SampleLevel(sam,coords,0).r;
return control;

Set Output-TextureFormat for DX11-TXF-Shader

pass P0 <string format="R32G32B32A32_float";>

Defines (or pre-processor directives)

Use pre-processors as in other C inspired languages. These will actually transform the text of your code before compilation.

#define MYDEFINE 4
float MyFunc()
    return MYDEFINE;
// result: 4


float MyFunc()
    return 2;
    return 0;
// result: 2

Check if thing is defined:

float MyFunc()
#if defined(MYCONDITION)
    return 2;
    return 0;
// result: 2

DX11: Define from vvvv

All shader nodes in DX11 (layers, tfx and gfx) have a hidden pin called "Defines" which awaits a spread of string formatted like that:


Every time you change the Defines spread shader is recompiled. Example tricks:

Change tfx pass format without changing the code:

// define a default value to avoid compilation errors
#if !defined(PASSFORMAT)
#define PASSFORMAT "R8_UNorm"
pass P0 <string format=PASSFORMAT;>

from vvvv:


anonymous user login


~16h ago

joreg: also there is this nuget which sounds like an option: https://www.nuget.org/packages/TidyNetstandard/

~16h ago

joreg: if basic format tyding is enough you can use the XML ToString in VL

~19h ago

mediadog: Thanks @joreg. I really miss Tidy (XML), use it to clean up weather station data for realtime displays, any recommendations?

~19h ago

joreg: @mediadog thanks for the pointer. fixed.

~2d ago

mediadog: Clicking on "Missing in 64 bit builds" goes to page with warning no longer maintained, but betadocs link has no such info.

~7d ago

nanotekt: VL.stride yet again ...this time nonphotorealistic https://youtu.be/_aALr2wcj0Y ...wish evvvveryone to be well!

~11d ago

nanotekt: a brief VL.stride study https://youtu.be/B2Nlz5VZ9lM ...and a massive 'thank you' to the devvvvs!

~6d ago

everyoneishappy: @overtones this would require 4D noise, which is possible but not implemented in Fieldtrip

~14d ago

overtones: Hi! SF2D has Time & DomainOffset inputs, but SF3D only DomainOffset. Is there a way to use Time in SF3D or it makes no sense? Thx

~17d ago

joreg: @SabrinaVerhage this could be useful for you next "hacking sex" workshop: https://buttplug.io they have a .NET nuget for use in vvvv!