From cb4969970c9ac1837bd87f7cc9b934e75f59f8c5 Mon Sep 17 00:00:00 2001 From: SkyLoader Date: Tue, 30 Oct 2018 14:08:07 +0300 Subject: [PATCH] OpenGL: added shaders: water, waterd, lmape, vert, lod, accum_emissivel, model_distort --- res/gamedata/shaders/gl/accum_emissivel.ps | Bin 0 -> 136 bytes res/gamedata/shaders/gl/font2.ps | Bin 0 -> 241 bytes res/gamedata/shaders/gl/iostructs/p_lmape.h | 37 +++++++++ res/gamedata/shaders/gl/iostructs/p_lod.h | 68 ++++++++++++++++ res/gamedata/shaders/gl/iostructs/p_vert.h | 25 ++++++ res/gamedata/shaders/gl/iostructs/p_water.h | 63 ++++++++++++++ res/gamedata/shaders/gl/iostructs/p_waterd.h | 33 ++++++++ res/gamedata/shaders/gl/iostructs/v_lmape.h | 70 ++++++++++++++++ res/gamedata/shaders/gl/iostructs/v_lod.h | 63 ++++++++++++++ res/gamedata/shaders/gl/iostructs/v_vert.h | 61 ++++++++++++++ res/gamedata/shaders/gl/iostructs/v_water.h | 77 ++++++++++++++++++ res/gamedata/shaders/gl/iostructs/v_waterd.h | 59 ++++++++++++++ res/gamedata/shaders/gl/lmape.ps | Bin 0 -> 796 bytes res/gamedata/shaders/gl/lmape.vs | 22 +++++ res/gamedata/shaders/gl/lod.ps | Bin 0 -> 2848 bytes res/gamedata/shaders/gl/lod.vs | 30 +++++++ res/gamedata/shaders/gl/model_distort.vs | 19 +++++ .../shaders/gl/model_distort4glass.vs | 20 ++--- res/gamedata/shaders/gl/shared/common.h | 6 +- res/gamedata/shaders/gl/vert.ps | Bin 0 -> 369 bytes res/gamedata/shaders/gl/vert.vs | 21 +++++ res/gamedata/shaders/gl/water.ps | Bin 0 -> 2719 bytes res/gamedata/shaders/gl/water.vs | 67 +++++++++++++++ res/gamedata/shaders/gl/water_soft.ps | Bin 0 -> 80 bytes res/gamedata/shaders/gl/water_soft.vs | 2 + res/gamedata/shaders/gl/waterd.ps | Bin 0 -> 1388 bytes res/gamedata/shaders/gl/waterd.vs | 33 ++++++++ res/gamedata/shaders/gl/waterd_soft.ps | Bin 0 -> 81 bytes res/gamedata/shaders/gl/waterd_soft.vs | 2 + 29 files changed, 767 insertions(+), 11 deletions(-) create mode 100644 res/gamedata/shaders/gl/accum_emissivel.ps create mode 100644 res/gamedata/shaders/gl/font2.ps create mode 100644 res/gamedata/shaders/gl/iostructs/p_lmape.h create mode 100644 res/gamedata/shaders/gl/iostructs/p_lod.h create mode 100644 res/gamedata/shaders/gl/iostructs/p_vert.h create mode 100644 res/gamedata/shaders/gl/iostructs/p_water.h create mode 100644 res/gamedata/shaders/gl/iostructs/p_waterd.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_lmape.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_lod.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_vert.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_water.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_waterd.h create mode 100644 res/gamedata/shaders/gl/lmape.ps create mode 100644 res/gamedata/shaders/gl/lmape.vs create mode 100644 res/gamedata/shaders/gl/lod.ps create mode 100644 res/gamedata/shaders/gl/lod.vs create mode 100644 res/gamedata/shaders/gl/model_distort.vs create mode 100644 res/gamedata/shaders/gl/vert.ps create mode 100644 res/gamedata/shaders/gl/vert.vs create mode 100644 res/gamedata/shaders/gl/water.ps create mode 100644 res/gamedata/shaders/gl/water.vs create mode 100644 res/gamedata/shaders/gl/water_soft.ps create mode 100644 res/gamedata/shaders/gl/water_soft.vs create mode 100644 res/gamedata/shaders/gl/waterd.ps create mode 100644 res/gamedata/shaders/gl/waterd.vs create mode 100644 res/gamedata/shaders/gl/waterd_soft.ps create mode 100644 res/gamedata/shaders/gl/waterd_soft.vs diff --git a/res/gamedata/shaders/gl/accum_emissivel.ps b/res/gamedata/shaders/gl/accum_emissivel.ps new file mode 100644 index 0000000000000000000000000000000000000000..cb676e369550dee12c038ab9f345a67bdb063dbc GIT binary patch literal 136 zcmY$+%uCKGO-WTyO3u&C&Ck=zP~uXCi)H2)mlTyImlVeo#HWV>3M j7-(8^aTe*717!{M(iC(RfNYRRYDsBPo!%5Ix&pF-k6k60-Fc_0lwzBK6Qid#i*DF~pLwkuhncs{dZk0BQ39MPeJj z%@3x^6uLV~m=w0Itw~Q4KE2MAZN2LX-+nZiu08=DcNWv4Fif zD`!nDjfc`YJU@jyf|KSboiY{Yi+?+UG`y;d)V$PI_O@h{H$1?IC{ zv=Z0@czIbrF&4EnNe-zmmb2|2Aa3~i`l#wX&U^#LE$L1W*t4ywzCAP}7z&rR%E%bC5+IEvloRIog{XPkdCr^+ X|EvKR{(^{*L>lA7#Okks`^|p3zg~NWEPwn7d|0mM1LLfQM0@L4Yo@G1!B{duLEuMv!f+*0ot( zkHHI`AIH34A_{_(WuVhWNWE=C~d5Y09Rwl(kq;{ox+HXcZSiUVdms&IF?$apOF z;E8zaQR1|ajyZ4|r1Oj{4v{h``d!i~K*AA8P)e)OcXu8Sk<<617#6Mh9TU5r)iH7K zvdbXk4ANv_D2B){B*(&Nc%hjC6G@Ipnb8z9{CcPT^1%p(qw{kk(EFxw9_T|2`*P$t z;u3~j4JCY{qGuvy*uX0ODw)?chz2fZ8?Xe3N|IDbK65yZ(vgoT_iD#K?n|MiR>`0d2|0Afg(&%%!UNB?Afku5?Pa?Pn*-|Z} z^o#kmj|?+|q4fd(V^1aO-*dU`SPlf?fd*YB!*5eSJufqV!t25+&-s#vNhHKq2%XKFiqY~le|oFfr^EH z$0V!mSfyF!x#)~&H&G2_Q#8z1hl>l$3bEunB@`6CoCH}9tPb&cy73af?t0U{_i!aO zJ&cl_C-@^Hnj?3JiUW0GWWXxJjpZd7;5$p4XL6Q9nL_Ms?%dm(T&kaj zMJzv+glJdt7HfgBO!Ps=3`AQP*HVqH`gnwU&yy_o#CC`)6hY<@2yQUB=t{2=b1R}W wCA!>Z82|FG^{;?-Lp`pi`F|B@Qv}tr*8(qJN~^sDsN-^{s#jGhSaPlY1LwROWB>pF literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/lod.vs b/res/gamedata/shaders/gl/lod.vs new file mode 100644 index 00000000000..a0a1ef1697f --- /dev/null +++ b/res/gamedata/shaders/gl/lod.vs @@ -0,0 +1,30 @@ +#include "common.h" +#include "iostructs\v_lod.h" + +#define L_SCALE (2.0f*1.55f) +v2p _main ( v_lod I ) +{ + v2p o; + + //I.sun_af.xyz = I.sun_af.zyx; // skyloader: is unpack_D3DCOLOR needed here? + //I.rgbh0.xyz = I.rgbh0.zyx; + //I.rgbh1.xyz = I.rgbh1.zyx; + + // lerp pos + float factor = I.sun_af.w; + float4 pos = float4 (lerp(I.pos0,I.pos1,factor), 1.f); + + float h = lerp (I.rgbh0.w,I.rgbh1.w,factor)*L_SCALE; + + o.hpos = mul (m_VP, pos); // xform, input in world coords + o.Pe = mul (m_V, pos); + + // replicate TCs + o.tc0 = I.tc0; + o.tc1 = I.tc1; + + // calc normal & lighting + o.af = float4 (h,h,I.sun_af.z,factor); + return o; +} + diff --git a/res/gamedata/shaders/gl/model_distort.vs b/res/gamedata/shaders/gl/model_distort.vs new file mode 100644 index 00000000000..34e29e481c5 --- /dev/null +++ b/res/gamedata/shaders/gl/model_distort.vs @@ -0,0 +1,19 @@ +#include "common.h" +#include "skin.h" +#include "iostructs\v_model_distort.h" + +vf _main (v_model v) +{ + vf o; + + o.hpos = mul (m_WVP, v.P); // xform, input in world coords + o.tc0 = v.tc.xy; // copy tc + + // calculate fade + float3 dir_v = normalize (mul(m_WV,v.P)); + float3 norm_v = normalize (mul(m_WV,v.N)); + float fade = 1.f-abs (dot(dir_v,norm_v)); + o.c0 = float4 (fade); + + return o; +} diff --git a/res/gamedata/shaders/gl/model_distort4glass.vs b/res/gamedata/shaders/gl/model_distort4glass.vs index c2fef6e6ada..84856055452 100644 --- a/res/gamedata/shaders/gl/model_distort4glass.vs +++ b/res/gamedata/shaders/gl/model_distort4glass.vs @@ -2,18 +2,18 @@ #include "skin.h" #include "iostructs\v_model_distort.h" -vf _main (v_model v) +vf _main (v_model v) { - vf o; + vf o; - o.hpos = mul (m_WVP, v.P); // xform, input in world coords - o.tc0 = v.tc.xy; // copy tc + o.hpos = mul (m_WVP, v.P); // xform, input in world coords + o.tc0 = v.tc.xy; // copy tc - // calculate fade - float3 dir_v = normalize (mul(m_WV,v.P)); - float3 norm_v = normalize (mul(m_WV,v.N)); - float fade = 0.9*abs (dot(dir_v,norm_v)); - o.c0 = float4(fade); + // calculate fade + float3 dir_v = normalize (mul(m_WV,v.P)); + float3 norm_v = normalize (mul(m_WV,v.N)); + float fade = 0.9f*abs (dot(dir_v,norm_v)); + o.c0 = float4 (fade); - return o; + return o; } diff --git a/res/gamedata/shaders/gl/shared/common.h b/res/gamedata/shaders/gl/shared/common.h index 22bb089ed2b..465aa88f628 100644 --- a/res/gamedata/shaders/gl/shared/common.h +++ b/res/gamedata/shaders/gl/shared/common.h @@ -58,10 +58,14 @@ void sincos(float x, out float s, out float c) { s = sin(x); c = cos(x); } #define COLOR2 2 #define POSITION 3 #define POSITIONT 3 +#define POSITION0 3 +#define POSITION1 4 #define TANGENT 4 #define NORMAL 5 +#define NORMAL0 5 +#define NORMAL1 6 #define BINORMAL 6 -#define FOG 7 +#define FOG 7 #define TEXCOORD0 8 #define TEXCOORD1 9 #define TEXCOORD2 10 diff --git a/res/gamedata/shaders/gl/vert.ps b/res/gamedata/shaders/gl/vert.ps new file mode 100644 index 0000000000000000000000000000000000000000..d96a45cc6890113b8ac420f871f9c6f5cdbb762d GIT binary patch literal 369 zcmcJJ!3x4K42I9mQv|(Ckxr&J@g~A<9y|)8)~*)1W^|oQ#do)x(>E}OK=OZo{!ERN zw!J8vNUADw{5pZ@Z)d0pzLlXl)x}Nu(5sOCt>S4sm`+(JEs3zkq7ud>c*|h{R?$ literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/vert.vs b/res/gamedata/shaders/gl/vert.vs new file mode 100644 index 00000000000..cb6f9947846 --- /dev/null +++ b/res/gamedata/shaders/gl/vert.vs @@ -0,0 +1,21 @@ +#include "common.h" +#include "iostructs\v_vert.h" + +v2p _main (v_static_color v) +{ + v2p o; + + float3 N = unpack_normal (v.Nh.xyz); + o.hpos = mul (m_VP, v.P); // xform, input in world coords + o.Tex0 = unpack_tc_base (v.tc,v.T.w,v.B.w); // copy tc + + float3 L_rgb = v.color.bgr; // precalculated RGB lighting + float3 L_hemi = v_hemi(N)*v.Nh.w; // hemisphere + float3 L_sun = v_sun(N)*v.color.w; // sun + float3 L_final = L_rgb + L_hemi + L_sun + L_ambient.rgb; + + o.c0 = L_final; + o.fog = saturate(calc_fogging (v.P)); // fog, input in world coords + + return o; +} diff --git a/res/gamedata/shaders/gl/water.ps b/res/gamedata/shaders/gl/water.ps new file mode 100644 index 0000000000000000000000000000000000000000..561c12aacd87121f99c9dadf56e878b8cdc6a602 GIT binary patch literal 2719 zcmb_eTW_046n-B6ilauVu$N4*ov2z_erOweWvNZ9)={NuB{ar^!!9rgu;ZlK|GwwU z1+e2jbhSJTaPHR+E|NS-cN+pE9=eNRBjY5O8}H%kEc|*uUxnY^uV!ER z@b+!Px|_{zyS!eUDp8M_jw?*^TIN+!KTmoWGT$UIySi#rf5mF=>VLk_AS{!EOm(K1 zDE#r^VLqRI3GbJy#plKM_p8PIoyq1J!b~K&2m4V03mptg4cBKPpsIO?h$>Gl=hbNME zV!uV%Jb>RIAHpRJd5n!Vk&W5i6Ed@13Z7}>^*sFB^KP0yMm>RQyJAT1^eV#A#|lJvb|;SXB28*1|uHZ9DpwDXDt4f zXaA?@j3(a{>EpwP8C9Jqeq*f9%k8?YC^BtLJK|Ue=liud8c$_efT!(}z7L;5 zk*yP%*W9FmR5q9b-YD{>?kp~4mCF=OR08)G*BQKxsy*k;cSUQe#tQW$OH{zSXVv}R zTeis5PS-x*!j+s}nKxA)!BSPL2$fnUF6LF|4VTn- zJr6BxyWYjIEW?ec1#H(FwB<;Mp&L#2j2qv94dE!E&95i}25r#Sp^(kiK$1tk`O??7 ztWHVXR0TAM-^!wX#Mr_mf4MwPuZPoQkRD>Sbz1ls%0pqn9~*di%>$fxYZTcuItV_O zDCHeX4_cQ^7-N`60HkAp$-{{l#yGmo*@uCNwf*4mk{r^Uq9&@E{hUXL-bD04PZ#>Y z`P7fvL53)=-~479y-q|FQde3W5G>WUYYYqWNq<6Zy4TEnQ7MK7^bJYRmBW22M$17k zaq{`3Y^*^Ri8Kl$RiVL40t#Cc!fO6v(AwU|`~?xaL12fh{id?U)`l94)*SwHG9EZ* ztx9atn~SJc1VUA&RQ*`hvhV^PjBcne0iIe@o7Po3R>KUB^bjvm>)jc(Bc!pdbLBI4 zE(S-&+a|fbyOuh6AE$x-a?WVBzbWhlDrnYWuC`nHv^Yq^{AsZC5JxIirG`E?VhfJL zLE#uAW7Jqp8|af-T1v$H9NaI3cRHMU+iA;AF;cJIe+$QXb}uK(%% E3y>x^@&Et; literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/water.vs b/res/gamedata/shaders/gl/water.vs new file mode 100644 index 00000000000..c7eef1bed99 --- /dev/null +++ b/res/gamedata/shaders/gl/water.vs @@ -0,0 +1,67 @@ +#include "common.h" +#include "shared\waterconfig.h" +#include "shared\watermove.h" +#include "iostructs\v_water.h" + +uniform float4x4 m_texgen; + +v2p _main (v_vert v) +{ + //v.N = unpack_D3DCOLOR(v.N); + //v.T = unpack_D3DCOLOR(v.T); + //v.B = unpack_D3DCOLOR(v.B); + //v.color = unpack_D3DCOLOR(v.color); + + v2p o; + + float4 P = v.P; // world + float3 NN = unpack_normal(v.N); + P = watermove(P); + + o.v2point = P.xyz-eye_position; + o.tbase = unpack_tc_base (v.uv,v.T.w,v.B.w); // copy tc + o.tnorm0 = watermove_tc (o.tbase*W_DISTORT_BASE_TILE_0, P.xz, W_DISTORT_AMP_0); + o.tnorm1 = watermove_tc (o.tbase*W_DISTORT_BASE_TILE_1, P.xz, W_DISTORT_AMP_1); + + // Calculate the 3x3 transform from tangent space to eye-space + // TangentToEyeSpace = object2eye * tangent2object + // = object2eye * transpose(object2tangent) (since the inverse of a rotation is its transpose) + float3 N = unpack_bx4(v.N); // just scale (assume normal in the -.5f, .5f) + float3 T = unpack_bx4(v.T); // + float3 B = unpack_bx4(v.B); // + float3x3 xform = mul (float3x3(m_W), float3x3( + T.x,B.x,N.x, + T.y,B.y,N.y, + T.z,B.z,N.z + )); + // The pixel shader operates on the bump-map in [0..1] range + // Remap this range in the matrix, anyway we are pixel-shader limited :) + // ...... [ 2 0 0 0] + // ...... [ 0 2 0 0] + // ...... [ 0 0 2 0] + // ...... [-1 -1 -1 1] + // issue: strange, but it's slower :( + // issue: interpolators? dp4? VS limited? black magic? + + // Feed this transform to pixel shader + o.M1 = xform[0]; + o.M2 = xform[1]; + o.M3 = xform[2]; + + float3 L_rgb = v.color.rgb; // precalculated RGB lighting + float3 L_hemi = v_hemi(N)*v.N.w; // hemisphere + float3 L_sun = v_sun(N)*v.color.w; // sun + float3 L_final = L_rgb + L_hemi + L_sun + L_ambient.rgb; + + o.hpos = mul (m_VP, P); // xform, input in world coords + o.fog = saturate (calc_fogging(v.P)); + o.c0 = float4 (L_final, 1.f); + +#if defined(USE_SOFT_WATER) && defined(NEED_SOFT_WATER) + o.tctexgen = mul (m_texgen, P); + float3 Pe = mul (m_V, P).xyz; + o.tctexgen.z = Pe.z; +#endif // defined(USE_SOFT_WATER) && defined(NEED_SOFT_WATER) + + return o; +} \ No newline at end of file diff --git a/res/gamedata/shaders/gl/water_soft.ps b/res/gamedata/shaders/gl/water_soft.ps new file mode 100644 index 0000000000000000000000000000000000000000..3ae7e813ba507251f97d565bcc6d957330e7649f GIT binary patch literal 80 zcmdPbS58Sy%gjsV^mBD}i4XR73yBYR3~>!o(AQTe&aTYKPfSTIvQj8X%`M0;N-WCE jsZ>bGEKW?yNloEW&df{BDNRXLP%2L>NiEVVC{_Xh9w-|Q literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/water_soft.vs b/res/gamedata/shaders/gl/water_soft.vs new file mode 100644 index 00000000000..925157ec739 --- /dev/null +++ b/res/gamedata/shaders/gl/water_soft.vs @@ -0,0 +1,2 @@ +//#define NEED_SOFT_WATER // skyloader: temporarily disabled +#include "water.vs" \ No newline at end of file diff --git a/res/gamedata/shaders/gl/waterd.ps b/res/gamedata/shaders/gl/waterd.ps new file mode 100644 index 0000000000000000000000000000000000000000..e20b116f39cb01c441cc891693c1b7a8a63de4c9 GIT binary patch literal 1388 zcmcIkO>5gg5It*u#SlY~9YwZ90tJ&pik0F+V__=|T>9TTyZW%z zmeL%mgY2DoGqZ2zjRt8EXM4usA{Kcr3U_xw2AxgrXvNvfH>!9Qiy}$4eSa#Xs`jyx zFJ)vvO#4a54{Bd=Z*IwmrBaDX&B%c9BrP}u%V&ROP2AgrjQ`t%sUb)YJR?aasJekD zr)gost5?DThU7c3YKNtw4VB!w1H}*C+?M9(z`|A9KAe#T=^>I$&TtJe1J(a0L-+7D zJ4a9df}Zx#O)?Cyb(t%CO@||F(hUCiAU*oZE4t-f!6UB(#v59m4H)a_7a)b2t7j#Y zafXmuiP)qQE^~_dC;@3qmBtHO1YwZ%3z4Q&$TG8l?c(P)o$<$AR!o(AQTe&aTYKPfSTIvQj8X%`M0;N-WCE ksZ>bGEKW?yNloEW&df{BDNRXLP%2L>Ni9mzD=1b106F&?asU7T literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/waterd_soft.vs b/res/gamedata/shaders/gl/waterd_soft.vs new file mode 100644 index 00000000000..4371ee34157 --- /dev/null +++ b/res/gamedata/shaders/gl/waterd_soft.vs @@ -0,0 +1,2 @@ +//#define NEED_SOFT_WATER // skyloader: temporarily disabled +#include "waterd.vs" \ No newline at end of file