Garry's Mod
Оценок: 884
GShader Library
11
5
5
4
2
6
3
4
4
3
   
Наградить
В избранное
В избранном
Удалить
Тип контента: Дополнение
Тип дополнения: Инструмент
Метки дополнений: Сценическое
Размер файла
Добавлен
Изменён
99.672 KB
5 авг в 6:08
26 авг в 17:41
Обновлений: 43 (просмотреть)

Подпишитесь, чтобы загрузить
GShader Library

Описание
GShader Library
— шейдерная библиотека, являющаяся основой для создания Deferred renderer (shading & lighting) шейдеров, выступающим удобным инструментом для создания продвинутых эффектов пост-обработки.

Краткий список текстур в аддоне:
  • _rt_WPDepth
  • _rt_NormalsTangents
  • _rt_Velocity
  • _rt_ResolvedFullFrameDepth

Аддон включает в себя:
  • Реконструкцию WorldPos, WorldNormals и Tangents из _rt_ResolvedFullFrameDepth.
  • Сглаживание нормалей.
  • Увеличение битности буфера глубины _rt_ResolvedFullFrameDepth.
  • Матрицы вида и проекций: View, Proj, ViewProj. Для перспективной и ортогональной проекции.
  • Новые найденные форматы текстур, позволяющие гибче работать с шейдерами.
  • Кодирование Нормалей и Тангентов в одну текстуру, компоновку WorldPos и Глубины, что позволит вмещаться в лимит 4-ех текстур в screenspace_general.
  • Выбор метода реконструкции нормалей [wickedengine.net]: Простой, 3 Tap, Улучшенный, Точный[atyuwen.github.io].
  • Функцию shaderlib.DrawScreenQuad() с поддержкой Multiple Render Target.
  • Функцию shaderlib.DrawVertexScreenQuad() с вводом данных в вертексный шейдер и поддержкой MRT. Больше информации здесь: Example 6[github.com].
  • Velocity Buffer.

Кодирование Нормалей и Тангентов
Нормали и Тангенты хранятся в рендертаргете _rt_NormalsTangents, где:
  • .RG — Normals
  • .B — Tangents
  • .A — Sign: Знак в виде числа 1 или -1. Он поможет вам в освещении и создании Post-Process Parallax Mapping'a.
Нормали кодируются с помощью Octahedron normal vector encoding [knarkowicz.wordpress.com]
Декодирование Нормалей происходит через функцию:
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); }
Тангенты кодируются с помощью Diamond Encoding [www.jeremyong.com]
Декодирование Тангентов происходит через функцию:
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; }

Пример работы с _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);

Компоновка WorldPos'a и Глубины
WorldPos и Depth хранятся в рендертаргете _rt_WPDepth, где:
  • .RGB1/WorldPos: Это значит то, что WorldPos запакована в числа <1. Для распаковки так же используйте float3 worldPos = 1/tex2D(WPDepthBuffer,uv).xyz; внутри шейдера.
  • .A — Глубина

Внимание:
Буфер глубины не записывает полупрозрачные объекты, поэтому, скорее всего, вы будете рендерить шейдеры в хуке PreDrawTranslucentRenderables [wiki.facepunch.com].

Отдельное спасибо:
Meetric [github.com] — за реконструкцию WorldPos.
notunknowndude — за идею для улучшения буфера глубины.
puwada — за подсказку с совместимостью форматов текстур и DirectX.
LVutner [github.com] — создание кодирования для Velocity Buffer на основе метода CryTeck.

Ссылки:

Автор сообщения: devonium
SHADERS FOR EVERYONE!!!! i have no idea wtf is going on

P.S. Примеры шейдеров не находятся в аддоне. Скриншоты показывают, что позволяет сделать GShader library.
Популярные обсуждения Просмотреть все (10)
31
3 ч. назад
Why is there a DMCA notice on this Addon?
CosmicInterloper
6
8 авг в 11:42
How this works как это работает?
Tixon-11
6
6 авг в 11:51
can someone send a shader from this addon if there is one?
ModestShoducks
Комментариев: 334
XX360HATMASTERXX 52 мин. назад 
@Evgeny Akabenko how to fix GlowLib Eye Glowing Effect visible through walls?
Endangered Luke-Crab 10 ч. назад 
@Evgeny Akabenko every last mw base weapon, even my pm's hands are invisible when using them
λ LIFE IS PAIN! λ 26 авг в 15:52 
is there complicating instructions and steps to make this work or does it work with the subscribe button?
Cappa 26 авг в 15:00 
nvm i got it. gmod loves being difficult with addons
Cappa 26 авг в 14:57 
The GShader library and GShader settings are not appearing in game. and no errors are coming up with the mod so i am not sure why it's not working
Designated Kitty 03-052 26 авг в 13:05 
It makes the enhanced camera legs have a duplicate body that lags around when you move.
fawn希望 26 авг в 12:35 
Great work! However it seems to have problems with this addon:
https://gtm.steamproxy.vip/sharedfiles/filedetails/?id=3386878739
The legs no longer draw when GShader is installed.
Evgeny Akabenko  [создатель] 26 авг в 9:05 
Fixed TFA flashlight glitching :buckshotblank::buckshotlive:
Evgeny Akabenko  [создатель] 26 авг в 7:59 
@Endangered Luke-Crab what is a specifically weapons? Or are all MW base weapons invisible?
:spycon::spycon::spycon::spycon::spycon::spycon:
Evgeny Akabenko  [создатель] 26 авг в 7:59 
@hl1x I'm not sure that motion blur in gmod uses velocity buffer.

Even motion blur on camera velocity buffer will be better than the current one.

But now in GShader lib velocity buffer works only with camera rotation (old and new projection view matrix). That is, the movements of vertices on the screen are not taken into account.