فهرست منبع

Some more GLES2 tuning..

Juan Linietsky 7 سال پیش
والد
کامیت
ce8294986d

+ 1 - 0
drivers/gles2/rasterizer_scene_gles2.cpp

@@ -2227,6 +2227,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
 				if (p_env) {
 					state.scene_shader.set_uniform(SceneShaderGLES2::BG_ENERGY, p_env->bg_energy);
 					state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_SKY_CONTRIBUTION, p_env->ambient_sky_contribution);
+
 					state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_COLOR, p_env->ambient_color);
 					state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_ENERGY, p_env->ambient_energy);
 

+ 5 - 5
drivers/gles2/rasterizer_storage_gles2.cpp

@@ -948,6 +948,7 @@ void RasterizerStorageGLES2::sky_set_texture(RID p_sky, RID p_panorama, int p_ra
 			shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES2::FACE_ID, i);
 
 			float roughness = mm_level ? lod / (float)(mipmaps - 1) : 1;
+			roughness = MIN(1.0, roughness); //keep max at 1
 			shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES2::ROUGHNESS, roughness);
 
 			glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
@@ -4492,13 +4493,13 @@ void RasterizerStorageGLES2::initialize() {
 
 	// radical inverse vdc cache texture
 	// used for cubemap filtering
-	if (config.float_texture_supported) {
+	if (true /*||config.float_texture_supported*/) { //uint8 is similar and works everywhere
 		glGenTextures(1, &resources.radical_inverse_vdc_cache_tex);
 
 		glActiveTexture(GL_TEXTURE0);
 		glBindTexture(GL_TEXTURE_2D, resources.radical_inverse_vdc_cache_tex);
 
-		float radical_inverse[512];
+		uint8_t radical_inverse[512];
 
 		for (uint32_t i = 0; i < 512; i++) {
 			uint32_t bits = i;
@@ -4510,11 +4511,10 @@ void RasterizerStorageGLES2::initialize() {
 			bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8);
 
 			float value = float(bits) * 2.3283064365386963e-10;
-
-			radical_inverse[i] = value;
+			radical_inverse[i] = uint8_t(CLAMP(value * 255.0, 0, 255));
 		}
 
-		glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 1, 0, GL_LUMINANCE, GL_FLOAT, radical_inverse);
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, radical_inverse);
 
 		glBindTexture(GL_TEXTURE_2D, 0);
 	}

+ 10 - 3
drivers/gles2/shaders/cubemap_filter.glsl

@@ -167,17 +167,21 @@ void main() {
 
 		vec3 H = ImportanceSampleGGX(xi, roughness, N);
 		vec3 V = N;
-		vec3 L = normalize(2.0 * dot(V, H) * H - V);
+		vec3 L = (2.0 * dot(V, H) * H - V);
 
 		float NdotL = clamp(dot(N, L), 0.0, 1.0);
 
 		if (NdotL > 0.0) {
 
 #ifdef USE_SOURCE_PANORAMA
-			sum.rgb += texturePanorama(source_panorama, L).rgb * NdotL;
+			vec3 val = texturePanorama(source_panorama, L).rgb;
 #else
-			sum.rgb += textureCubeLod(source_cube, L, 0.0).rgb * NdotL;
+			vec3 val = textureCubeLod(source_cube, L,0.0).rgb;
 #endif
+			//mix using Linear, to approximate high end back-end
+			val = mix(pow((val + vec3(0.055)) * (1.0 / (1.0 + 0.055)), vec3(2.4)), val * (1.0 / 12.92), vec3(lessThan(val, vec3(0.04045))));
+
+			sum.rgb += val * NdotL;
 
 			sum.a += NdotL;
 		}
@@ -185,5 +189,8 @@ void main() {
 
 	sum /= sum.a;
 
+	vec3 a = vec3(0.055);
+	sum.rgb = mix((vec3(1.0) + a) * pow(sum.rgb, vec3(1.0 / 2.4)) - a, 12.92 * sum.rgb, vec3(lessThan(sum.rgb, vec3(0.0031308))));
+
 	gl_FragColor = vec4(sum.rgb, 1.0);
 }

+ 14 - 2
drivers/gles2/shaders/scene.glsl

@@ -1757,8 +1757,14 @@ FRAGMENT_SHADER_CODE
 
 	// environment BRDF approximation
 
-	// TODO shadeless
+
 	{
+
+#if defined(DIFFUSE_TOON)
+		//simplify for toon, as
+		specular_light *= specular * metallic * albedo * 2.0;
+#else
+		//TODO: this curve is not really designed for gammaspace, should be adjusted
 		const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
 		const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
 		vec4 r = roughness * c0 + c1;
@@ -1767,10 +1773,16 @@ FRAGMENT_SHADER_CODE
 		vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;
 
 		vec3 specular_color = metallic_to_specular_color(metallic, specular, albedo);
-		specular_light *= AB.x * specular_color + AB.y;
+		specular_light *= AB.x * specular_color + AB.y;				
+#endif
 	}
 
 	gl_FragColor = vec4(ambient_light + diffuse_light + specular_light, alpha);
+
+	//add emission if in base pass
+#ifdef BASE_PASS
+	gl_FragColor.rgb += emission;
+#endif
 	// gl_FragColor = vec4(normal, 1.0);
 
 #endif //unshaded