Multiple fixes for transparency.
- alphaMode is only BLEND for transparent materials. - We use RawMaterial.type to figure out what's transparent. - FBX TransparencyFactor is not opacity, but 1.0-opacity. - Treat vertex coloured materials as transparent - We should at least iterate over vertices here and see if any of them actually are transparent - Sort triangles properly: transparent ones render last!
This commit is contained in:
parent
d4ac174023
commit
bf28c29f50
|
@ -169,7 +169,7 @@ public:
|
|||
fmt::printf("Warning: Mat [%s]: Can't handle texture for %s; discarding.\n", name, FbxSurfaceMaterial::sTransparencyFactor);
|
||||
}
|
||||
// FBX color is RGB, so we supply the A channel from TransparencyFactor
|
||||
res.colDiffuse[3] = transparency[3];
|
||||
res.colDiffuse[3] = 1.0 - transparency[3];
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -367,6 +367,11 @@ ModelData *Raw2Gltf(
|
|||
|
||||
for (int materialIndex = 0; materialIndex < raw.GetMaterialCount(); materialIndex++) {
|
||||
const RawMaterial &material = raw.GetMaterial(materialIndex);
|
||||
const bool isTransparent =
|
||||
material.type == RAW_MATERIAL_TYPE_VERTEX_COLORED ||
|
||||
material.type == RAW_MATERIAL_TYPE_SKINNED_VERTEX_COLORED ||
|
||||
material.type == RAW_MATERIAL_TYPE_TRANSPARENT ||
|
||||
material.type == RAW_MATERIAL_TYPE_SKINNED_TRANSPARENT;
|
||||
|
||||
// find a texture by usage and return it as a TextureData*, or nullptr if none exists.
|
||||
auto getTex = [&](RawTextureUsage usage)
|
||||
|
@ -407,7 +412,7 @@ ModelData *Raw2Gltf(
|
|||
}
|
||||
std::shared_ptr<MaterialData> mData = gltf->materials.hold(
|
||||
new MaterialData(
|
||||
material.name, getTex(RAW_TEXTURE_USAGE_NORMAL),
|
||||
material.name, isTransparent, getTex(RAW_TEXTURE_USAGE_NORMAL),
|
||||
getTex(RAW_TEXTURE_USAGE_EMISSIVE), material.emissiveFactor,
|
||||
khrComMat, pbrMetRough, pbrSpecGloss));
|
||||
materialsByName[materialHash(material)] = mData;
|
||||
|
|
|
@ -95,7 +95,7 @@ int RawModel::AddTexture(const char *name, const char *fileName, const RawTextur
|
|||
}
|
||||
}
|
||||
|
||||
const ImageProperties properties = GetImageProperties(name);
|
||||
const ImageProperties properties = GetImageProperties(fileName);
|
||||
|
||||
RawTexture texture;
|
||||
texture.name = name;
|
||||
|
@ -421,13 +421,13 @@ void RawModel::CreateMaterialModels(
|
|||
// Sort the transparent triangles in the reverse direction.
|
||||
std::sort(transparentTriangles.begin(), transparentTriangles.end(), TriangleModelSortNeg::Compare);
|
||||
|
||||
for (const auto &transparentTriangle : transparentTriangles) {
|
||||
sortedTriangles.push_back(transparentTriangle);
|
||||
}
|
||||
// Add the triangles to the sorted list.
|
||||
for (const auto &opaqueTriangle : opaqueTriangles) {
|
||||
sortedTriangles.push_back(opaqueTriangle);
|
||||
}
|
||||
for (const auto &transparentTriangle : transparentTriangles) {
|
||||
sortedTriangles.push_back(transparentTriangle);
|
||||
}
|
||||
} else {
|
||||
sortedTriangles = triangles;
|
||||
std::sort(sortedTriangles.begin(), sortedTriangles.end(), TriangleModelSortPos::Compare);
|
||||
|
|
|
@ -153,13 +153,14 @@ void to_json(json &j, const PBRMetallicRoughness &d)
|
|||
}
|
||||
|
||||
MaterialData::MaterialData(
|
||||
std::string name, const TextureData *normalTexture,
|
||||
std::string name, bool isTransparent, const TextureData *normalTexture,
|
||||
const TextureData *emissiveTexture, const Vec3f & emissiveFactor,
|
||||
std::shared_ptr<KHRCommonMats> const khrCommonMats,
|
||||
std::shared_ptr<PBRMetallicRoughness> const pbrMetallicRoughness,
|
||||
std::shared_ptr<PBRSpecularGlossiness> const pbrSpecularGlossiness)
|
||||
: Holdable(),
|
||||
name(std::move(name)),
|
||||
isTransparent(isTransparent),
|
||||
normalTexture(Tex::ref(normalTexture)),
|
||||
emissiveTexture(Tex::ref(emissiveTexture)),
|
||||
emissiveFactor(std::move(emissiveFactor)),
|
||||
|
@ -171,7 +172,7 @@ json MaterialData::serialize() const
|
|||
{
|
||||
json result = {
|
||||
{ "name", name },
|
||||
{ "alphaMode", "BLEND" }
|
||||
{ "alphaMode", isTransparent ? "BLEND" : "OPAQUE" }
|
||||
};
|
||||
|
||||
if (normalTexture != nullptr) {
|
||||
|
|
|
@ -82,7 +82,7 @@ struct PBRMetallicRoughness
|
|||
struct MaterialData : Holdable
|
||||
{
|
||||
MaterialData(
|
||||
std::string name, const TextureData *normalTexture,
|
||||
std::string name, bool isTransparent, const TextureData *normalTexture,
|
||||
const TextureData *emissiveTexture, const Vec3f &emissiveFactor,
|
||||
std::shared_ptr<KHRCommonMats> const khrCommonMats,
|
||||
std::shared_ptr<PBRMetallicRoughness> const pbrMetallicRoughness,
|
||||
|
@ -91,6 +91,7 @@ struct MaterialData : Holdable
|
|||
json serialize() const override;
|
||||
|
||||
const std::string name;
|
||||
const bool isTransparent;
|
||||
const std::unique_ptr<const Tex> normalTexture;
|
||||
const std::unique_ptr<const Tex> emissiveTexture;
|
||||
const Vec3f emissiveFactor;
|
||||
|
|
Loading…
Reference in New Issue