Forráskód Böngészése

Fixed using compressed textures and add work around for firefox webgl mesa sampler limit

clayjohn 5 éve
szülő
commit
7b3d098b2b

+ 5 - 5
drivers/gles2/rasterizer_storage_gles2.cpp

@@ -638,7 +638,7 @@ void RasterizerStorageGLES2::texture_set_data(RID p_texture, const Ref<Image> &p
 
 	if (texture->resize_to_po2) {
 		if (p_image->is_compressed()) {
-			ERR_PRINTS("Texture '" + texture->path + "' was required to be a power of 2 (because it uses either mipmaps or repeat), so it was decompressed. This will hurt performance and memory usage.");
+			ERR_PRINTS("Texture '" + texture->path + "' is required to be a power of 2 because it uses either mipmaps or repeat, so it was decompressed. This will hurt performance and memory usage.");
 		}
 
 		if (img == p_image) {
@@ -659,7 +659,7 @@ void RasterizerStorageGLES2::texture_set_data(RID p_texture, const Ref<Image> &p
 
 			img->resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR);
 		}
-	};
+	}
 
 	GLenum blit_target = (texture->target == GL_TEXTURE_CUBE_MAP) ? _cube_side_enum[p_layer] : GL_TEXTURE_2D;
 
@@ -718,7 +718,7 @@ void RasterizerStorageGLES2::texture_set_data(RID p_texture, const Ref<Image> &p
 		int size, ofs;
 		img->get_mipmap_offset_and_size(i, ofs, size);
 
-		if (texture->compressed) {
+		if (compressed) {
 			glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
 
 			int bw = w;
@@ -5732,7 +5732,7 @@ void RasterizerStorageGLES2::initialize() {
 	config.float_texture_supported = config.extensions.has("GL_ARB_texture_float") || config.extensions.has("GL_OES_texture_float");
 	config.s3tc_supported = config.extensions.has("GL_EXT_texture_compression_s3tc") || config.extensions.has("WEBGL_compressed_texture_s3tc");
 	config.etc1_supported = config.extensions.has("GL_OES_compressed_ETC1_RGB8_texture") || config.extensions.has("WEBGL_compressed_texture_etc1");
-	config.pvrtc_supported = config.extensions.has("IMG_texture_compression_pvrtc");
+	config.pvrtc_supported = config.extensions.has("IMG_texture_compression_pvrtc") || config.extensions.has("WEBGL_compressed_texture_pvrtc");
 	config.support_npot_repeat_mipmap = config.extensions.has("GL_OES_texture_npot");
 
 #endif
@@ -5798,7 +5798,7 @@ void RasterizerStorageGLES2::initialize() {
 #endif
 
 	config.rgtc_supported = config.extensions.has("GL_EXT_texture_compression_rgtc") || config.extensions.has("GL_ARB_texture_compression_rgtc") || config.extensions.has("EXT_texture_compression_rgtc");
-	config.bptc_supported = config.extensions.has("GL_ARB_texture_compression_bptc");
+	config.bptc_supported = config.extensions.has("GL_ARB_texture_compression_bptc") || config.extensions.has("EXT_texture_compression_bptc");
 
 	//determine formats for depth textures (or renderbuffers)
 	if (config.support_depth_texture) {

+ 0 - 3
drivers/gles2/shaders/scene.glsl

@@ -729,9 +729,6 @@ uniform highp vec2 viewport_size;
 uniform vec2 screen_pixel_size;
 #endif
 
-// I think supporting this in GLES2 is difficult
-// uniform highp sampler2D depth_buffer;
-
 #if defined(SCREEN_TEXTURE_USED)
 uniform highp sampler2D screen_texture; //texunit:-4
 #endif

+ 45 - 23
scene/resources/material.cpp

@@ -476,7 +476,9 @@ void SpatialMaterial::_update_shader() {
 	code += ";\n";
 
 	code += "uniform vec4 albedo : hint_color;\n";
-	code += "uniform sampler2D texture_albedo : hint_albedo;\n";
+	if (textures[TEXTURE_ALBEDO] != NULL) {
+		code += "uniform sampler2D texture_albedo : hint_albedo;\n";
+	}
 	code += "uniform float specular;\n";
 	code += "uniform float metallic;\n";
 	if (grow_enabled) {
@@ -496,10 +498,16 @@ void SpatialMaterial::_update_shader() {
 	}
 	code += "uniform float roughness : hint_range(0,1);\n";
 	code += "uniform float point_size : hint_range(0,128);\n";
-	code += "uniform sampler2D texture_metallic : hint_white;\n";
-	code += "uniform vec4 metallic_texture_channel;\n";
-	code += "uniform sampler2D texture_roughness : hint_white;\n";
-	code += "uniform vec4 roughness_texture_channel;\n";
+
+	if (textures[TEXTURE_METALLIC] != NULL) {
+		code += "uniform sampler2D texture_metallic : hint_white;\n";
+		code += "uniform vec4 metallic_texture_channel;\n";
+	}
+
+	if (textures[TEXTURE_ROUGHNESS] != NULL) {
+		code += "uniform sampler2D texture_roughness : hint_white;\n";
+		code += "uniform vec4 roughness_texture_channel;\n";
+	}
 	if (billboard_mode == BILLBOARD_PARTICLES) {
 		code += "uniform int particles_anim_h_frames;\n";
 		code += "uniform int particles_anim_v_frames;\n";
@@ -773,37 +781,51 @@ void SpatialMaterial::_update_shader() {
 		code += "\t}\n";
 	}
 
-	if (flags[FLAG_USE_POINT_SIZE]) {
-		code += "\tvec4 albedo_tex = texture(texture_albedo,POINT_COORD);\n";
-	} else {
-		if (flags[FLAG_UV1_USE_TRIPLANAR]) {
-			code += "\tvec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);\n";
+	if (textures[TEXTURE_ALBEDO] != NULL) {
+		if (flags[FLAG_USE_POINT_SIZE]) {
+			code += "\tvec4 albedo_tex = texture(texture_albedo,POINT_COORD);\n";
 		} else {
-			code += "\tvec4 albedo_tex = texture(texture_albedo,base_uv);\n";
+			if (flags[FLAG_UV1_USE_TRIPLANAR]) {
+				code += "\tvec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);\n";
+			} else {
+				code += "\tvec4 albedo_tex = texture(texture_albedo,base_uv);\n";
+			}
 		}
-	}
 
-	if (flags[FLAG_ALBEDO_TEXTURE_FORCE_SRGB]) {
-		code += "\talbedo_tex.rgb = mix(pow((albedo_tex.rgb + vec3(0.055)) * (1.0 / (1.0 + 0.055)),vec3(2.4)),albedo_tex.rgb.rgb * (1.0 / 12.92),lessThan(albedo_tex.rgb,vec3(0.04045)));\n";
+		if (flags[FLAG_ALBEDO_TEXTURE_FORCE_SRGB]) {
+			code += "\talbedo_tex.rgb = mix(pow((albedo_tex.rgb + vec3(0.055)) * (1.0 / (1.0 + 0.055)),vec3(2.4)),albedo_tex.rgb.rgb * (1.0 / 12.92),lessThan(albedo_tex.rgb,vec3(0.04045)));\n";
+		}
+	} else {
+		code += "\tvec4 albedo_tex = vec4(1.0, 1.0, 1.0, 1.0);\n";
 	}
 
 	if (flags[FLAG_ALBEDO_FROM_VERTEX_COLOR]) {
 		code += "\talbedo_tex *= COLOR;\n";
 	}
-
 	code += "\tALBEDO = albedo.rgb * albedo_tex.rgb;\n";
-	if (flags[FLAG_UV1_USE_TRIPLANAR]) {
-		code += "\tfloat metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);\n";
+
+	if (textures[TEXTURE_METALLIC] != NULL) {
+		if (flags[FLAG_UV1_USE_TRIPLANAR]) {
+			code += "\tfloat metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);\n";
+		} else {
+			code += "\tfloat metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel);\n";
+		}
+		code += "\tMETALLIC = metallic_tex * metallic;\n";
 	} else {
-		code += "\tfloat metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel);\n";
+		code += "\tMETALLIC = metallic;\n";
 	}
-	code += "\tMETALLIC = metallic_tex * metallic;\n";
-	if (flags[FLAG_UV1_USE_TRIPLANAR]) {
-		code += "\tfloat roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);\n";
+
+	if (textures[TEXTURE_ROUGHNESS] != NULL) {
+		if (flags[FLAG_UV1_USE_TRIPLANAR]) {
+			code += "\tfloat roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);\n";
+		} else {
+			code += "\tfloat roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel);\n";
+		}
+		code += "\tROUGHNESS = roughness_tex * roughness;\n";
 	} else {
-		code += "\tfloat roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel);\n";
+		code += "\tROUGHNESS = roughness;\n";
 	}
-	code += "\tROUGHNESS = roughness_tex * roughness;\n";
+
 	code += "\tSPECULAR = specular;\n";
 
 	if (features[FEATURE_NORMAL_MAPPING]) {