Obsidian: [[11-01-01-GLSL]] [[09-01-01-U_Shaders]] [[15-01-01-Shading]]
avoiding conditionals
http://theorangeduck.com/page/avoiding-shader-conditionals
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-pguide
Intrinsic Data types
Buffer
- Buffer, which contains one or more scalars
Scalar
- One-component scalar
Vector
, Matrix
- Multiple-component vector or matrix
Sampler
, Shader
, Texture
- Sampler, shader, or texture object
Struct
, User Defined
- Custom structure or typedef
Variables
bool
true or false
int
32-bi integer - int Foo[3]; / int Foo[3] = {1,2,3};
half
16bit integer
float
32bit float - float Foo = 3.1f;
double
64bit double
float3
vectorTest
float
vectorTest[3]
vector
vectorTest
float2
vectorTest
bool3
vectorTest
float3x3
: a 3×3 matrix, type float
float2x2
: a 2×2 matrix, type float
.
float4 color;
uniform float4 position : SV_POSITION;
const float4 lightDirection = {0,0,1};
discard; Do not output the result of the current pixel.
http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm - SDF & HLSL
Key Words
return [value];
continue;
- Stop loop (do, for, while) / update the loop conditions / begin executing from the top of the loop
discard;
- Do not output the result of the current pixel
break;
- Exit the surrounding loop (do, for, while).
float Scale;
float4 main(in float2 uv: TEXCOORD0): SV_TARGET
{
float x = sin(uv.x*Scale);
return float4(0.4,x,0.5,1.0);
}
https://www.bouncepatch.com/hlsl.html - hlsl tuts
https://www.ronja-tutorials.com/2018/03/20/hlsl-basics.html - hlsl tuts
http://www.catalinzima.com/xna/tutorials/crash-course-in-hlsl/ - hlsl ala wiki
http://rbwhitaker.wikidot.com/hlsl-tutorials - hlsl xna
http://www.alanzucconi.com/2016/07/01/volumetric-rendering/ - volume implementation hlsl
pos_object
pos_world
pos_camera
pos_clip (projective space)
Loop
[Attribute] do { Statement Block; } while( Conditional );
- Execute a series of statements continuously until the conditional expression fails. For statement. Iteratively executes a series of statements, based on the evaluation of the conditional expression.
[Attribute] while ( Conditional ) { Statement Block; }
- while
Conditioning
[Attribute] if ( Conditional ) { Statement Block; }
Unreal Overlay blend of: Base
and Blend
inputs:
return Base < 0.5f ? (2.0 * Base * Blend) : (1.0f - 2.0f * (1.0 - Base) * (1.0f - Blend));
Switch
[Attribute] switch( Selector ) { case 0 : { StatementBlock; } break; case 1 : { StatementBlock; } break; case n : { StatementBlock; } break; default : { StatementBlock; } break;
Fn
intrinsic functions list: https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions
HLSL-Spherical-Harmonics
Vertex Shader Semantics:
BINORMAL[n]
float4 - Binormal
BLENDINDICES[n]
uint - Blend indices
BLENDWEIGHT[n]
float - Blend weights
COLOR[n]
float4 - Diffuse and specular color / Diffuse or specular color
NORMAL[n]
float4 - Normal vector
POSITION[n]
float4 - Vertex position in object space
POSITIONT
float4 - Transformed vertex position
PSIZE[n]
float - Point size
TANGENT[n]
float4 - Tangent
TEXCOORD[n]
float4 - Texture coordinates
Output:
POSITION[n]
float4 - Vertex position in homogenous space. Compute position in screen-space by dividing (x,y,z) by w
FOG
float - Vertex fog
PSIZE
float - Point size
TESSFACTOR[n]
float - Tessellation factor
TEXCOORD[n]
float4 - Texture coordinates
Pixel Shader Semantics:
COLOR[n]
float4 - Diffuse or specular color
TEXCOORD[n]
float4 - Texture coordinates
SV_IsFrontFace
float - Floating-point scalar that indicates a back-facing primitive. A negative value faces backwards
SV_Position
float2 - The pixel location (x,y) in screen space
Output:
SV_Depth
, COLOR[n]
float4 - Output color
SV_Target
, DEPTH[n]
float - Output depth
DirectX10 Semantics:
SV_POSITION
, which is interpreted by the rasterizer stage can be specified as an input to a vertex shader as well as an output Pixel shaders can only write to parameters with the SV_Depth and SV_Target system-value semantics
SV_VertexID
, SV_InstanceID
, SV_IsFrontFace
can only be input into the first active shader
SV_Target[n]
, where 0 <= n <= 7 The output value that will be stored in a render target. available to all shaders
SV_Depth
UE Examples in Material Editor
float3 foo = InputName;
returen foo;
Exp fn.
Input_1
, exp
float ip1 = Input_1;
float S = float3(pow(ip1,exp));
return S;
Lerp
float3 ip1 = input_1;
float3 ip2 = input_2;
float3 ret = float3(lerp(ip1,ip2,ips));
return ret;
Overlay
In: Base, Blend
return Base < 0.5f ? (2.0 * Base * Blend) : (1.0f - 2.0f * (1.0 - Base) * (1.0f - Blend));
Blur (UE docs)
Tex
, UV
, r
, dist
float3 blur = Texture2DSample(Tex, TexSampler, UV);
for (int i = 0; i < r; i++)
{
blur += Texture2DSample(Tex, TexSampler, UV + float2(i * dist, 0));
blur += Texture2DSample(Tex, TexSampler, UV - float2(i * dist, 0));
}
for (int j = 0; j < r; j++)
{
blur += Texture2DSample(Tex, TexSampler, UV + float2(0, j * dist));
blur += Texture2DSample(Tex, TexSampler, UV - float2(0, j * dist));
}
blur /= 2*(2*r)+1;
return blur;
https://forums.unrealengine.com/development-discussion/rendering/1409859-custom-hlsl-tips
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions fn list
https://api.unrealengine.com/INT/API/Runtime/Engine/FViewUniformShaderParameters/index.html
https://docs.unrealengine.com/en-US/Programming/Rendering/ShaderDevelopment/HLSLCrossCompiler/index.html
https://polydna.blogspot.com/2020/01/working-with-hlsl-in-unreal.html
Get dimensions (of tex)
unit3 dimension;
Tex.GetDimensions(0,dimension.x,dimension.y,dimension.z);
return float2(dimension.xy);
Shader structure
// Inputs
float4x4 object_to_world: WORLD;
float4x4 object_to_clip: WORLDVIEWPROJECTION;
float3 light_pos: LIGHT_POS;
float3 light_color: LIGHT_COLOR;
float3x3 object_to_world3x3 = (float3x3)object_to_world;
// Structures
struct vs_in {
float4 pos_object: POSITION;
float3 normal_object: NORMAL;
};
struct ps_in {
float4 pos_clip: POSITION;
float3 normal_world: TEXCOORD0;
float3 light_world: TEXCOORD1;
};
// Vertex Shaders
ps_in vs_main(vs_in input) {
ps_in output;
output.pos_clip = mul(input.pos_object, object_to_clip);
output.normal_world =
mul(input.normal_object, object_to_world3x3);
float4 pos_world = mul(input.pos_object, object_to_world);
output.light_world = light_pos - pos_world.xyz;
return output;
}
// Pixel Shaders
float4 ps_main(ps_in input) : COLOR {
float3 result = light_world;
float3 normal_world = normalize(input.normal_world);
float3 light_world = normalize(input.light_world);
result *= saturate(dot(normal_world, light_world));
return float4(result, 1.f);
}
// Techniques
technique main {
pass p0 {
VertexShader = compile vs_3_0 vs_main();
PixelShader = compile ps_3_0 ps_main();
}
}
http://shaderjvo.blogspot.com/2011/08/introduction-to-hlsl-part-3.html
Compute shaders
https://medium.com/realities-io/using-compute-shaders-in-unreal-engine-4-f64bac65a907 https://catlikecoding.com/unity/tutorials/basics/compute-shaders/ https://www.youtube.com/watch?v=aKo0ESuVrgs&list=PL78XDi0TS4lEMvytsE_MoWEpzBcukXv9b&index=4