Garry's Mod

Garry's Mod

2,134 ratings
GShader Library
4
13
11
8
7
5
4
4
4
3
2
2
2
2
2
76
   
Award
Favorite
Favorited
Unfavorite
Content Type: Addon
Addon Type: Tool
Addon Tags: Scenic
File Size
Posted
Updated
473.222 KB
Aug 5, 2025 @ 6:08am
Jun 10 @ 2:37am
194 Change Notes ( view )

Subscribe to download
GShader Library

In 1 collection by Evgeny Akabenko
GShaders
20 items
Description
GShader Library
— a shader library that serves as the foundation for creating Deferred Renderer (shading & lighting) shaders, acting as a convenient tool for creating advanced post-processing effects.



Brief list of textures in the addon:
  • _rt_WPDepth
  • _rt_NormalsTangents
  • _rt_ResolvedFullFrameDepth
  • _rt_Bumps

The addon includes:
  • Reconstruction of WorldPos, WorldNormals and Tangents from _rt_ResolvedFullFrameDepth.
  • Normal smoothing.
  • Increasing the bit depth of the depth buffer _rt_ResolvedFullFrameDepth.
  • View and projection matrices: View, Proj, ViewProj. For perspective and orthogonal projection.
  • Newly discovered texture formats that allow more flexible work with shaders.
  • Encoding Normals and Tangents into a single texture, packing WorldPos and Depth, which will fit within the 4-texture limit in screenspace_general.
  • Choice of normal reconstruction method[wickedengine.net]: Simple, 3 Tap, Improved, Accurate[atyuwen.github.io].
  • Function shaderlib.DrawScreenQuad() with Multiple Render Target support.
  • Function shaderlib.DrawVertexScreenQuad() with input data to vertex shader and MRT support. More info here: Example 6[github.com].

Encoding Normals and Tangents
Normals and Tangents are stored in the render target _rt_NormalsTangents, where:
  • .RG — Normals
  • .B — Tangents
  • .A — Sign: A value of 1 or -1. It will help you with lighting and creating Post-Process Parallax Mapping.
Normals are encoded using Octahedron normal vector encoding [knarkowicz.wordpress.com]
Normal decoding is done via the function:
float3 Decode(float2 f) { f = f * 2.0 - 1.0; // https://twitter.com/Stubbesaurus/status/937994790553227264 float3 n = float3(f.x, f.y, 1.0 - abs(f.x) - abs(f.y)); float t = saturate(-n.z); n.xy += n.xy >= 0.0 ? -t : t; return normalize(n); }
Tangents are encoded using Diamond Encoding [www.jeremyong.com]
Tangent decoding is done via the function:
float2 decode_diamond(float p) { float2 v; // Remap p to the appropriate segment on the diamond float p_sign = sign(p - 0.5f); v.x = -p_sign * 4.f * p + 1.f + p_sign * 2.f; v.y = p_sign * (1.f - abs(v.x)); // Normalization extends the point on the diamond back to the unit circle return normalize(v); } float3 decode_tangent(float3 normal, float diamond_tangent) { // As in the encode step, find our canonical tangent basis span(t1, t2) float3 t1; if (abs(normal.y) > abs(normal.z)) { t1 = float3(normal.y, -normal.x, 0.f); } else { t1 = float3(normal.z, 0.f, -normal.x); } t1 = normalize(t1); float3 t2 = cross(t1, normal); // Recover the coordinates used with t1 and t2 float2 packed_tangent = decode_diamond(diamond_tangent); return packed_tangent.x * t1 + packed_tangent.y * t2; }

Example of working with _rt_NormalsTangents:
float4 normals_tangets = tex2D(NormalTangentBuffer,uv); float flipSign = normals_tangets.a; float3 worldNormal = Decode(normals_tangets.xy); float3 tangents = decode_tangent(worldNormal, normals_tangets.z); float3 binormals = normalize(cross(worldNormal,tangents))* flipSign; float3x3 TBN = float3x3(tangents, binormals, worldNormal);

Packing WorldPos and Depth
WorldPos and Depth are stored in the render target _rt_WPDepth, where:
  • .RGB1/WorldPos: This means that WorldPos is packed into values <1. To unpack, use float3 worldPos = 1/tex2D(WPDepthBuffer,uv).xyz; in the shader.
  • .A — Depth

NOTE:
The depth buffer does not write translucent objects, so you will most likely render shaders in the PreDrawTranslucentRenderables [wiki.facepunch.com] hook.

Special thanks to:
Meetric [github.com] — WorldPos reconstruction.
notunknowndude— the idea to improve the depth buffer.
puwada — the tip about texture format compatibility and DirectX.
LVutner [github.com] — implementation Velocity Buffer encoding of CryTeck method.
Zaurzo [gist.github.com] — DynamicLight Wrapper.
Blackknight33[www.artstation.com] — GShader logo.
Xenthio[github.com] — 3D Skybox PVS optimization.

Links:

Originally posted by devonium:
SHADERS FOR EVERYONE!!!! i have no idea wtf is going on

P.S. Shader examples are not in the addon. Screenshots show what the GShader library allows you to do.
Popular Discussions View All (25)
14
Dec 26, 2025 @ 9:15am
can someone send a shader from this addon if there is one?
ModestShoducks
3
Jan 24 @ 12:18pm
for some reason gshader spams 3 errors without stopping, when playing a save
[SIC] TMT
6
May 25 @ 4:49am
i think someone is making the most realistic graphics ever in gmod
bulkmoerls
605 Comments
Jun 12 @ 2:42am 
[GShader Library] lua/autorun/client/bumps_building.lua:383: attempt to call method 'IsDisplacement' (a nil value)
1. BuildMeshes - lua/autorun/client/bumps_building.lua:383
2. unknown - lua/autorun/client/bumps_building.lua:459
Jun 11 @ 9:03am 
[GShader Library] lua/includes/util/color.lua:16: bad argument #1 to 'min' (number expected, got nil)
1. min - [C]:-1
2. Color - lua/includes/util/color.lua:16
3. GetHeadlightEffect - lua/autorun/!!shaderlib.lua:777
4. RenderSSAO - lua/postprocess/ssao.lua:229
5. v - lua/postprocess/ssao.lua:362
6. unknown - lua/includes/modules/hook.lua:102
Jun 9 @ 4:59am 
[GShader Library] lua/autorun/server/projected_shared.lua:23: bad argument #3 to 'old_key_value' (string expected, got boolean)
1. old_key_value - [C]:-1
2. SetKeyValue - lua/autorun/server/projected_shared.lua:23
3. CustomOnLeapAttack_BeforeStartTimer - lua/entities/npc_vj_mcslime/init.lua:236
4. unknown - lua/entities/npc_vj_creature_base/init.lua:1436
5. unknown - lua/entities/npc_vj_creature_base/init.lua:2309
Jun 8 @ 1:36am 
IT BREAKS MY VMANIP MODS
:steamfacepalm:
Jun 7 @ 2:56pm 
:gmod:ood mod :steamhappy:
Jun 5 @ 10:29pm 
This comment is awaiting analysis by our automated content check system. It will be temporarily hidden until we verify that it does not contain harmful content (e.g. links to websites that attempt to steal information).
Jun 3 @ 12:05pm 
anyone having conflictions with volumetric fog? https://steamcommunity.com/sharedfiles/filedetails/?id=3195029892
May 20 @ 2:21am 
Yeah, it's a real shame.
May 19 @ 12:03pm 
I like gshader but I don't like niknaks as niknaks breaks a lot of stuff so that's sad 3: