internal: remove vertexScale from unlit material and multiply by alpha
This commit is contained in:
@@ -17,16 +17,12 @@ material {
|
|||||||
{
|
{
|
||||||
type: float2,
|
type: float2,
|
||||||
name: uvScale
|
name: uvScale
|
||||||
},
|
|
||||||
{
|
|
||||||
type: float,
|
|
||||||
name: vertexScale
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
depthWrite : true,
|
depthWrite : true,
|
||||||
depthCulling : true,
|
depthCulling : true,
|
||||||
shadingModel : unlit,
|
shadingModel : unlit,
|
||||||
blending: opaque,
|
blending: transparent,
|
||||||
culling: none,
|
culling: none,
|
||||||
instanced: false,
|
instanced: false,
|
||||||
vertexDomain: object,
|
vertexDomain: object,
|
||||||
@@ -36,6 +32,7 @@ fragment {
|
|||||||
void material(inout MaterialInputs material) {
|
void material(inout MaterialInputs material) {
|
||||||
prepareMaterial(material);
|
prepareMaterial(material);
|
||||||
material.baseColor = materialParams.baseColorFactor;
|
material.baseColor = materialParams.baseColorFactor;
|
||||||
|
material.baseColor.rgb = material.baseColor.rgb * material.baseColor.a;
|
||||||
|
|
||||||
if (materialParams.baseColorIndex > -1) {
|
if (materialParams.baseColorIndex > -1) {
|
||||||
highp float2 uv = getUV0();
|
highp float2 uv = getUV0();
|
||||||
@@ -49,7 +46,6 @@ fragment {
|
|||||||
vertex {
|
vertex {
|
||||||
void materialVertex(inout MaterialVertexInputs material) {
|
void materialVertex(inout MaterialVertexInputs material) {
|
||||||
float4 position = getPosition();
|
float4 position = getPosition();
|
||||||
position.xyz *= materialParams.vertexScale;
|
|
||||||
material.worldPosition = getWorldFromModelMatrix() * position;
|
material.worldPosition = getWorldFromModelMatrix() * position;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,178 +0,0 @@
|
|||||||
material {
|
|
||||||
name : unlit_fade,
|
|
||||||
requires : [ uv0, uv1, color ],
|
|
||||||
shadingModel : ${SHADINGMODEL},
|
|
||||||
blending : ${BLENDING},
|
|
||||||
doubleSided : ${DOUBLESIDED},
|
|
||||||
transparency : ${TRANSPARENCY},
|
|
||||||
flipUV : false,
|
|
||||||
specularAmbientOcclusion : simple,
|
|
||||||
specularAntiAliasing : true,
|
|
||||||
clearCoatIorChange : false,
|
|
||||||
reflections : screenspace,
|
|
||||||
parameters : [
|
|
||||||
|
|
||||||
{ type : float3, name : specularFactor },
|
|
||||||
{ type : float, name : glossinessFactor },
|
|
||||||
|
|
||||||
// Base Color
|
|
||||||
{ type : int, name : baseColorIndex },
|
|
||||||
{ type : float4, name : baseColorFactor },
|
|
||||||
{ type : sampler2d, name : baseColorMap },
|
|
||||||
{ type : mat3, name : baseColorUvMatrix, precision: high },
|
|
||||||
|
|
||||||
// Metallic-Roughness Map
|
|
||||||
{ type : int, name : metallicRoughnessIndex },
|
|
||||||
{ type : float, name : metallicFactor },
|
|
||||||
{ type : float, name : roughnessFactor },
|
|
||||||
{ type : sampler2d, name : metallicRoughnessMap },
|
|
||||||
{ type : mat3, name : metallicRoughnessUvMatrix, precision: high },
|
|
||||||
|
|
||||||
// Normal Map
|
|
||||||
{ type : int, name : normalIndex },
|
|
||||||
{ type : float, name : normalScale },
|
|
||||||
{ type : sampler2d, name : normalMap },
|
|
||||||
{ type : mat3, name : normalUvMatrix, precision: high },
|
|
||||||
|
|
||||||
// Ambient Occlusion
|
|
||||||
{ type : int, name : aoIndex },
|
|
||||||
{ type : float, name : aoStrength },
|
|
||||||
{ type : sampler2d, name : occlusionMap },
|
|
||||||
{ type : mat3, name : occlusionUvMatrix, precision: high },
|
|
||||||
|
|
||||||
// Emissive Map
|
|
||||||
{ type : int, name : emissiveIndex },
|
|
||||||
{ type : float3, name : emissiveFactor },
|
|
||||||
{ type : float, name : emissiveStrength },
|
|
||||||
{ type : sampler2d, name : emissiveMap },
|
|
||||||
{ type : mat3, name : emissiveUvMatrix, precision: high },
|
|
||||||
|
|
||||||
// Clear coat
|
|
||||||
{ type : float, name : clearCoatFactor },
|
|
||||||
{ type : float, name : clearCoatRoughnessFactor },
|
|
||||||
{ type : int, name : clearCoatIndex },
|
|
||||||
{ type : sampler2d, name : clearCoatMap },
|
|
||||||
{ type : mat3, name : clearCoatUvMatrix, precision: high },
|
|
||||||
{ type : int, name : clearCoatRoughnessIndex },
|
|
||||||
{ type : sampler2d, name : clearCoatRoughnessMap },
|
|
||||||
{ type : mat3, name : clearCoatRoughnessUvMatrix, precision: high },
|
|
||||||
{ type : int, name : clearCoatNormalIndex },
|
|
||||||
{ type : sampler2d, name : clearCoatNormalMap },
|
|
||||||
{ type : mat3, name : clearCoatNormalUvMatrix, precision: high },
|
|
||||||
{ type : float, name : clearCoatNormalScale },
|
|
||||||
|
|
||||||
// Reflectance
|
|
||||||
{ type : float, name : reflectance }
|
|
||||||
|
|
||||||
${CUSTOM_PARAMS}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
vertex {
|
|
||||||
void materialVertex(inout MaterialVertexInputs material) {
|
|
||||||
${CUSTOM_VERTEX}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment {
|
|
||||||
void material(inout MaterialInputs material) {
|
|
||||||
highp float2 uvs[2];
|
|
||||||
uvs[0] = getUV0();
|
|
||||||
uvs[1] = getUV1();
|
|
||||||
|
|
||||||
#if !defined(SHADING_MODEL_UNLIT)
|
|
||||||
if (materialParams.normalIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.normalIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.normalUvMatrix).xy;
|
|
||||||
material.normal = texture(materialParams_normalMap, uv).xyz * 2.0 - 1.0;
|
|
||||||
material.normal.xy *= materialParams.normalScale;
|
|
||||||
}
|
|
||||||
#if defined(SHADING_MODEL_LIT)
|
|
||||||
if (materialParams.clearCoatNormalIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.clearCoatNormalIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.clearCoatNormalUvMatrix).xy;
|
|
||||||
material.clearCoatNormal = texture(materialParams_clearCoatNormalMap, uv).xyz * 2.0 - 1.0;
|
|
||||||
material.clearCoatNormal.xy *= materialParams.clearCoatNormalScale;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
prepareMaterial(material);
|
|
||||||
material.baseColor = materialParams.baseColorFactor;
|
|
||||||
|
|
||||||
if (materialParams.baseColorIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.baseColorIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.baseColorUvMatrix).xy;
|
|
||||||
material.baseColor *= texture(materialParams_baseColorMap, uv);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(BLEND_MODE_TRANSPARENT)
|
|
||||||
material.baseColor.rgb *= material.baseColor.a;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
material.baseColor *= getColor();
|
|
||||||
|
|
||||||
#if !defined(SHADING_MODEL_UNLIT)
|
|
||||||
|
|
||||||
#if defined(SHADING_MODEL_LIT)
|
|
||||||
material.roughness = materialParams.roughnessFactor;
|
|
||||||
material.metallic = materialParams.metallicFactor;
|
|
||||||
|
|
||||||
// KHR_materials_clearcoat forbids clear coat from
|
|
||||||
// being applied in the specular/glossiness model
|
|
||||||
material.clearCoat = materialParams.clearCoatFactor;
|
|
||||||
material.clearCoatRoughness = materialParams.clearCoatRoughnessFactor;
|
|
||||||
|
|
||||||
if (materialParams.clearCoatIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.clearCoatIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.clearCoatUvMatrix).xy;
|
|
||||||
material.clearCoat *= texture(materialParams_clearCoatMap, uv).r;
|
|
||||||
}
|
|
||||||
if (materialParams.clearCoatRoughnessIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.clearCoatRoughnessIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.clearCoatRoughnessUvMatrix).xy;
|
|
||||||
material.clearCoatRoughness *= texture(materialParams_clearCoatRoughnessMap, uv).g;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
material.emissive = vec4(materialParams.emissiveStrength *
|
|
||||||
materialParams.emissiveFactor.rgb, 0.0);
|
|
||||||
|
|
||||||
#if defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
||||||
material.glossiness = materialParams.glossinessFactor;
|
|
||||||
material.specularColor = materialParams.specularFactor;
|
|
||||||
#else
|
|
||||||
material.reflectance = materialParams.reflectance;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (materialParams.metallicRoughnessIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.metallicRoughnessIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.metallicRoughnessUvMatrix).xy;
|
|
||||||
|
|
||||||
#if defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
||||||
vec4 sg = texture(materialParams_metallicRoughnessMap, uv);
|
|
||||||
material.specularColor *= sg.rgb;
|
|
||||||
material.glossiness *= sg.a;
|
|
||||||
#else
|
|
||||||
vec4 mr = texture(materialParams_metallicRoughnessMap, uv);
|
|
||||||
material.roughness *= mr.g;
|
|
||||||
material.metallic *= mr.b;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (materialParams.aoIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.aoIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy;
|
|
||||||
float occlusion = texture(materialParams_occlusionMap, uv).r;
|
|
||||||
material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0);
|
|
||||||
}
|
|
||||||
if (materialParams.emissiveIndex > -1) {
|
|
||||||
highp float2 uv = uvs[materialParams.emissiveIndex];
|
|
||||||
uv = (vec3(uv, 1.0) * materialParams.emissiveUvMatrix).xy;
|
|
||||||
material.emissive.rgb *= texture(materialParams_emissiveMap, uv).rgb;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
${CUSTOM_FRAGMENT}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -149,7 +149,6 @@ class FFIAsset extends ThermionAsset {
|
|||||||
|
|
||||||
await highlightMaterialInstance.setDepthCullingEnabled(false);
|
await highlightMaterialInstance.setDepthCullingEnabled(false);
|
||||||
|
|
||||||
await highlightMaterialInstance.setParameterFloat("vertexScale", 1.03);
|
|
||||||
await highlightMaterialInstance.setParameterFloat4(
|
await highlightMaterialInstance.setParameterFloat4(
|
||||||
"baseColorFactor", r, g, b, 1.0);
|
"baseColorFactor", r, g, b, 1.0);
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ public:
|
|||||||
const char* extras = nullptr) override {
|
const char* extras = nullptr) override {
|
||||||
auto instance = mUnlitMaterial->createInstance();
|
auto instance = mUnlitMaterial->createInstance();
|
||||||
instance->setParameter("baseColorIndex", -1);
|
instance->setParameter("baseColorIndex", -1);
|
||||||
instance->setParameter("vertexScale", 1.0f);
|
|
||||||
instance->setParameter("uvScale", filament::math::float2 { 1.0f, 1.0f });
|
instance->setParameter("uvScale", filament::math::float2 { 1.0f, 1.0f });
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,17 +49,35 @@ void main() async {
|
|||||||
await viewer.setToneMapping(ToneMapper.LINEAR);
|
await viewer.setToneMapping(ToneMapper.LINEAR);
|
||||||
|
|
||||||
var materialInstance = await viewer.createUnlitMaterialInstance();
|
var materialInstance = await viewer.createUnlitMaterialInstance();
|
||||||
var cube = await viewer.createGeometry(GeometryHelper.cube(),
|
var cube = await viewer.createGeometry(
|
||||||
|
GeometryHelper.cube(normals: false, uvs: false),
|
||||||
materialInstances: [materialInstance]);
|
materialInstances: [materialInstance]);
|
||||||
|
|
||||||
await materialInstance.setParameterFloat4(
|
await materialInstance.setParameterFloat4(
|
||||||
"baseColorFactor", 0.0, 1.0, 0.0, 1.0);
|
"baseColorFactor", 0.0, 1.0, 0.0, 1.0);
|
||||||
await materialInstance.setParameterInt("baseColorIndex", -1);
|
await materialInstance.setParameterInt("baseColorIndex", -1);
|
||||||
// await viewer.render();
|
|
||||||
// await viewer.render();
|
|
||||||
// await viewer.render();
|
|
||||||
await testHelper.capture(viewer, "unlit_material_base_color");
|
await testHelper.capture(viewer, "unlit_material_base_color");
|
||||||
});
|
await viewer.destroyMaterialInstance(materialInstance);
|
||||||
|
}, bg: kRed);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('unlit material with color + alpha', () async {
|
||||||
|
await testHelper.withViewer((viewer) async {
|
||||||
|
await viewer.setPostProcessing(true);
|
||||||
|
await viewer.setToneMapping(ToneMapper.LINEAR);
|
||||||
|
|
||||||
|
var materialInstance = await viewer.createUnlitMaterialInstance();
|
||||||
|
var cube = await viewer.createGeometry(
|
||||||
|
GeometryHelper.cube(normals: false, uvs: false),
|
||||||
|
materialInstances: [materialInstance]);
|
||||||
|
|
||||||
|
await materialInstance.setParameterFloat4(
|
||||||
|
"baseColorFactor", 0.0, 1.0, 0.0, 0.1);
|
||||||
|
await materialInstance.setParameterInt("baseColorIndex", -1);
|
||||||
|
await testHelper.capture(viewer, "unlit_material_base_color_alpha");
|
||||||
|
await viewer.destroyMaterialInstance(materialInstance);
|
||||||
|
}, bg: kRed);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('unlit fixed size material', () async {
|
test('unlit fixed size material', () async {
|
||||||
@@ -105,7 +123,7 @@ void main() async {
|
|||||||
await viewer.applyTexture(texture as ThermionFFITexture, cube.entity);
|
await viewer.applyTexture(texture as ThermionFFITexture, cube.entity);
|
||||||
await testHelper.capture(
|
await testHelper.capture(
|
||||||
viewer, "geometry_cube_with_custom_material_ubershader_texture");
|
viewer, "geometry_cube_with_custom_material_ubershader_texture");
|
||||||
await viewer.removeEntity(cube);
|
await viewer.removeAsset(cube);
|
||||||
await viewer.destroyMaterialInstance(materialInstance);
|
await viewer.destroyMaterialInstance(materialInstance);
|
||||||
await viewer.destroyTexture(texture);
|
await viewer.destroyTexture(texture);
|
||||||
await viewer.dispose();
|
await viewer.dispose();
|
||||||
@@ -131,7 +149,7 @@ void main() async {
|
|||||||
await viewer.applyTexture(texture, cube.entity);
|
await viewer.applyTexture(texture, cube.entity);
|
||||||
await testHelper.capture(
|
await testHelper.capture(
|
||||||
viewer, "geometry_cube_with_custom_material_unlit_texture_only");
|
viewer, "geometry_cube_with_custom_material_unlit_texture_only");
|
||||||
await viewer.removeEntity(cube);
|
await viewer.removeAsset(cube);
|
||||||
|
|
||||||
cube = await viewer.createGeometry(GeometryHelper.cube(),
|
cube = await viewer.createGeometry(GeometryHelper.cube(),
|
||||||
materialInstances: [materialInstance]);
|
materialInstances: [materialInstance]);
|
||||||
@@ -141,7 +159,7 @@ void main() async {
|
|||||||
"baseColorFactor", 0.0, 1.0, 0.0, 1.0);
|
"baseColorFactor", 0.0, 1.0, 0.0, 1.0);
|
||||||
await testHelper.capture(
|
await testHelper.capture(
|
||||||
viewer, "geometry_cube_with_custom_material_unlit_color_only");
|
viewer, "geometry_cube_with_custom_material_unlit_color_only");
|
||||||
await viewer.removeEntity(cube);
|
await viewer.removeAsset(cube);
|
||||||
|
|
||||||
cube = await viewer.createGeometry(GeometryHelper.cube(),
|
cube = await viewer.createGeometry(GeometryHelper.cube(),
|
||||||
materialInstances: [materialInstance]);
|
materialInstances: [materialInstance]);
|
||||||
@@ -154,7 +172,7 @@ void main() async {
|
|||||||
await testHelper.capture(
|
await testHelper.capture(
|
||||||
viewer, "geometry_cube_with_custom_material_unlit_color_and_texture");
|
viewer, "geometry_cube_with_custom_material_unlit_color_and_texture");
|
||||||
|
|
||||||
await viewer.removeEntity(cube);
|
await viewer.removeAsset(cube);
|
||||||
|
|
||||||
await viewer.destroyTexture(texture);
|
await viewer.destroyTexture(texture);
|
||||||
await viewer.destroyMaterialInstance(materialInstance);
|
await viewer.destroyMaterialInstance(materialInstance);
|
||||||
@@ -400,7 +418,7 @@ void main() async {
|
|||||||
|
|
||||||
// await testHelper.capture(viewer, "texture_applied_to_geometry");
|
// await testHelper.capture(viewer, "texture_applied_to_geometry");
|
||||||
|
|
||||||
// await viewer.removeEntity(cube);
|
// await viewer.removeAsset(cube);
|
||||||
// await viewer.destroyTexture(texture);
|
// await viewer.destroyTexture(texture);
|
||||||
// await viewer.dispose();
|
// await viewer.dispose();
|
||||||
// });
|
// });
|
||||||
@@ -509,7 +527,7 @@ void main() async {
|
|||||||
// await viewer.setToneMapping(ToneMapper.LINEAR);
|
// await viewer.setToneMapping(ToneMapper.LINEAR);
|
||||||
|
|
||||||
// final unlit = await viewer.createUnlitMaterialInstance();
|
// final unlit = await viewer.createUnlitMaterialInstance();
|
||||||
// await viewer.removeEntity(cube);
|
// await viewer.removeAsset(cube);
|
||||||
// cube = await viewer.createGeometry(GeometryHelper.cube(),
|
// cube = await viewer.createGeometry(GeometryHelper.cube(),
|
||||||
// materialInstance: unlit);
|
// materialInstance: unlit);
|
||||||
// var reconstructedTexture = await viewer.createTexture(pixelBufferPng);
|
// var reconstructedTexture = await viewer.createTexture(pixelBufferPng);
|
||||||
|
|||||||
Reference in New Issue
Block a user