HLSL language preview
1. Vertex shader
struct semantics, constant buffers, and matrix math
horizon-dark
cbuffer Constants : register(b0) {
float4x4 worldViewProj;
};
struct VSInput {
float3 position : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VSOutput {
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
VSOutput main(VSInput input) {
VSOutput output;
output.position = mul(worldViewProj, float4(input.position, 1.0f));
output.normal = input.normal;
output.uv = input.uv;
return output;
} atom-one-dark
cbuffer Constants : register(b0) {
float4x4 worldViewProj;
};
struct VSInput {
float3 position : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VSOutput {
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
VSOutput main(VSInput input) {
VSOutput output;
output.position = mul(worldViewProj, float4(input.position, 1.0f));
output.normal = input.normal;
output.uv = input.uv;
return output;
} github-dark
cbuffer Constants : register(b0) {
float4x4 worldViewProj;
};
struct VSInput {
float3 position : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VSOutput {
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
VSOutput main(VSInput input) {
VSOutput output;
output.position = mul(worldViewProj, float4(input.position, 1.0f));
output.normal = input.normal;
output.uv = input.uv;
return output;
} dracula
cbuffer Constants : register(b0) {
float4x4 worldViewProj;
};
struct VSInput {
float3 position : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VSOutput {
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
VSOutput main(VSInput input) {
VSOutput output;
output.position = mul(worldViewProj, float4(input.position, 1.0f));
output.normal = input.normal;
output.uv = input.uv;
return output;
} nord
cbuffer Constants : register(b0) {
float4x4 worldViewProj;
};
struct VSInput {
float3 position : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VSOutput {
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
VSOutput main(VSInput input) {
VSOutput output;
output.position = mul(worldViewProj, float4(input.position, 1.0f));
output.normal = input.normal;
output.uv = input.uv;
return output;
} github
cbuffer Constants : register(b0) {
float4x4 worldViewProj;
};
struct VSInput {
float3 position : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VSOutput {
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
VSOutput main(VSInput input) {
VSOutput output;
output.position = mul(worldViewProj, float4(input.position, 1.0f));
output.normal = input.normal;
output.uv = input.uv;
return output;
} 2. Pixel shader
texture sampling and lighting with intrinsic functions
horizon-dark
Texture2D mainTex : register(t0);
SamplerState samp : register(s0);
float4 main(float3 normal : NORMAL, float2 uv : TEXCOORD0) : SV_TARGET {
float3 lightDir = normalize(float3(0.3f, 1.0f, 0.2f));
float diffuse = saturate(dot(normalize(normal), lightDir));
float4 albedo = mainTex.Sample(samp, uv);
return float4(albedo.rgb * lerp(0.2f, 1.0f, diffuse), albedo.a);
} atom-one-dark
Texture2D mainTex : register(t0);
SamplerState samp : register(s0);
float4 main(float3 normal : NORMAL, float2 uv : TEXCOORD0) : SV_TARGET {
float3 lightDir = normalize(float3(0.3f, 1.0f, 0.2f));
float diffuse = saturate(dot(normalize(normal), lightDir));
float4 albedo = mainTex.Sample(samp, uv);
return float4(albedo.rgb * lerp(0.2f, 1.0f, diffuse), albedo.a);
} github-dark
Texture2D mainTex : register(t0);
SamplerState samp : register(s0);
float4 main(float3 normal : NORMAL, float2 uv : TEXCOORD0) : SV_TARGET {
float3 lightDir = normalize(float3(0.3f, 1.0f, 0.2f));
float diffuse = saturate(dot(normalize(normal), lightDir));
float4 albedo = mainTex.Sample(samp, uv);
return float4(albedo.rgb * lerp(0.2f, 1.0f, diffuse), albedo.a);
} dracula
Texture2D mainTex : register(t0);
SamplerState samp : register(s0);
float4 main(float3 normal : NORMAL, float2 uv : TEXCOORD0) : SV_TARGET {
float3 lightDir = normalize(float3(0.3f, 1.0f, 0.2f));
float diffuse = saturate(dot(normalize(normal), lightDir));
float4 albedo = mainTex.Sample(samp, uv);
return float4(albedo.rgb * lerp(0.2f, 1.0f, diffuse), albedo.a);
} nord
Texture2D mainTex : register(t0);
SamplerState samp : register(s0);
float4 main(float3 normal : NORMAL, float2 uv : TEXCOORD0) : SV_TARGET {
float3 lightDir = normalize(float3(0.3f, 1.0f, 0.2f));
float diffuse = saturate(dot(normalize(normal), lightDir));
float4 albedo = mainTex.Sample(samp, uv);
return float4(albedo.rgb * lerp(0.2f, 1.0f, diffuse), albedo.a);
} github
Texture2D mainTex : register(t0);
SamplerState samp : register(s0);
float4 main(float3 normal : NORMAL, float2 uv : TEXCOORD0) : SV_TARGET {
float3 lightDir = normalize(float3(0.3f, 1.0f, 0.2f));
float diffuse = saturate(dot(normalize(normal), lightDir));
float4 albedo = mainTex.Sample(samp, uv);
return float4(albedo.rgb * lerp(0.2f, 1.0f, diffuse), albedo.a);
} 3. Compute shader
structured buffers and preprocessor directives
horizon-dark
#define THREADS 64
RWStructuredBuffer<float> data : register(u0);
[numthreads(THREADS, 1, 1)]
void main(uint3 id : SV_DispatchThreadID) {
uint i = id.x;
[unroll]
for (uint j = 0; j < 4; j++) {
data[i + j] = saturate(data[i + j] * 2.0f);
}
} atom-one-dark
#define THREADS 64
RWStructuredBuffer<float> data : register(u0);
[numthreads(THREADS, 1, 1)]
void main(uint3 id : SV_DispatchThreadID) {
uint i = id.x;
[unroll]
for (uint j = 0; j < 4; j++) {
data[i + j] = saturate(data[i + j] * 2.0f);
}
} github-dark
#define THREADS 64
RWStructuredBuffer<float> data : register(u0);
[numthreads(THREADS, 1, 1)]
void main(uint3 id : SV_DispatchThreadID) {
uint i = id.x;
[unroll]
for (uint j = 0; j < 4; j++) {
data[i + j] = saturate(data[i + j] * 2.0f);
}
} dracula
#define THREADS 64
RWStructuredBuffer<float> data : register(u0);
[numthreads(THREADS, 1, 1)]
void main(uint3 id : SV_DispatchThreadID) {
uint i = id.x;
[unroll]
for (uint j = 0; j < 4; j++) {
data[i + j] = saturate(data[i + j] * 2.0f);
}
} nord
#define THREADS 64
RWStructuredBuffer<float> data : register(u0);
[numthreads(THREADS, 1, 1)]
void main(uint3 id : SV_DispatchThreadID) {
uint i = id.x;
[unroll]
for (uint j = 0; j < 4; j++) {
data[i + j] = saturate(data[i + j] * 2.0f);
}
} github
#define THREADS 64
RWStructuredBuffer<float> data : register(u0);
[numthreads(THREADS, 1, 1)]
void main(uint3 id : SV_DispatchThreadID) {
uint i = id.x;
[unroll]
for (uint j = 0; j < 4; j++) {
data[i + j] = saturate(data[i + j] * 2.0f);
}
}