GShader Library
Добавить в игру через Steam
Нажмите «Подписаться»
На странице Steam войдите в аккаунт, если потребуется.
Подписаться
О материале
«GShader Library» — материал мастерской Garry’s Mod. Аддоны, карты, персонажи и инструменты для песочницы. Данные Steam, описание автора и ссылка для установки через подписку. Совместимость редакцией не проверена.
Описание автора
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: Simple, 3 Tap, Improved, Accurate.
-
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.
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 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 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:
-
.RGB — 1/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 hook.
Special thanks to:
Meetric — WorldPos reconstruction. notunknowndude— the idea to improve the depth buffer. puwada — the tip about texture format compatibility and DirectX. LVutner — implementation Velocity Buffer encoding of CryTeck method. Zaurzo — DynamicLight Wrapper. Blackknight33 — GShader logo. Xenthio — 3D Skybox PVS optimization.
Links:
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.
Как установить и запустить
Откройте оригинальную страницу в Steam Workshop, проверьте версию игры, зависимости и порядок загрузки в описании автора. Нажмите «Подписаться» и дождитесь загрузки Steam. Включите материал в меню модификаций или контента игры, если это требуется. Совместимость и запуск редакцией не проверены.