I'm loading a model in three,js using GLTFLoader. It works fine, except I'm trying to use flat shading. If I set flatShading = true, I get an error saying that the fragment shader is not compiled. Here is the code I'm using to load the model:
function loadModel() {
// Load the model
gltfLoader.load(modelPath + '.gltf', function (gltf) {
for (let i = 0; i < gltf.scene.children.length; i++) {
// Skip bones
if (gltf.scene.children[i].isBone) {
continue;
}
// If a mesh has multiple segments, then it is a group with an array of children (segments/meshes)
// If a mesh only has one segment, then it is a single object (mesh) with no children, not an array of length 1
let numSegments = gltf.scene.children[i].isGroup ? gltf.scene.children[i].children.length : 1;
for (let j = 0; j < numSegments; j++) {
let mesh = gltf.scene.children[i].isGroup ? gltf.scene.children[i].children[j] : gltf.scene.children[i];
mesh.material.flatShading = true;
//mesh.material.needsUpdate = true;
}
}
// Show the model
scene.add(gltf.scene);
}, undefined, function (error) {
console.log(error);
}
);
}
If I omit the flatShading line, the model loads fine. However, with the flatShaing included, I get the following error message:
THREE.WebGLProgram: Shader Error 0 - VALIDATE_STATUS false
Program Info Log: Fragment shader is not compiled.
FRAGMENT
ERROR: 0:1233: 'vTBN' : undeclared identifier
1228: normal = normalize( normalMatrix * normal );
1229: #elif defined( TANGENTSPACE_NORMALMAP )
1230: vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;
1231: mapN.xy *= normalScale;
1232: #ifdef USE_TANGENT
> 1233: normal = normalize( vTBN * mapN );
1234: #else
1235: normal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );
1236: #endif
1237: #elif defined( USE_BUMPMAP )
1238: normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );
1239: #endif
I am using revision 143.
I'm a noob at 3D modeling, so I don't really understand what this error means. If anyone has any suggestions on how to fix this, it would be greatly appreciated.
What you see is a bug in older versions of
three.js. When flat shading is enabled and geometry tangents are present, there is a shader compilation error.It has been fixed since
r154.If you can't upgrade your
three.jsversion, traverse through the scene and remove alltangentbuffer attributes from the geometries via the following line when using flat shading: