From b506f1cd2d901617d4675d8f732d3d6e5b2e9932 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 6 Mar 2016 18:22:01 +0100 Subject: [PATCH] shaders: Add GLSL port of skybox shaders. --- res/gamedata/shaders/gl/clouds.ps | Bin 0 -> 487 bytes res/gamedata/shaders/gl/clouds.vs | 31 +++++++++++++ res/gamedata/shaders/gl/common_samplers.h | 2 +- res/gamedata/shaders/gl/iostructs/p_clouds.h | 25 +++++++++++ res/gamedata/shaders/gl/iostructs/p_sky.h | 34 ++++++++++++++ res/gamedata/shaders/gl/iostructs/v_clouds.h | 42 +++++++++++++++++ res/gamedata/shaders/gl/iostructs/v_sky.h | 45 +++++++++++++++++++ res/gamedata/shaders/gl/shared/common.h | 2 + res/gamedata/shaders/gl/sky2.ps | Bin 0 -> 530 bytes res/gamedata/shaders/gl/sky2.vs | 21 +++++++++ src/Layers/xrRenderPC_GL/rgl.cpp | 2 + 11 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 res/gamedata/shaders/gl/clouds.ps create mode 100644 res/gamedata/shaders/gl/clouds.vs create mode 100644 res/gamedata/shaders/gl/iostructs/p_clouds.h create mode 100644 res/gamedata/shaders/gl/iostructs/p_sky.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_clouds.h create mode 100644 res/gamedata/shaders/gl/iostructs/v_sky.h create mode 100644 res/gamedata/shaders/gl/sky2.ps create mode 100644 res/gamedata/shaders/gl/sky2.vs diff --git a/res/gamedata/shaders/gl/clouds.ps b/res/gamedata/shaders/gl/clouds.ps new file mode 100644 index 0000000000000000000000000000000000000000..bc1dd4c9f1e7a158709ca900faf4a268c46a75b2 GIT binary patch literal 487 zcmcJLJ8Q!*6ou!jUvWtmI}NgBvYBpKymjbU2(F?u0zHf##ZdC!bKTa)(9*4fyPWgs z+{acsY4Ta&MtW<#KG!AdCQy|eW=~V?m(d``K W*Jw}>!KwCh6z``tGeu6zZtM;}i--CE literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/clouds.vs b/res/gamedata/shaders/gl/clouds.vs new file mode 100644 index 00000000000..095122f5e67 --- /dev/null +++ b/res/gamedata/shaders/gl/clouds.vs @@ -0,0 +1,31 @@ +#include "common.h" +#include "shared\cloudconfig.h" +#include "iostructs\v_clouds.h" + +vf _main (vi v) +{ + vf o; + + o.hpos = mul (m_WVP, v.p); // xform, input in world coords + +// if (length(float3(v.p.x,0,v.p.z))>CLOUD_FADE) o.color.w = 0 ; + + // generate tcs + float2 d0 = v.dir.xy*2-1; + float2 d1 = v.dir.wz*2-1; + float2 _0 = v.p.xz * CLOUD_TILE0 + d0*timers.z*CLOUD_SPEED0; + float2 _1 = v.p.xz * CLOUD_TILE1 + d1*timers.z*CLOUD_SPEED1; + o.tc0 = _0; // copy tc + o.tc1 = _1; // copy tc + + o.color = v.color ; // copy color, low precision, cannot prescale even by 2 + o.color.w *= pow (v.p.y,25); + +// float scale = tex2Dlod (s_tonemap,float4(.5,.5,.5,.5)).x ; +// float scale = s_tonemap.Load( int3(0,0,0) ).x; +// float scale = s_tonemap.Load( int3(1,1,0) ).x; + float scale = texelFetch( s_tonemap, int2(0,0), 0 ).x; + o.color.rgb *= scale ; // high precision + + return o; +} diff --git a/res/gamedata/shaders/gl/common_samplers.h b/res/gamedata/shaders/gl/common_samplers.h index 8d470e6dea7..5efd9259673 100644 --- a/res/gamedata/shaders/gl/common_samplers.h +++ b/res/gamedata/shaders/gl/common_samplers.h @@ -4,7 +4,7 @@ #define Texture2D uniform sampler2D #define Texture3D uniform sampler3D #define Texture2DMS uniform sampler2DMS -#define TextureCube uniform samplerCube​ +#define TextureCube uniform samplerCube #define Texture2DShadow uniform sampler2DShadow ////////////////////////////////////////////////////////////////////////////////////////// diff --git a/res/gamedata/shaders/gl/iostructs/p_clouds.h b/res/gamedata/shaders/gl/iostructs/p_clouds.h new file mode 100644 index 00000000000..f1d8346225d --- /dev/null +++ b/res/gamedata/shaders/gl/iostructs/p_clouds.h @@ -0,0 +1,25 @@ + +out vec4 SV_Target; + +struct v2p +{ + float4 color ; // COLOR0; // rgb. intensity, for SM3 - tonemap prescaled + float2 tc0 ; // TEXCOORD0; + float2 tc1 ; // TEXCOORD1; +}; + +layout(location = COLOR0) in float4 p_clouds_color ; // COLOR0; // rgb. intensity, for SM3 - tonemap prescaled +layout(location = TEXCOORD0) in float2 p_clouds_tc0 ; // TEXCOORD0; +layout(location = TEXCOORD1) in float2 p_clouds_tc1 ; // TEXCOORD1; + +float4 _main ( v2p I ); + +void main() +{ + v2p I; + I.color = p_clouds_color; + I.tc0 = p_clouds_tc0; + I.tc1 = p_clouds_tc1; + + SV_Target = _main ( I ); +} diff --git a/res/gamedata/shaders/gl/iostructs/p_sky.h b/res/gamedata/shaders/gl/iostructs/p_sky.h new file mode 100644 index 00000000000..bf2f154a0f6 --- /dev/null +++ b/res/gamedata/shaders/gl/iostructs/p_sky.h @@ -0,0 +1,34 @@ + +out vec4 SV_Target0; +out vec4 SV_Target1; + +struct v2p +{ + float4 factor ; // COLOR0; // for SM3 - factor.rgb - tonemap-prescaled + float3 tc0 ; // TEXCOORD0; + float3 tc1 ; // TEXCOORD1; +}; +struct _out +{ + float4 low ; // SV_Target0; + float4 high ; // SV_Target1; +}; + +layout(location = COLOR0) in float4 p_sky_factor; // COLOR0; // for SM3 - factor.rgb - tonemap-prescaled +layout(location = TEXCOORD0) in float3 p_sky_tc0 ; // TEXCOORD0; +layout(location = TEXCOORD1) in float3 p_sky_tc1 ; // TEXCOORD1; + +_out _main( v2p I ); + +void main() +{ + v2p I; + I.factor = p_sky_factor; + I.tc0 = p_sky_tc0; + I.tc1 = p_sky_tc1; + + _out O = _main (I); + + SV_Target0 = O.low; + SV_Target1 = O.high; +} diff --git a/res/gamedata/shaders/gl/iostructs/v_clouds.h b/res/gamedata/shaders/gl/iostructs/v_clouds.h new file mode 100644 index 00000000000..9170158302a --- /dev/null +++ b/res/gamedata/shaders/gl/iostructs/v_clouds.h @@ -0,0 +1,42 @@ + +out gl_PerVertex { vec4 gl_Position; }; + +struct vi +{ + float4 p ; // POSITION; + float4 dir ; // COLOR0; // dir0,dir1(w<->z) + float4 color ; // COLOR1; // rgb. intensity +}; + +struct vf +{ + float4 color ; // COLOR0; // rgb. intensity, for SM3 - tonemap-prescaled, HI-res + float2 tc0 ; // TEXCOORD0; + float2 tc1 ; // TEXCOORD1; + float4 hpos ; // SV_Position; +}; + +layout(location = POSITION) in float4 v_clouds_p ; // POSITION; +layout(location = COLOR0) in float4 v_clouds_dir ; // COLOR0; // dir0,dir1(w<->z) +layout(location = COLOR1) in float4 v_clouds_color ; // COLOR1; // rgb. intensity + +layout(location = COLOR0) out float4 v2p_clouds_color ; // COLOR0; // rgb. intensity, for SM3 - tonemap-prescaled, HI-res +layout(location = TEXCOORD0) out float2 v2p_clouds_tc0 ; // TEXCOORD0; +layout(location = TEXCOORD1) out float2 v2p_clouds_tc1 ; // TEXCOORD1; + +vf _main (vi v); + +void main() +{ + vi I; + I.p = v_clouds_p; + I.dir = v_clouds_dir; + I.color = v_clouds_color; + + vf O = _main (I); + + v2p_clouds_color = O.color; + v2p_clouds_tc0 = O.tc0; + v2p_clouds_tc1 = O.tc1; + gl_Position = O.hpos; +} diff --git a/res/gamedata/shaders/gl/iostructs/v_sky.h b/res/gamedata/shaders/gl/iostructs/v_sky.h new file mode 100644 index 00000000000..d6910e08b2e --- /dev/null +++ b/res/gamedata/shaders/gl/iostructs/v_sky.h @@ -0,0 +1,45 @@ + +out gl_PerVertex { vec4 gl_Position; }; + +struct vi +{ + float4 p ; // POSITION; + float4 c ; // COLOR0; + float3 tc0 ; // TEXCOORD0; + float3 tc1 ; // TEXCOORD1; +}; + +struct v2p +{ + float4 c ; // COLOR0; + float3 tc0 ; // TEXCOORD0; + float3 tc1 ; // TEXCOORD1; + float4 hpos ; // SV_Position; +}; + +layout(location = POSITION) in float4 v_sky_p ; // POSITION; +layout(location = COLOR0) in float4 v_sky_c ; // COLOR0; +layout(location = TEXCOORD0) in float3 v_sky_tc0 ; // TEXCOORD0; +layout(location = TEXCOORD1) in float3 v_sky_tc1 ; // TEXCOORD1; + +layout(location = COLOR0) out float4 v2p_sky_c ; // COLOR0; +layout(location = TEXCOORD0) out float3 v2p_sky_tc0 ; // TEXCOORD0; +layout(location = TEXCOORD1) out float3 v2p_sky_tc1 ; // TEXCOORD1; + +v2p _main (vi v); + +void main() +{ + vi I; + I.p = v_sky_p; + I.c = v_sky_c; + I.tc0 = v_sky_tc0; + I.tc1 = v_sky_tc1; + + v2p O = _main (I); + + v2p_sky_c = O.c; + v2p_sky_tc0 = O.tc0; + v2p_sky_tc1 = O.tc1; + gl_Position = O.hpos; +} diff --git a/res/gamedata/shaders/gl/shared/common.h b/res/gamedata/shaders/gl/shared/common.h index 00bf7e045df..fc0f392cf51 100644 --- a/res/gamedata/shaders/gl/shared/common.h +++ b/res/gamedata/shaders/gl/shared/common.h @@ -23,6 +23,8 @@ #define float4x4 mat4 #define float3x4 mat4x3 +vec4 mul(int a, vec4 b) { return a * b; } +vec4 mul(float a, vec4 b) { return a * b; } vec3 mul(mat3 a, vec3 b) { return a * b; } vec3 mul(vec3 a, mat3 b) { return a * b; } mat3 mul(mat3 a, mat3 b) { return a * b; } diff --git a/res/gamedata/shaders/gl/sky2.ps b/res/gamedata/shaders/gl/sky2.ps new file mode 100644 index 0000000000000000000000000000000000000000..45f85ab630e53366befd42e3848b3b0c7c8354bb GIT binary patch literal 530 zcmcIhJ#T|B5S`Dz;*=~9Q3uM1SQ>R;>(FkM5CH>Ljg4&6kW~HeH6YSfZO7jD?tS>3 zw_KKDs2FZa)pbhJc0;yTj4NaHP+Ifc=jP=+Ey*Jr?V#CVI5IF38YVxnC?RD3Z{w`- zfsag(Tn!fUuHe$c*V`U5^vN56TByRtxDJ>Q5mK~lJUrdquduf~Kgg&pL!avAnEWD* z7WyCRXjVtx)!?oIE-#~XQCg+xc)sie)4hi#4A4Zu=jw#MONB+UOEIKzT)XRm>sWJH z2((JFo37}4E*k<b$MAqY%){{iVEe Hoa_4sK8}eg literal 0 HcmV?d00001 diff --git a/res/gamedata/shaders/gl/sky2.vs b/res/gamedata/shaders/gl/sky2.vs new file mode 100644 index 00000000000..5324d8e9875 --- /dev/null +++ b/res/gamedata/shaders/gl/sky2.vs @@ -0,0 +1,21 @@ +#include "common.h" +#include "iostructs\v_sky.h" + +v2p _main (vi v) +{ + v2p o; + + float4 tpos = mul (1000, v.p); + o.hpos = mul (m_WVP, tpos); // xform, input in world coords, 1000 - magic number + o.hpos.z = o.hpos.w; + o.tc0 = v.tc0; // copy tc + o.tc1 = v.tc1; // copy tc +// float scale = tex2Dlod (s_tonemap,float4(.5,.5,.5,.5)).x ; +// float scale = s_tonemap.Load( int3(0,0,0) ).x; +// float scale = s_tonemap.Load( int3(1,1,0) ).x; + float scale = texelFetch( s_tonemap, int2(0,0), 0 ).x; +// o.c = float4 ( v.c.rgb*(scale*1.7), v.c.a ); // copy color, pre-scale by tonemap //float4 ( v.c.rgb*scale*2, v.c.a ); + o.c = float4 ( v.c.rgb*(scale*2.0), v.c.a ); // copy color, pre-scale by tonemap //float4 ( v.c.rgb*scale*2, v.c.a ); + + return o; +} \ No newline at end of file diff --git a/src/Layers/xrRenderPC_GL/rgl.cpp b/src/Layers/xrRenderPC_GL/rgl.cpp index 750f460967b..1f9498087b2 100644 --- a/src/Layers/xrRenderPC_GL/rgl.cpp +++ b/src/Layers/xrRenderPC_GL/rgl.cpp @@ -919,6 +919,8 @@ HRESULT CRender::shader_compile( if ((GLboolean)status == GL_TRUE) { CHK_GL(glAttachShader(program, shader)); CHK_GL(glBindFragDataLocation(program, 0, "SV_Target")); + CHK_GL(glBindFragDataLocation(program, 0, "SV_Target0")); + CHK_GL(glBindFragDataLocation(program, 1, "SV_Target1")); CHK_GL(glLinkProgram(program)); CHK_GL(glDetachShader(program, shader)); CHK_GL(glGetProgramiv(program, GL_LINK_STATUS, &status));