KHR_materials_unlit (#61)

KHR_materials_unlit support.
This commit is contained in:
Robert Long 2018-02-02 06:57:36 -08:00 committed by Pär Winzell
parent 41f8a5ef03
commit 74479426a7
6 changed files with 69 additions and 7 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build/

View File

@ -852,6 +852,9 @@ ModelData *Raw2Gltf(
diffuseTex.get(), diffuseFactor, specGlossTex.get(), specularFactor, glossiness));
}
TextureData *normalTexture = simpleTex(RAW_TEXTURE_USAGE_NORMAL).get();
TextureData *emissiveTexture = simpleTex(RAW_TEXTURE_USAGE_EMISSIVE).get();
std::shared_ptr<KHRCommonMats> khrComMat;
if (options.useKHRMatCom) {
float shininess;
@ -905,12 +908,38 @@ ModelData *Raw2Gltf(
diffuseTex.get(), diffuseFactor,
simpleTex(RAW_TEXTURE_USAGE_SPECULAR).get(), specularFactor));
}
std::shared_ptr<KHRCmnConstantMaterial> khrCmnConstantMat;
if (options.useKHRMatCmnConstant) {
normalTexture = nullptr;
emissiveTexture = nullptr;
emissiveFactor = Vec3f(0.00f, 0.00f, 0.00f);
Vec4f diffuseFactor;
std::shared_ptr<TextureData> baseColorTex;
if (material.info->shadingModel == RAW_SHADING_MODEL_PBR_MET_ROUGH) {
RawMetRoughMatProps *props = (RawMetRoughMatProps *) material.info.get();
diffuseFactor = props->diffuseFactor;
baseColorTex = simpleTex(RAW_TEXTURE_USAGE_ALBEDO);
} else {
RawTraditionalMatProps *props = ((RawTraditionalMatProps *) material.info.get());
diffuseFactor = props->diffuseFactor;
baseColorTex = simpleTex(RAW_TEXTURE_USAGE_DIFFUSE);
}
pbrMetRough.reset(new PBRMetallicRoughness(baseColorTex.get(), nullptr, diffuseFactor, 0.0f, 1.0f));
khrCmnConstantMat.reset(new KHRCmnConstantMaterial());
}
std::shared_ptr<MaterialData> mData = gltf->materials.hold(
new MaterialData(
material.name, isTransparent,
simpleTex(RAW_TEXTURE_USAGE_NORMAL).get(), simpleTex(RAW_TEXTURE_USAGE_EMISSIVE).get(),
normalTexture, emissiveTexture,
emissiveFactor * emissiveIntensity,
khrComMat, pbrMetRough, pbrSpecGloss));
khrComMat, khrCmnConstantMat, pbrMetRough, pbrSpecGloss));
materialsByName[materialHash(material)] = mData;
}
@ -1188,6 +1217,9 @@ ModelData *Raw2Gltf(
extensionsRequired.push_back(KHR_MATERIALS_COMMON);
}
}
if (options.useKHRMatCmnConstant) {
extensionsUsed.push_back(KHR_MATERIALS_CMN_CONSTANT);
}
if (options.usePBRSpecGloss) {
extensionsUsed.push_back(KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS);
if (!options.useKHRMatCom && !options.usePBRMetRough) {

View File

@ -30,6 +30,7 @@ using json = nlohmann::basic_json<workaround_fifo_map>;
static const std::string KHR_DRACO_MESH_COMPRESSION = "KHR_draco_mesh_compression";
static const std::string KHR_MATERIALS_COMMON = "KHR_materials_common";
static const std::string KHR_MATERIALS_CMN_CONSTANT = "KHR_materials_unlit";
static const std::string KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS = "KHR_materials_pbrSpecularGlossiness";
static const std::string extBufferFilename = "buffer.bin";
@ -54,6 +55,8 @@ struct GltfOptions
bool useDraco;
/** Whether to use KHR_materials_common to extend materials definitions. */
bool useKHRMatCom;
/** Whether to use KHR_materials_cmnConstant to extend materials definitions. */
bool useKHRMatCmnConstant;
/** Whether to populate the pbrMetallicRoughness substruct in materials. */
bool usePBRMetRough;
/** Whether to use KHR_materials_pbrSpecularGlossiness to extend material definitions. */

View File

@ -93,6 +93,15 @@ void to_json(json &j, const KHRCommonMats &d)
}
}
KHRCmnConstantMaterial::KHRCmnConstantMaterial()
{
}
void to_json(json &j, const KHRCmnConstantMaterial &d)
{
j = json({});
}
PBRSpecularGlossiness::PBRSpecularGlossiness(
const TextureData *diffuseTexture, const Vec4f &diffuseFactor,
const TextureData *specularGlossinessTexture, const Vec3f &specularFactor,
@ -161,6 +170,7 @@ MaterialData::MaterialData(
std::string name, bool isTransparent, const TextureData *normalTexture,
const TextureData *emissiveTexture, const Vec3f & emissiveFactor,
std::shared_ptr<KHRCommonMats> const khrCommonMats,
std::shared_ptr<KHRCmnConstantMaterial> const khrCmnConstantMaterial,
std::shared_ptr<PBRMetallicRoughness> const pbrMetallicRoughness,
std::shared_ptr<PBRSpecularGlossiness> const pbrSpecularGlossiness)
: Holdable(),
@ -170,6 +180,7 @@ MaterialData::MaterialData(
emissiveTexture(Tex::ref(emissiveTexture)),
emissiveFactor(std::move(emissiveFactor)),
khrCommonMats(khrCommonMats),
khrCmnConstantMaterial(khrCmnConstantMaterial),
pbrMetallicRoughness(pbrMetallicRoughness),
pbrSpecularGlossiness(pbrSpecularGlossiness) {}
@ -192,11 +203,14 @@ json MaterialData::serialize() const
if (pbrMetallicRoughness != nullptr) {
result["pbrMetallicRoughness"] = *pbrMetallicRoughness;
}
if (khrCommonMats != nullptr || pbrSpecularGlossiness != nullptr) {
if (khrCommonMats != nullptr || khrCmnConstantMaterial != nullptr || pbrSpecularGlossiness != nullptr) {
json extensions = { };
if (khrCommonMats != nullptr) {
extensions[KHR_MATERIALS_COMMON] = *khrCommonMats;
}
if (khrCmnConstantMaterial != nullptr) {
extensions[KHR_MATERIALS_CMN_CONSTANT] = *khrCmnConstantMaterial;
}
if (pbrSpecularGlossiness != nullptr) {
extensions[KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS] = *pbrSpecularGlossiness;
}

View File

@ -53,6 +53,11 @@ struct KHRCommonMats
const Vec3f specularFactor;
};
struct KHRCmnConstantMaterial
{
KHRCmnConstantMaterial();
};
struct PBRSpecularGlossiness
{
PBRSpecularGlossiness(
@ -86,6 +91,7 @@ struct MaterialData : Holdable
std::string name, bool isTransparent, const TextureData *normalTexture,
const TextureData *emissiveTexture, const Vec3f &emissiveFactor,
std::shared_ptr<KHRCommonMats> const khrCommonMats,
std::shared_ptr<KHRCmnConstantMaterial> const khrCmnConstantMaterial,
std::shared_ptr<PBRMetallicRoughness> const pbrMetallicRoughness,
std::shared_ptr<PBRSpecularGlossiness> const pbrSpecularGlossiness);
@ -97,13 +103,15 @@ struct MaterialData : Holdable
const std::unique_ptr<const Tex> emissiveTexture;
const Vec3f emissiveFactor;
const std::shared_ptr<const KHRCommonMats> khrCommonMats;
const std::shared_ptr<const PBRMetallicRoughness> pbrMetallicRoughness;
const std::shared_ptr<const PBRSpecularGlossiness> pbrSpecularGlossiness;
const std::shared_ptr<const KHRCommonMats> khrCommonMats;
const std::shared_ptr<const KHRCmnConstantMaterial> khrCmnConstantMaterial;
const std::shared_ptr<const PBRMetallicRoughness> pbrMetallicRoughness;
const std::shared_ptr<const PBRSpecularGlossiness> pbrSpecularGlossiness;
};
void to_json(json &j, const Tex &data);
void to_json(json &j, const KHRCommonMats &d);
void to_json(json &j, const KHRCmnConstantMaterial &d);
void to_json(json &j, const PBRSpecularGlossiness &d);
void to_json(json &j, const PBRMetallicRoughness &d);

View File

@ -48,6 +48,7 @@ int main(int argc, char *argv[])
false, // embedResources
false, // useDraco
false, // useKHRMatCom
false, // useKHRMatCmnConstant
false, // usePBRMetRough
false, // usePBRSpecGloss
false, // useBlendShapeNormals
@ -77,6 +78,9 @@ int main(int argc, char *argv[])
(
"khr-materials-common", "(WIP) Use KHR_materials_common extensions to specify Unlit/Lambert/Blinn/Phong shaders.",
cxxopts::value<bool>(gltfOptions.useKHRMatCom))
(
"khr-materials-cmnConstant", "(WIP) Use KHR_materials_cmnConstant extension to specify Unlit shader.",
cxxopts::value<bool>(gltfOptions.useKHRMatCmnConstant))
(
"pbr-metallic-roughness", "(WIP) Try to glean glTF 2.0 native PBR attributes from the FBX.",
cxxopts::value<bool>(gltfOptions.usePBRMetRough))
@ -129,7 +133,7 @@ Copyright (c) 2016-2017 Oculus VR, LLC.
verboseOutput = true;
}
if (!gltfOptions.useKHRMatCom && !gltfOptions.usePBRSpecGloss && !gltfOptions.usePBRMetRough) {
if (!gltfOptions.useKHRMatCmnConstant && !gltfOptions.useKHRMatCom && !gltfOptions.usePBRSpecGloss && !gltfOptions.usePBRMetRough) {
if (verboseOutput) {
fmt::printf("Defaulting to --pbr-metallic-roughness material support.\n");
}