Some more GLES2 tuning..

This commit is contained in:
Juan Linietsky 2018-09-29 23:47:24 -03:00
parent 3333166b07
commit ce8294986d
4 changed files with 30 additions and 10 deletions

View File

@ -2227,6 +2227,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
if (p_env) { if (p_env) {
state.scene_shader.set_uniform(SceneShaderGLES2::BG_ENERGY, p_env->bg_energy); 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_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_COLOR, p_env->ambient_color);
state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_ENERGY, p_env->ambient_energy); state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_ENERGY, p_env->ambient_energy);

View File

@ -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); shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES2::FACE_ID, i);
float roughness = mm_level ? lod / (float)(mipmaps - 1) : 1; 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); shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES2::ROUGHNESS, roughness);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
@ -4492,13 +4493,13 @@ void RasterizerStorageGLES2::initialize() {
// radical inverse vdc cache texture // radical inverse vdc cache texture
// used for cubemap filtering // 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); glGenTextures(1, &resources.radical_inverse_vdc_cache_tex);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, resources.radical_inverse_vdc_cache_tex); 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++) { for (uint32_t i = 0; i < 512; i++) {
uint32_t bits = i; uint32_t bits = i;
@ -4510,11 +4511,10 @@ void RasterizerStorageGLES2::initialize() {
bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8);
float value = float(bits) * 2.3283064365386963e-10; float value = float(bits) * 2.3283064365386963e-10;
radical_inverse[i] = uint8_t(CLAMP(value * 255.0, 0, 255));
radical_inverse[i] = value;
} }
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); glBindTexture(GL_TEXTURE_2D, 0);
} }

View File

@ -167,17 +167,21 @@ void main() {
vec3 H = ImportanceSampleGGX(xi, roughness, N); vec3 H = ImportanceSampleGGX(xi, roughness, N);
vec3 V = 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); float NdotL = clamp(dot(N, L), 0.0, 1.0);
if (NdotL > 0.0) { if (NdotL > 0.0) {
#ifdef USE_SOURCE_PANORAMA #ifdef USE_SOURCE_PANORAMA
sum.rgb += texturePanorama(source_panorama, L).rgb * NdotL; vec3 val = texturePanorama(source_panorama, L).rgb;
#else #else
sum.rgb += textureCubeLod(source_cube, L, 0.0).rgb * NdotL; vec3 val = textureCubeLod(source_cube, L,0.0).rgb;
#endif #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; sum.a += NdotL;
} }
@ -185,5 +189,8 @@ void main() {
sum /= sum.a; 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); gl_FragColor = vec4(sum.rgb, 1.0);
} }

View File

@ -1757,8 +1757,14 @@ FRAGMENT_SHADER_CODE
// environment BRDF approximation // 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 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04); const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
vec4 r = roughness * c0 + c1; vec4 r = roughness * c0 + c1;
@ -1767,10 +1773,16 @@ FRAGMENT_SHADER_CODE
vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw; vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;
vec3 specular_color = metallic_to_specular_color(metallic, specular, albedo); 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); 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); // gl_FragColor = vec4(normal, 1.0);
#endif //unshaded #endif //unshaded