Skip to content

Commit

Permalink
Load data for KHR_materials_specular pbr model
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeshurun Hembd committed Apr 30, 2024
1 parent 86bb8f0 commit 5914113
Show file tree
Hide file tree
Showing 4 changed files with 234 additions and 27 deletions.
44 changes: 38 additions & 6 deletions packages/engine/Source/Scene/GltfLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ const {
Components,
MetallicRoughness,
SpecularGlossiness,
Specular,
Material,
} = ModelComponents;

Expand Down Expand Up @@ -1536,6 +1537,31 @@ function loadMetallicRoughness(loader, metallicRoughnessInfo, frameState) {
return metallicRoughness;
}

function loadSpecular(loader, specularInfo, frameState) {
const {
specularFactor,
specularTexture,
specularColorFactor,
specularColorTexture,
} = specularInfo;

const specular = new Specular();
if (defined(specularTexture)) {
specular.specularTexture = loadTexture(loader, specularTexture, frameState);
}
if (defined(specularColorTexture)) {
specular.specularColorTexture = loadTexture(
loader,
specularColorTexture,
frameState
);
}
specular.specularTexture = specularFactor;
specular.specularColorTexture = fromArray(Cartesian3, specularColorFactor);

return specular;
}

/**
* Load textures and parse factors and flags for a glTF material
* @param {GltfLoader} loader
Expand All @@ -1552,6 +1578,7 @@ function loadMaterial(loader, gltfMaterial, frameState) {
defaultValue.EMPTY_OBJECT
);
const pbrSpecularGlossiness = extensions.KHR_materials_pbrSpecularGlossiness;
const pbrSpecular = extensions.KHR_materials_specular;
const pbrMetallicRoughness = gltfMaterial.pbrMetallicRoughness;

material.unlit = defined(extensions.KHR_materials_unlit);
Expand All @@ -1562,12 +1589,17 @@ function loadMaterial(loader, gltfMaterial, frameState) {
pbrSpecularGlossiness,
frameState
);
} else if (defined(pbrMetallicRoughness)) {
material.metallicRoughness = loadMetallicRoughness(
loader,
pbrMetallicRoughness,
frameState
);
} else {
if (defined(pbrMetallicRoughness)) {
material.metallicRoughness = loadMetallicRoughness(
loader,
pbrMetallicRoughness,
frameState
);
}
if (defined(pbrSpecular)) {
material.specular = loadSpecular(loader, pbrSpecular, frameState);
}
}

// Top level textures
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@ function forEachTextureInMaterial(material, handler) {
}
}

if (defined(material.extensions)) {
const { extensions } = material;
if (defined(extensions)) {
// Spec gloss extension
const pbrSpecularGlossiness =
material.extensions.KHR_materials_pbrSpecularGlossiness;
extensions.KHR_materials_pbrSpecularGlossiness;
if (defined(pbrSpecularGlossiness)) {
if (defined(pbrSpecularGlossiness.diffuseTexture)) {
const textureInfo = pbrSpecularGlossiness.diffuseTexture;
Expand All @@ -54,13 +55,28 @@ function forEachTextureInMaterial(material, handler) {
}
}

// Specular extension
const specular = extensions.KHR_materials_specular;
if (defined(specular)) {
const { specularTexture, specularColorTexture } = specular;
if (defined(specularTexture)) {
const value = handler(specularTexture.index, specularTexture);
if (defined(value)) {
return value;
}
}
if (defined(specularColorTexture)) {
const value = handler(specularColorTexture.index, specularColorTexture);
if (defined(value)) {
return value;
}
}
}

// Materials common extension (may be present in models converted from glTF 1.0)
const materialsCommon = material.extensions.KHR_materials_common;
const materialsCommon = extensions.KHR_materials_common;
if (defined(materialsCommon) && defined(materialsCommon.values)) {
const diffuse = materialsCommon.values.diffuse;
const ambient = materialsCommon.values.ambient;
const emission = materialsCommon.values.emission;
const specular = materialsCommon.values.specular;
const { diffuse, ambient, emission, specular } = materialsCommon.values;
if (defined(diffuse) && defined(diffuse.index)) {
const value = handler(diffuse.index, diffuse);
if (defined(value)) {
Expand Down
130 changes: 116 additions & 14 deletions packages/engine/Source/Scene/Model/MaterialPipelineStage.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ import VertexAttributeSemantic from "../VertexAttributeSemantic.js";
import LightingModel from "./LightingModel.js";
import ModelUtility from "./ModelUtility.js";

const Material = ModelComponents.Material;
const MetallicRoughness = ModelComponents.MetallicRoughness;
const SpecularGlossiness = ModelComponents.SpecularGlossiness;
const {
Material,
MetallicRoughness,
SpecularGlossiness,
Specular,
} = ModelComponents;

/**
* The material pipeline stage processes textures and other uniforms needed
Expand Down Expand Up @@ -93,6 +96,15 @@ MaterialPipelineStage.process = function (
disableTextures
);
} else {
if (defined(material.specular)) {
processSpecularUniforms(
material,
uniformMap,
shaderBuilder,
defaultTexture,
disableTextures
);
}
processMetallicRoughnessUniforms(
material,
uniformMap,
Expand Down Expand Up @@ -245,7 +257,13 @@ function processMaterialUniforms(
defaultEmissiveTexture,
disableTextures
) {
const emissiveFactor = material.emissiveFactor;
const {
emissiveFactor,
emissiveTexture,
normalTexture,
occlusionTexture,
} = material;

if (
defined(emissiveFactor) &&
!Cartesian3.equals(emissiveFactor, Material.DEFAULT_EMISSIVE_FACTOR)
Expand All @@ -264,7 +282,6 @@ function processMaterialUniforms(
ShaderDestination.FRAGMENT
);

const emissiveTexture = material.emissiveTexture;
if (defined(emissiveTexture) && !disableTextures) {
processTexture(
shaderBuilder,
Expand All @@ -277,7 +294,6 @@ function processMaterialUniforms(
}
}

const normalTexture = material.normalTexture;
if (defined(normalTexture) && !disableTextures) {
processTexture(
shaderBuilder,
Expand All @@ -289,7 +305,6 @@ function processMaterialUniforms(
);
}

const occlusionTexture = material.occlusionTexture;
if (defined(occlusionTexture) && !disableTextures) {
processTexture(
shaderBuilder,
Expand All @@ -309,14 +324,21 @@ function processSpecularGlossinessUniforms(
defaultTexture,
disableTextures
) {
const specularGlossiness = material.specularGlossiness;
const { specularGlossiness } = material;
const {
diffuseTexture,
diffuseFactor,
specularGlossinessTexture,
specularFactor,
glossinessFactor,
} = specularGlossiness;

shaderBuilder.addDefine(
"USE_SPECULAR_GLOSSINESS",
undefined,
ShaderDestination.FRAGMENT
);

const diffuseTexture = specularGlossiness.diffuseTexture;
if (defined(diffuseTexture) && !disableTextures) {
processTexture(
shaderBuilder,
Expand All @@ -328,7 +350,6 @@ function processSpecularGlossinessUniforms(
);
}

const diffuseFactor = specularGlossiness.diffuseFactor;
if (
defined(diffuseFactor) &&
!Cartesian4.equals(diffuseFactor, SpecularGlossiness.DEFAULT_DIFFUSE_FACTOR)
Expand All @@ -348,8 +369,6 @@ function processSpecularGlossinessUniforms(
);
}

const specularGlossinessTexture =
specularGlossiness.specularGlossinessTexture;
if (defined(specularGlossinessTexture) && !disableTextures) {
processTexture(
shaderBuilder,
Expand All @@ -361,7 +380,6 @@ function processSpecularGlossinessUniforms(
);
}

const specularFactor = specularGlossiness.specularFactor;
if (
defined(specularFactor) &&
!Cartesian3.equals(
Expand All @@ -384,7 +402,6 @@ function processSpecularGlossinessUniforms(
);
}

const glossinessFactor = specularGlossiness.glossinessFactor;
if (
defined(glossinessFactor) &&
glossinessFactor !== SpecularGlossiness.DEFAULT_GLOSSINESS_FACTOR
Expand All @@ -405,6 +422,91 @@ function processSpecularGlossinessUniforms(
}
}

function processSpecularUniforms(
material,
uniformMap,
shaderBuilder,
defaultTexture,
disableTextures
) {
const { specular } = material;
const {
specularTexture,
specularFactor,
specularColorTexture,
specularColorFactor,
} = specular;

shaderBuilder.addDefine(
"USE_SPECULAR",
undefined,
ShaderDestination.FRAGMENT
);

if (defined(specularTexture) && !disableTextures) {
processTexture(
shaderBuilder,
uniformMap,
specularTexture,
"u_specularTexture",
"SPECULAR",
defaultTexture
);
}

if (
defined(specularFactor) &&
specularFactor !== Specular.DEFAULT_SPECULAR_FACTOR
) {
shaderBuilder.addUniform(
"float",
"u_specularFactor",
ShaderDestination.FRAGMENT
);
uniformMap.u_specularFactor = function () {
return specular.specularFactor;
};
shaderBuilder.addDefine(
"HAS_SPECULAR_FACTOR",
undefined,
ShaderDestination.FRAGMENT
);
}

if (defined(specularColorTexture) && !disableTextures) {
processTexture(
shaderBuilder,
uniformMap,
specularColorTexture,
"u_specularColorTexture",
"SPECULAR_COLOR",
defaultTexture
);
}

if (
defined(specularColorFactor) &&
!Cartesian3.equals(
specularColorFactor,
Specular.DEFAULT_SPECULAR_COLOR_FACTOR
)
) {
shaderBuilder.addUniform(
"vec3",
"u_specularColorFactor",
ShaderDestination.FRAGMENT
);
uniformMap.u_specularColorFactor = function () {
return specular.specularColorFactor;
};
shaderBuilder.addDefine(
"HAS_SPECULAR_COLOR_FACTOR",
undefined,
ShaderDestination.FRAGMENT
);
}
}

function processMetallicRoughnessUniforms(
material,
uniformMap,
Expand Down

0 comments on commit 5914113

Please sign in to comment.