diff --git a/android/samples/sample-hello-triangle/src/main/java/com/google/android/filament/hellotriangle/MainActivity.kt b/android/samples/sample-hello-triangle/src/main/java/com/google/android/filament/hellotriangle/MainActivity.kt index 16f29848f66..7d34a3031d6 100644 --- a/android/samples/sample-hello-triangle/src/main/java/com/google/android/filament/hellotriangle/MainActivity.kt +++ b/android/samples/sample-hello-triangle/src/main/java/com/google/android/filament/hellotriangle/MainActivity.kt @@ -160,11 +160,7 @@ class MainActivity : Activity() { } private fun loadMaterial() { - var name = "materials/baked_color.filamat" - if (engine.activeFeatureLevel == Engine.FeatureLevel.FEATURE_LEVEL_0) { - name = "materials/baked_color_es2.filamat" - } - readUncompressedAsset(name).let { + readUncompressedAsset("materials/baked_color.filamat").let { material = Material.Builder().payload(it, it.remaining()).build(engine) } } diff --git a/android/samples/sample-hello-triangle/src/main/materials/baked_color.mat b/android/samples/sample-hello-triangle/src/main/materials/baked_color.mat index 2e6bcf8bb53..8526ff060e5 100644 --- a/android/samples/sample-hello-triangle/src/main/materials/baked_color.mat +++ b/android/samples/sample-hello-triangle/src/main/materials/baked_color.mat @@ -17,7 +17,8 @@ material { ], // This material disables all lighting - shadingModel : unlit + shadingModel : unlit, + featureLevel : 0 } fragment { diff --git a/android/samples/sample-hello-triangle/src/main/materials/baked_color_es2.mat b/android/samples/sample-hello-triangle/src/main/materials/baked_color_es2.mat deleted file mode 100644 index 8526ff060e5..00000000000 --- a/android/samples/sample-hello-triangle/src/main/materials/baked_color_es2.mat +++ /dev/null @@ -1,33 +0,0 @@ -// Simple unlit material that uses the colors associated with each vertex. -// -// This source material must be compiled to a binary material using the matc tool. -// The command used to compile this material is: -// matc -p mobile -a opengl -o app/src/main/assets/baked_color.filamat app/src/materials/baked_color.mat -// -// See build.gradle for an example of how to compile materials automatically -// Please refer to the documentation for more information about matc and the materials system. - -material { - name : baked_color, - - // Lists the required vertex attributes - // Here we only need a color (RGBA) - requires : [ - color - ], - - // This material disables all lighting - shadingModel : unlit, - featureLevel : 0 -} - -fragment { - void material(inout MaterialInputs material) { - // You must always call the prepareMaterial() function - prepareMaterial(material); - - // We set the material's color to the color interpolated from - // the model's vertices - material.baseColor = getColor(); - } -} diff --git a/filament/CMakeLists.txt b/filament/CMakeLists.txt index b65e3cca9ba..e9973e7393a 100644 --- a/filament/CMakeLists.txt +++ b/filament/CMakeLists.txt @@ -245,11 +245,6 @@ set(MATERIAL_SRCS src/materials/vsmMipmap.mat ) -set(MATERIAL_ES2_SRCS - src/materials/defaultMaterial0.mat - src/materials/skybox0.mat -) - # Embed the binary resource blob for materials. get_resgen_vars(${RESOURCE_DIR} materials) list(APPEND PRIVATE_HDRS ${RESGEN_HEADER}) @@ -315,23 +310,6 @@ foreach (mat_src ${MATERIAL_SRCS}) list(APPEND MATERIAL_BINS ${output_path}) endforeach() -if (IS_MOBILE_TARGET AND FILAMENT_SUPPORTS_OPENGL) - foreach (mat_src ${MATERIAL_ES2_SRCS}) - get_filename_component(localname "${mat_src}" NAME_WE) - get_filename_component(fullname "${mat_src}" ABSOLUTE) - set(output_path "${MATERIAL_DIR}/${localname}.filamat") - - add_custom_command( - OUTPUT ${output_path} - COMMAND matc -a opengl -p ${MATC_TARGET} ${MATC_OPT_FLAGS} -o ${output_path} ${fullname} - MAIN_DEPENDENCY ${fullname} - DEPENDS matc - COMMENT "Compiling material ${mat_src} to ${output_path}" - ) - list(APPEND MATERIAL_BINS ${output_path}) - endforeach () -endif () - # Additional dependencies on included files for materials add_custom_command( diff --git a/filament/src/details/Engine.cpp b/filament/src/details/Engine.cpp index 3e50fc71352..bf54ac44225 100644 --- a/filament/src/details/Engine.cpp +++ b/filament/src/details/Engine.cpp @@ -322,22 +322,17 @@ void FEngine::init() { driverApi.update3DImage(mDummyZeroTexture, 0, 0, 0, 0, 1, 1, 1, { zeroes, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); + FMaterial::DefaultMaterialBuilder defaultMaterialBuilder; + defaultMaterialBuilder.package( + MATERIALS_DEFAULTMATERIAL_DATA, MATERIALS_DEFAULTMATERIAL_SIZE); + mDefaultMaterial = downcast(defaultMaterialBuilder.build(*const_cast(this))); + #ifdef FILAMENT_TARGET_MOBILE - if (UTILS_UNLIKELY(mActiveFeatureLevel == FeatureLevel::FEATURE_LEVEL_0)) { - FMaterial::DefaultMaterialBuilder defaultMaterialBuilder; - defaultMaterialBuilder.package( - MATERIALS_DEFAULTMATERIAL0_DATA, MATERIALS_DEFAULTMATERIAL0_SIZE); - mDefaultMaterial = downcast(defaultMaterialBuilder.build(*const_cast(this))); - } else + if (UTILS_LIKELY(mActiveFeatureLevel > FeatureLevel::FEATURE_LEVEL_0)) #endif { mDefaultColorGrading = downcast(ColorGrading::Builder().build(*this)); - FMaterial::DefaultMaterialBuilder defaultMaterialBuilder; - defaultMaterialBuilder.package( - MATERIALS_DEFAULTMATERIAL_DATA, MATERIALS_DEFAULTMATERIAL_SIZE); - mDefaultMaterial = downcast(defaultMaterialBuilder.build(*const_cast(this))); - float3 dummyPositions[1] = {}; short4 dummyTangents[1] = {}; mDummyMorphTargetBuffer->setPositionsAt(*this, 0, dummyPositions, 1, 0); diff --git a/filament/src/details/Skybox.cpp b/filament/src/details/Skybox.cpp index 969eccdb455..7130d0dfe26 100644 --- a/filament/src/details/Skybox.cpp +++ b/filament/src/details/Skybox.cpp @@ -118,14 +118,7 @@ FSkybox::FSkybox(FEngine& engine, const Builder& builder) noexcept FMaterial const* FSkybox::createMaterial(FEngine& engine) { Material::Builder builder; -#ifdef FILAMENT_TARGET_MOBILE - if (UTILS_UNLIKELY(engine.getActiveFeatureLevel() == Engine::FeatureLevel::FEATURE_LEVEL_0)) { - builder.package(MATERIALS_SKYBOX0_DATA, MATERIALS_SKYBOX0_SIZE); - } else -#endif - { - builder.package(MATERIALS_SKYBOX_DATA, MATERIALS_SKYBOX_SIZE); - } + builder.package(MATERIALS_SKYBOX_DATA, MATERIALS_SKYBOX_SIZE); auto material = builder.build(engine); return downcast(material); } diff --git a/filament/src/materials/defaultMaterial.mat b/filament/src/materials/defaultMaterial.mat index c7db4eb0daa..7ee4e0e279a 100644 --- a/filament/src/materials/defaultMaterial.mat +++ b/filament/src/materials/defaultMaterial.mat @@ -1,6 +1,7 @@ material { name : "Filament Default Material", - shadingModel : unlit + shadingModel : unlit, + featureLevel : 0 } fragment { diff --git a/filament/src/materials/defaultMaterial0.mat b/filament/src/materials/defaultMaterial0.mat deleted file mode 100644 index 914d29c3d1d..00000000000 --- a/filament/src/materials/defaultMaterial0.mat +++ /dev/null @@ -1,12 +0,0 @@ -material { - name : "Filament Default Material", - shadingModel : unlit, - featureLevel: 0 -} - -fragment { - void material(inout MaterialInputs material) { - prepareMaterial(material); - material.baseColor.rgb = vec3(0.8); - } -} diff --git a/filament/src/materials/skybox.mat b/filament/src/materials/skybox.mat index 1d36108a275..4ac76a7feb5 100644 --- a/filament/src/materials/skybox.mat +++ b/filament/src/materials/skybox.mat @@ -25,7 +25,8 @@ material { depthWrite : false, shadingModel : unlit, variantFilter : [ skinning, shadowReceiver, vsm ], - culling: none + culling : none, + featureLevel : 0 } fragment { @@ -35,10 +36,15 @@ fragment { if (materialParams.constantColor != 0) { sky = materialParams.color; } else { + #if MATERIAL_FEATURE_LEVEL == 0 + sky = vec4(textureCube(materialParams_skybox, variable_eyeDirection.xyz).rgb, 1.0); + #else + // textureLod() at 0.0 is more performant than texture(). sky = vec4(textureLod(materialParams_skybox, variable_eyeDirection.xyz, 0.0).rgb, 1.0); + #endif sky.rgb *= frameUniforms.iblLuminance; } - if (materialParams.showSun != 0 && frameUniforms.sun.w >= 0.0f) { + if (materialParams.showSun != 0 && frameUniforms.sun.w >= 0.0) { vec3 direction = normalize(variable_eyeDirection.xyz); // Assume the sun is a sphere vec3 sun = frameUniforms.lightColorIntensity.rgb * diff --git a/filament/src/materials/skybox0.mat b/filament/src/materials/skybox0.mat deleted file mode 100644 index 2891e32f4b3..00000000000 --- a/filament/src/materials/skybox0.mat +++ /dev/null @@ -1,60 +0,0 @@ -material { - name : Skybox, - parameters : [ - { - type : int, - name : showSun - }, - { - type : int, - name : constantColor - }, - { - type : samplerCubemap, - name : skybox - }, - { - type : float4, - name : color - } - ], - variables : [ - eyeDirection - ], - vertexDomain : device, - depthWrite : false, - shadingModel : unlit, - variantFilter : [ skinning, shadowReceiver, vsm ], - culling: none, - featureLevel: 0 -} - -fragment { - void material(inout MaterialInputs material) { - prepareMaterial(material); - vec4 sky; - if (materialParams.constantColor != 0) { - sky = materialParams.color; - } else { - sky = vec4(textureCube(materialParams_skybox, variable_eyeDirection.xyz).rgb, 1.0); - sky.rgb *= frameUniforms.iblLuminance; - } - if (materialParams.showSun != 0 && frameUniforms.sun.w >= 0.0) { - vec3 direction = normalize(variable_eyeDirection.xyz); - // Assume the sun is a sphere - vec3 sun = frameUniforms.lightColorIntensity.rgb * - (frameUniforms.lightColorIntensity.a * (4.0 * PI)); - float cosAngle = dot(direction, frameUniforms.lightDirection); - float x = (cosAngle - frameUniforms.sun.x) * frameUniforms.sun.z; - float gradient = pow(1.0 - saturate(x), frameUniforms.sun.w); - sky.rgb = sky.rgb + gradient * sun; - } - material.baseColor = sky; - } -} - -vertex { - void materialVertex(inout MaterialVertexInputs material) { - material.eyeDirection.xyz = material.worldPosition.xyz; - } -}