X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=shaders%2Fscene_standard_alphatest.h;h=8e7b1b016d0e3fe10b60ccde6bc24c8aebd70c59;hb=409edea2cf6271956137918e4e0b4f1c2addf620;hp=ed4417ba6350cb4cc63e653b79370e80e18802d3;hpb=343d594b37f42a94f220a5089c9db36da9da3ab4;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/shaders/scene_standard_alphatest.h b/shaders/scene_standard_alphatest.h index ed4417b..8e7b1b0 100644 --- a/shaders/scene_standard_alphatest.h +++ b/shaders/scene_standard_alphatest.h @@ -36,12 +36,14 @@ static struct vg_shader _shader_scene_standard_alphatest = { "uniform mat4x3 uMdl;\n" "uniform mat4 uPv;\n" "uniform mat4 uPvmPrev;\n" +"uniform samplerBuffer uLightsArray;\n" "\n" "out vec2 aUv;\n" "out vec4 aNorm;\n" "out vec3 aCo;\n" "out vec3 aWorldCo;\n" -"flat out ivec4 aLights;\n" +"flat out vec4 light_colours[3];\n" +"flat out vec4 light_positions[3];\n" "\n" "void main()\n" "{\n" @@ -57,7 +59,14 @@ static struct vg_shader _shader_scene_standard_alphatest = { " aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n" " aCo = a_co;\n" " aWorldCo = world_pos0;\n" -" aLights = a_lights;\n" +"\n" +" // read lights\n" +" light_colours[0] = texelFetch( uLightsArray, a_lights.x*2+0 );\n" +" light_colours[1] = texelFetch( uLightsArray, a_lights.y*2+0 );\n" +" light_colours[2] = texelFetch( uLightsArray, a_lights.z*2+0 );\n" +" light_positions[0] = texelFetch( uLightsArray, a_lights.x*2+1 );\n" +" light_positions[1] = texelFetch( uLightsArray, a_lights.y*2+1 );\n" +" light_positions[2] = texelFetch( uLightsArray, a_lights.z*2+1 );\n" "}\n" ""}, .fs = @@ -70,14 +79,15 @@ static struct vg_shader _shader_scene_standard_alphatest = { "uniform vec3 uCamera;\n" "uniform vec4 uPlane;\n" "\n" +"#line 1 1 \n" +"// :D\n" +"\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" "in vec3 aCo;\n" "in vec3 aWorldCo;\n" -"flat in ivec4 aLights;\n" -"\n" -"#line 1 1 \n" -"// :D\n" +"flat in vec4 light_colours[3];\n" +"flat in vec4 light_positions[3];\n" "\n" "#line 1 1 \n" "layout (location = 0) out vec4 oColour;\n" @@ -95,8 +105,10 @@ static struct vg_shader _shader_scene_standard_alphatest = { " int g_light_preview;\n" " int g_shadow_samples;\n" "\n" -" vec4 g_point_light_positions[32];\n" -" vec4 g_point_light_colours[32];\n" +" // g_time ?\n" +"\n" +" //vec4 g_point_light_positions[32];\n" +" //vec4 g_point_light_colours[32];\n" "};\n" "\n" "uniform sampler2D g_world_depth;\n" @@ -123,15 +135,6 @@ static struct vg_shader _shader_scene_standard_alphatest = { " return clamp( fdelta, 0.1, 0.2 )-0.1;\n" "}\n" "\n" -"float sdLine( vec3 p, vec3 a, vec3 b )\n" -"{\n" -" vec3 pa = p - a;\n" -" vec3 ba = b - a;\n" -"\n" -" float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n" -" return length( pa - ba*h );\n" -"}\n" -"\n" "vec3 apply_fog( vec3 vfrag, float fdist )\n" "{\n" " float dist = pow(fdist*0.0008,1.2);\n" @@ -167,12 +170,7 @@ static struct vg_shader _shader_scene_standard_alphatest = { " famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" " famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" -" // player shadow\n" -" float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.1 );\n" -" float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n" -" player_shadow *= player_shadow*player_shadow*player_shadow;\n" -"\n" -" return 1.0 - max( player_shadow*0.8, famt );\n" +" return 1.0 - famt;\n" "}\n" "\n" "vec3 newlight_compute_world_diffuse( vec3 wnormal )\n" @@ -213,7 +211,26 @@ static struct vg_shader _shader_scene_standard_alphatest = { " return light_colour*attenuation;\n" "}\n" "\n" -"#line 4 0 \n" +"#line 11 0 \n" +"\n" +"float sdLine( vec3 p, vec3 a, vec3 b )\n" +"{\n" +" vec3 pa = p - a;\n" +" vec3 ba = b - a;\n" +"\n" +" float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n" +" return length( pa - ba*h );\n" +"}\n" +"\n" +"float compute_board_shadow()\n" +"{\n" +" // player shadow\n" +" float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.1 );\n" +" float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n" +" player_shadow *= player_shadow*player_shadow*player_shadow;\n" +"\n" +" return 1.0 - player_shadow*0.8;\n" +"}\n" "\n" "vec3 scene_do_lighting( vec3 diffuse, vec3 wnormal )\n" "{\n" @@ -231,34 +248,36 @@ static struct vg_shader _shader_scene_standard_alphatest = { " world_light += newlight_compute_sun_spec( wnormal, halfview, 0.1 );\n" "\n" " float world_shadow = newlight_compute_sun_shadow();\n" +" float board_shadow = compute_board_shadow();\n" "\n" -" total_light += world_light * world_shadow;\n" +" total_light += world_light * min( board_shadow, world_shadow );\n" "\n" " // Compute the other lights that exist in the map, not effected by the sun\n" " // shadow\n" +"\n" " total_light += newlight_compute_quadratic\n" " ( \n" " wnormal, halfview,\n" -" g_point_light_positions[ aLights.x ].xyz,\n" -" g_point_light_colours[ aLights.x ].rgb \n" -" );\n" +" light_positions[0].xyz,\n" +" light_colours[0].rgb \n" +" ) * board_shadow;\n" " total_light += newlight_compute_quadratic\n" " ( \n" " wnormal, halfview,\n" -" g_point_light_positions[ aLights.y ].xyz,\n" -" g_point_light_colours[ aLights.y ].rgb \n" -" );\n" +" light_positions[1].xyz,\n" +" light_colours[1].rgb \n" +" ) * board_shadow;\n" " total_light += newlight_compute_quadratic\n" " ( \n" " wnormal, halfview,\n" -" g_point_light_positions[ aLights.z ].xyz,\n" -" g_point_light_colours[ aLights.z ].rgb \n" -" );\n" +" light_positions[2].xyz,\n" +" light_colours[2].rgb \n" +" ) * board_shadow;\n" "\n" " return apply_fog( diffuse * total_light, fdist );\n" "}\n" "\n" -"#line 15 0 \n" +"#line 9 0 \n" "#line 1 2 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" @@ -278,7 +297,7 @@ static struct vg_shader _shader_scene_standard_alphatest = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 16 0 \n" +"#line 10 0 \n" "\n" "void main()\n" "{\n" @@ -307,6 +326,7 @@ static struct vg_shader _shader_scene_standard_alphatest = { static GLuint _uniform_scene_standard_alphatest_uMdl; static GLuint _uniform_scene_standard_alphatest_uPv; static GLuint _uniform_scene_standard_alphatest_uPvmPrev; +static GLuint _uniform_scene_standard_alphatest_uLightsArray; static GLuint _uniform_scene_standard_alphatest_uTexGarbage; static GLuint _uniform_scene_standard_alphatest_uTexMain; static GLuint _uniform_scene_standard_alphatest_uBoard0; @@ -352,6 +372,7 @@ static void shader_scene_standard_alphatest_link(void){ _uniform_scene_standard_alphatest_uMdl = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uMdl" ); _uniform_scene_standard_alphatest_uPv = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uPv" ); _uniform_scene_standard_alphatest_uPvmPrev = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uPvmPrev" ); + _uniform_scene_standard_alphatest_uLightsArray = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uLightsArray" ); _uniform_scene_standard_alphatest_uTexGarbage = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uTexGarbage" ); _uniform_scene_standard_alphatest_uTexMain = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uTexMain" ); _uniform_scene_standard_alphatest_uBoard0 = glGetUniformLocation( _shader_scene_standard_alphatest.id, "uBoard0" );