소스 검색

Merge pull request #17391 from PJB3005/18-03-09-fix-canvas-light-shaders

Fixes canvas light shaders.
Rémi Verschelde 7 년 전
부모
커밋
9a4110a451
3개의 변경된 파일35개의 추가작업 그리고 29개의 파일을 삭제
  1. 0 3
      drivers/gles3/shader_compiler_gles3.cpp
  2. 34 25
      drivers/gles3/shaders/canvas.glsl
  3. 1 1
      servers/visual/shader_types.cpp

+ 0 - 3
drivers/gles3/shader_compiler_gles3.cpp

@@ -795,7 +795,6 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {
 	actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_HEIGHT"] = "light_height";
 	actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_COLOR"] = "light_color";
 	actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_UV"] = "light_uv";
-	//actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_SHADOW_COLOR"]="light_shadow_color";
 	actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT"] = "light";
 	actions[VS::SHADER_CANVAS_ITEM].renames["SHADOW_COLOR"] = "shadow_color";
 
@@ -805,9 +804,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {
 	actions[VS::SHADER_CANVAS_ITEM].usage_defines["SCREEN_PIXEL_SIZE"] = "@SCREEN_UV";
 	actions[VS::SHADER_CANVAS_ITEM].usage_defines["NORMAL"] = "#define NORMAL_USED\n";
 	actions[VS::SHADER_CANVAS_ITEM].usage_defines["NORMALMAP"] = "#define NORMALMAP_USED\n";
-	actions[VS::SHADER_CANVAS_ITEM].usage_defines["SHADOW_COLOR"] = "#define SHADOW_COLOR_USED\n";
 	actions[VS::SHADER_CANVAS_ITEM].usage_defines["LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
-
 	actions[VS::SHADER_CANVAS_ITEM].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
 
 	/** SPATIAL SHADER **/

+ 34 - 25
drivers/gles3/shaders/canvas.glsl

@@ -285,7 +285,19 @@ MATERIAL_UNIFORMS
 
 FRAGMENT_SHADER_GLOBALS
 
-void light_compute(inout vec4 light,vec2 light_vec,float light_height,vec4 light_color,vec2 light_uv,vec4 shadow,vec3 normal,vec2 uv,vec2 screen_uv,vec4 color) {
+void light_compute(
+	inout vec4 light,
+	inout vec2 light_vec,
+	inout float light_height,
+	inout vec4 light_color,
+	vec2 light_uv,
+	inout vec4 shadow_color,
+	vec3 normal,
+	vec2 uv,
+#if defined(SCREEN_UV_USED)
+	vec2 screen_uv,
+#endif
+	vec4 color) {
 
 #if defined(USE_LIGHT_SHADER_CODE)
 
@@ -462,39 +474,41 @@ FRAGMENT_SHADER_CODE
 	float att=1.0;
 
 	vec2 light_uv = light_uv_interp.xy;
-	vec4 light = texture(light_texture,light_uv) * light_color;
-#if defined(SHADOW_COLOR_USED)
-	vec4 shadow_color=vec4(0.0,0.0,0.0,0.0);
-#endif
+	vec4 light = texture(light_texture,light_uv);
 
 	if (any(lessThan(light_uv_interp.xy,vec2(0.0,0.0))) || any(greaterThanEqual(light_uv_interp.xy,vec2(1.0,1.0)))) {
 		color.a*=light_outside_alpha; //invisible
 
 	} else {
+		float real_light_height = light_height;
+		vec4 real_light_color = light_color;
+		vec4 real_light_shadow_color = light_shadow_color;
 
 #if defined(USE_LIGHT_SHADER_CODE)
 //light is written by the light shader
-		light_compute(light,light_vec,light_height,light_color,light_uv,shadow,normal,uv,screen_uv,color);
+		light_compute(
+			light,
+			light_vec,
+			real_light_height,
+			real_light_color,
+			light_uv,
+			real_light_shadow_color,
+			normal,
+			uv,
+#if defined(SCREEN_UV_USED)
+			screen_uv,
+#endif
+			color);
+#endif
 
-#else
+		light *= real_light_color;
 
 		if (normal_used) {
-
-			vec3 light_normal = normalize(vec3(light_vec,-light_height));
+			vec3 light_normal = normalize(vec3(light_vec,-real_light_height));
 			light*=max(dot(-light_normal,normal),0.0);
 		}
 
 		color*=light;
-/*
-#ifdef USE_NORMAL
-	color.xy=local_rot.xy;//normal.xy;
-	color.zw=vec2(0.0,1.0);
-#endif
-*/
-
-//light shader code
-#endif
-
 
 #ifdef USE_SHADOWS
 
@@ -634,13 +648,8 @@ FRAGMENT_SHADER_CODE
 
 #endif
 
-
-#if defined(SHADOW_COLOR_USED)
-	color=mix(shadow_color,color,shadow_attenuation);
-#else
 	//color*=shadow_attenuation;
-	color=mix(light_shadow_color,color,shadow_attenuation);
-#endif
+	color=mix(real_light_shadow_color,color,shadow_attenuation);
 //use shadows
 #endif
 	}

+ 1 - 1
servers/visual/shader_types.cpp

@@ -207,7 +207,7 @@ ShaderTypes::ShaderTypes() {
 	shader_modes[VS::SHADER_CANVAS_ITEM].functions["fragment"].built_ins["SCREEN_TEXTURE"] = constt(ShaderLanguage::TYPE_SAMPLER2D);
 	shader_modes[VS::SHADER_CANVAS_ITEM].functions["fragment"].can_discard = true;
 
-	shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["POSITION"] = constt(ShaderLanguage::TYPE_VEC2);
+	shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["FRAGCOORD"] = constt(ShaderLanguage::TYPE_VEC4);
 	shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["NORMAL"] = constt(ShaderLanguage::TYPE_VEC3);
 	shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["UV"] = constt(ShaderLanguage::TYPE_VEC2);
 	shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["COLOR"] = constt(ShaderLanguage::TYPE_VEC4);