From e2599f926d086016571d2b872d17e1293dac866c Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Mon, 2 Feb 2026 13:32:38 -0800 Subject: [PATCH] Trim trailing whitespace and ensure text files are POSIX compliant --- .editorconfig | 9 + .reuse/dep5 | 292 +++++++++--------- Models/AnimatedCube/glTF/AnimatedCube.gltf | 2 +- Models/AnimatedMorphCube/README.body.md | 4 +- .../glTF-Quantized/AnimatedMorphCube.gltf | 2 +- .../glTF/AnimatedMorphCube.gltf | 2 +- Models/AnimatedTriangle/README.body.md | 2 +- Models/AnimationPointerUVs/README.body.md | 6 +- Models/AnisotropyBarnLamp/README.body.md | 30 +- .../glTF-KTX-BasisU/AnisotropyBarnLamp.gltf | 2 +- .../glTF/AnisotropyBarnLamp.gltf | 2 +- Models/AnisotropyStrengthTest/README.body.md | 1 - .../glTF/AnisotropyStrengthTest.gltf | 2 +- Models/AntiqueCamera/README.body.md | 2 +- Models/AttenuationTest/README.body.md | 2 +- Models/Avocado/README.body.md | 2 +- Models/Avocado/glTF-Quantized/Avocado.gltf | 2 +- Models/Avocado/glTF/Avocado.gltf | 2 +- Models/BarramundiFish/README.body.md | 2 +- .../BarramundiFish/glTF/BarramundiFish.gltf | 2 +- Models/BoomBox/README.body.md | 2 +- Models/BoomBox/glTF/BoomBox.gltf | 2 +- Models/BoomBoxWithAxes/README.body.md | 2 +- .../BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf | 2 +- Models/Box/README.body.md | 2 +- Models/BoxAnimated/README.body.md | 2 +- Models/BoxInterleaved/README.body.md | 2 +- Models/BoxTextured/README.body.md | 2 +- Models/BoxVertexColors/README.body.md | 2 +- .../glTF-Embedded/BoxVertexColors.gltf | 2 +- .../BoxVertexColors/glTF/BoxVertexColors.gltf | 2 +- Models/BoxVertexColors/metadata.json | 2 +- Models/BrainStem/README.body.md | 2 +- Models/Cameras/README.body.md | 1 - Models/Cameras/glTF-Embedded/Cameras.gltf | 6 +- Models/Cameras/glTF/Cameras.gltf | 6 +- Models/CarConcept/glTF-JPG/CarConcept.gltf | 2 +- Models/CarConcept/glTF-WEBP/CarConcept.gltf | 2 +- Models/CarConcept/glTF/CarConcept.gltf | 2 +- Models/CarbonFibre/README.body.md | 4 +- Models/CarbonFibre/glTF/CarbonFibre.gltf | 2 +- Models/CesiumMan/README.body.md | 2 +- Models/CesiumMan/glTF/CesiumMan.gltf | 2 +- Models/CesiumMilkTruck/README.body.md | 2 +- Models/ChairDamaskPurplegold/README.body.md | 8 +- .../glTF/ChairDamaskPurplegold.gltf | 2 +- Models/ChronographWatch/README.body.md | 38 +-- .../glTF-KTX-BasisU/ChronographWatch.gltf | 2 +- .../glTF-WEBP/ChronographWatch.gltf | 2 +- .../glTF/ChronographWatch.gltf | 2 +- Models/ClearCoatCarPaint/README.body.md | 7 +- .../glTF/ClearCoatCarPaint.gltf | 2 +- Models/ClearCoatCarPaint/metadata.json | 2 +- Models/ClearCoatTest/README.body.md | 2 +- Models/ClearCoatTest/glTF/ClearCoatTest.gltf | 2 +- Models/ClearcoatWicker/README.body.md | 3 +- .../ClearcoatWicker/glTF/ClearcoatWicker.gltf | 2 +- Models/CommercialRefrigerator/README.body.md | 80 ++--- Models/CompareAlphaCoverage/README.body.md | 2 +- .../glTF/CompareAlphaCoverage.gltf | 2 +- Models/CompareAmbientOcclusion/README.body.md | 2 +- .../glTF/CompareAmbientOcclusion.gltf | 2 +- Models/CompareAnisotropy/README.body.md | 2 +- .../glTF/CompareAnisotropy.gltf | 2 +- Models/CompareBaseColor/README.body.md | 2 +- .../glTF/CompareBaseColor.gltf | 2 +- Models/CompareClearcoat/README.body.md | 2 +- .../glTF/CompareClearcoat.gltf | 2 +- Models/CompareDispersion/README.body.md | 2 +- .../glTF/CompareDispersion.gltf | 2 +- Models/CompareEmissiveStrength/README.body.md | 2 +- .../glTF/CompareEmissiveStrength.gltf | 2 +- Models/CompareIor/README.body.md | 2 +- Models/CompareIor/glTF/CompareIor.gltf | 2 +- Models/CompareIridescence/README.body.md | 2 +- .../glTF/CompareIridescence.gltf | 2 +- Models/CompareMetallic/README.body.md | 2 +- .../CompareMetallic/glTF/CompareMetallic.gltf | 2 +- Models/CompareNormal/README.body.md | 2 +- Models/CompareNormal/glTF/CompareNormal.gltf | 2 +- Models/CompareRoughness/README.body.md | 2 +- .../glTF/CompareRoughness.gltf | 2 +- Models/CompareSheen/README.body.md | 2 +- Models/CompareSheen/glTF/CompareSheen.gltf | 2 +- Models/CompareSpecular/README.body.md | 2 +- .../CompareSpecular/glTF/CompareSpecular.gltf | 2 +- Models/CompareTransmission/README.body.md | 2 +- .../glTF/CompareTransmission.gltf | 2 +- Models/CompareVolume/README.body.md | 2 +- Models/Corset/README.body.md | 2 +- Models/Corset/glTF/Corset.gltf | 2 +- Models/Cube/README.body.md | 2 +- Models/DamagedHelmet/README.body.md | 2 +- .../DiffuseTransmissionPlant/README.body.md | 12 +- .../glTF/DiffuseTransmissionPlant.gltf | 2 +- .../DiffuseTransmissionTeacup/README.body.md | 4 +- Models/DiffuseTransmissionTest/README.body.md | 5 +- .../glTF/DirectionalLight.gltf | 8 +- Models/Duck/README.body.md | 2 +- Models/Duck/glTF-Quantized/Duck.gltf | 102 +++--- Models/EmissiveStrengthTest/README.body.md | 2 +- Models/EnvironmentTest/README.body.md | 2 +- .../glTF-IBL/EnvironmentTest.gltf | 2 +- .../EnvironmentTest/glTF/EnvironmentTest.gltf | 2 +- Models/FlightHelmet/README.body.md | 2 +- Models/Fox/README.body.md | 2 +- Models/GlamVelvetSofa/README.body.md | 16 +- .../GlamVelvetSofa/glTF/GlamVelvetSofa.gltf | 2 +- Models/GlassBrokenWindow/README.body.md | 6 +- .../glTF/GlassBrokenWindow.gltf | 2 +- .../GlassHurricaneCandleHolder/README.body.md | 4 +- .../glTF/GlassHurricaneCandleHolder.gltf | 2 +- Models/GlassVaseFlowers/README.body.md | 6 +- .../glTF/GlassVaseFlowers.gltf | 2 +- Models/IORTestGrid/README.body.md | 2 +- Models/IORTestGrid/glTF/IORTestGrid.gltf | 2 +- Models/InterpolationTest/README.body.md | 2 +- .../glTF/InterpolationTest.gltf | 2 +- Models/IridescenceAbalone/README.body.md | 8 +- .../glTF/IridescenceAbalone.gltf | 2 +- .../README.body.md | 2 +- .../glTF/IridescenceDielectricSpheres.gltf | 2 +- Models/IridescenceLamp/README.body.md | 6 +- .../IridescenceLamp/glTF/IridescenceLamp.gltf | 2 +- .../IridescenceMetallicSpheres/README.body.md | 2 +- .../glTF/IridescenceMetallicSpheres.gltf | 2 +- Models/IridescenceSuzanne/README.body.md | 2 +- .../IridescentDishWithOlives/README.body.md | 10 +- .../glTF/IridescentDishWithOlives.gltf | 2 +- Models/Lantern/README.body.md | 2 +- Models/Lantern/glTF-Quantized/Lantern.gltf | 2 +- Models/Lantern/glTF/Lantern.gltf | 2 +- Models/LightsPunctualLamp/README.body.md | 2 +- Models/MandarinOrange/README.body.md | 3 +- Models/MaterialsVariantsShoe/README.body.md | 1 - Models/MetalRoughSpheres/README.body.md | 2 +- .../glTF/MetalRoughSpheresNoTextures.gltf | 2 +- Models/MorphPrimitivesTest/README.body.md | 2 - Models/MorphStressTest/README.body.md | 1 - Models/MosquitoInAmber/README.body.md | 1 - .../glTF-Embedded/MultiUVTest.gltf | 262 ++++++++-------- Models/MultiUVTest/glTF/MultiUVTest.gltf | 262 ++++++++-------- Models/MultipleScenes/README.body.md | 8 +- .../glTF-Embedded/MultipleScenes.gltf | 6 +- .../MultipleScenes/glTF/MultipleScenes.gltf | 6 +- Models/MultipleScenes/metadata.json | 2 +- .../glTF/NormalTangentMirrorTest.gltf | 196 ++++++------ Models/NormalTangentTest/README.body.md | 1 - Models/OrientationTest/README.body.md | 1 - Models/PotOfCoals/README.body.md | 2 +- Models/PotOfCoals/glTF/PotOfCoals.gltf | 2 +- .../PotOfCoalsAnimationPointer/README.body.md | 2 +- .../PrimitiveModeNormalsTest/README.body.md | 1 - .../glTF/PrimitiveModeNormalsTest.gltf | 2 +- .../glTF/RecursiveSkeletons.gltf | 2 +- Models/SheenChair/README.body.md | 6 +- Models/SheenCloth/glTF/SheenCloth.gltf | 2 +- Models/SheenTestGrid/README.body.md | 6 +- Models/SheenWoodLeatherSofa/README.body.md | 10 +- .../glTF/SheenWoodLeatherSofa.gltf | 2 +- Models/SimpleInstancing/README.body.md | 3 +- .../glTF/SimpleInstancing.gltf | 2 +- Models/SimpleMeshes/README.body.md | 8 +- .../glTF-Embedded/SimpleMeshes.gltf | 5 +- Models/SimpleMeshes/glTF/SimpleMeshes.gltf | 4 +- Models/SimpleMorph/README.body.md | 2 - .../glTF-Embedded/SimpleMorph.gltf | 8 +- Models/SimpleSkin/README.body.md | 1 - .../SimpleSkin/glTF-Embedded/SimpleSkin.gltf | 14 +- Models/SimpleSparseAccessor/README.body.md | 1 - .../glTF-Embedded/SimpleSparseAccessor.gltf | 14 +- Models/SimpleTexture/README.body.md | 1 - .../glTF-Embedded/SimpleTexture.gltf | 2 +- Models/SimpleTexture/glTF/SimpleTexture.gltf | 2 +- Models/SpecularSilkPouf/README.body.md | 6 +- .../glTF/SpecularSilkPouf.gltf | 2 +- Models/SpecularTest/README.body.md | 1 - Models/StainedGlassLamp/README.body.md | 24 +- .../glTF-JPG-PNG/StainedGlassLamp.gltf | 2 +- .../glTF-KTX-BasisU/StainedGlassLamp.gltf | 2 +- .../glTF/StainedGlassLamp.gltf | 2 +- Models/SunglassesKhronos/README.body.md | 36 +-- .../glTF/SunglassesKhronos.gltf | 2 +- Models/Suzanne/README.body.md | 1 - Models/TextureCoordinateTest/README.body.md | 1 - Models/TextureEncodingTest/README.body.md | 1 - .../glTF/TextureEncodingTest.gltf | 2 +- .../README.body.md | 1 - .../glTF/TextureLinearInterpolationTest.gltf | 2 +- Models/TextureSettingsTest/README.body.md | 1 - .../TextureTransformMultiTest/README.body.md | 1 - .../glTF/TextureTransformMultiTest.gltf | 2 +- Models/TextureTransformTest/README.body.md | 1 - .../glTF/TextureTransformTest.gltf | 2 +- Models/ToyCar/README.body.md | 1 - Models/ToyCar/glTF/ToyCar.gltf | 2 +- .../TransmissionRoughnessTest/README.body.md | 1 - Models/TransmissionTest/README.body.md | 1 - .../glTF/TransmissionTest.gltf | 2 +- .../README.body.md | 2 +- Models/Triangle/glTF-Embedded/Triangle.gltf | 6 +- Models/Triangle/glTF/Triangle.gltf | 6 +- Models/TriangleWithoutIndices/README.body.md | 2 +- .../glTF-Embedded/TriangleWithoutIndices.gltf | 6 +- .../glTF/TriangleWithoutIndices.gltf | 4 +- .../Unicode\342\235\244\342\231\273Test.gltf" | 2 +- Models/UnlitTest/README.body.md | 1 - Models/VertexColorTest/README.body.md | 1 - Models/WaterBottle/glTF/WaterBottle.gltf | 2 +- Models/glTF_RGB_June16.svg | 6 +- README.md | 2 +- SubmittingModels.md | 14 +- util/CreateJson.html | 24 +- util/run.bash | 8 +- 214 files changed, 956 insertions(+), 983 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..bc813001 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +# Top-most EditorConfig file. +root = true + +# Unix-style newlines with a newline ending every file. +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_size = 4 diff --git a/.reuse/dep5 b/.reuse/dep5 index 897f3669..f8ef4d8a 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -10,171 +10,171 @@ Copyright: 2017-2023 Khronos Group License: CC-BY-4.0 Files: Models/ABeautifulGame/* -Copyright: +Copyright: 2020 ASWF 2022 Ed Mackey License: CC-BY-4.0 Files: Models/AlphaBlendModeTest/* -Copyright: +Copyright: 2018 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/AnimatedColorsCube/* -Copyright: +Copyright: 2024 Public License: CC0-1.0 Files: Models/AnimatedCube/* -Copyright: +Copyright: 2017 UX3D License: CC0-1.0 Files: Models/AnimatedMorphCube/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/AnimatedTriangle/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/AnimationPointerUVs/* -Copyright: +Copyright: 2024 Darmstadt Graphics Group GmbH License: CC-BY-4.0 Files: Models/AnisotropyBarnLamp/* -Copyright: +Copyright: 2023 Copyright 2023 Wayfair, LLC License: CC-BY-4.0 Files: Models/AnisotropyDiscTest/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/AnisotropyRotationTest/* -Copyright: +Copyright: 2023 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/AnisotropyStrengthTest/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/AntiqueCamera/* -Copyright: +Copyright: 2018 UX3D 2017 UX3D License: CC0-1.0 AND LicenseRef-LegalMark-UX3D Files: Models/AttenuationTest/* -Copyright: +Copyright: 2021 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/Avocado/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/BarramundiFish/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/BoomBox/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/BoomBoxWithAxes/* -Copyright: +Copyright: 2018 Public License: CC0-1.0 Files: Models/Box/* -Copyright: +Copyright: 2017 Cesium License: CC-BY-4.0 Files: Models/Box With Spaces/* -Copyright: +Copyright: 2017 Analytical Graphics, Inc. 2017 Khronos Group License: CC0-1.0 AND LicenseRef-LegalMark-Khronos Files: Models/BoxAnimated/* -Copyright: +Copyright: 2017 Cesium License: CC-BY-4.0 Files: Models/BoxInterleaved/* -Copyright: +Copyright: 2017 Cesium License: CC-BY-4.0 Files: Models/BoxTextured/* -Copyright: +Copyright: 2017 Cesium 2015 Cesium License: LicenseRef-CC-BY-TM AND LicenseRef-LegalMark-Cesium Files: Models/BoxTexturedNonPowerOfTwo/* -Copyright: +Copyright: 2017 Cesium 2015 Cesium License: LicenseRef-CC-BY-TM AND LicenseRef-LegalMark-Cesium Files: Models/BoxVertexColors/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/BrainStem/* -Copyright: +Copyright: 2017 Smith Micro Software, Inc. License: LicenseRef-Poser-EULA Files: Models/Cameras/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/CarConcept/* -Copyright: +Copyright: 2024 Darmstadt Graphics Group GmbH 2015 Khronos Group 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/CarbonFibre/* -Copyright: +Copyright: 2023 Wayfair License: CC-BY-4.0 Files: Models/CesiumMan/* -Copyright: +Copyright: 2017 Cesium 2015 Cesium License: LicenseRef-CC-BY-TM AND LicenseRef-LegalMark-Cesium Files: Models/CesiumMilkTruck/* -Copyright: +Copyright: 2017 Cesium 2015 Cesium License: LicenseRef-CC-BY-TM AND LicenseRef-LegalMark-Cesium Files: Models/ChairDamaskPurplegold/* -Copyright: +Copyright: 2021 Wayfair License: CC-BY-4.0 Files: Models/ChronographWatch/* -Copyright: +Copyright: 2025 Darmstadt Graphics Group GmbH 2015 Khronos Group 2017 Khronos Group @@ -182,307 +182,307 @@ Copyright: License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos AND LicenseRef-LegalMark-DGG Files: Models/ClearCoatCarPaint/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/ClearCoatTest/* -Copyright: +Copyright: 2020 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/ClearcoatWicker/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/CommercialRefrigerator/* -Copyright: +Copyright: 2025 Darmstadt Graphics Group GmbH 2025 Sean Thomas License: CC-BY-4.0 Files: Models/CompareAlphaCoverage/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareAmbientOcclusion/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareAnisotropy/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareBaseColor/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareClearcoat/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareDispersion/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareEmissiveStrength/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareIor/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareIridescence/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareMetallic/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareNormal/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareRoughness/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareSheen/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareSpecular/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareTransmission/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/CompareVolume/* -Copyright: +Copyright: 2017 Khronos Group 2024 Public License: LicenseRef-LegalMark-Khronos AND CC0-1.0 Files: Models/Corset/* -Copyright: +Copyright: 2017 UX3D License: CC0-1.0 Files: Models/Cube/* -Copyright: +Copyright: 2017 UX3D License: CC0-1.0 Files: Models/CubeVisibility/* -Copyright: +Copyright: 2025 Khronos Group License: CC0-1.0 Files: Models/DamagedHelmet/* -Copyright: +Copyright: 2018 ctxwing 2016 theblueturtle_ License: CC-BY-4.0 AND CC-BY-NC-4.0 Files: Models/DiffuseTransmissionPlant/* -Copyright: +Copyright: 2024 Darmstadt Graphics Group GmbH 2021 Public domain License: CC-BY-4.0 AND CC0-1.0 Files: Models/DiffuseTransmissionTeacup/* -Copyright: +Copyright: 2023 Public domain License: CC0-1.0 Files: Models/DiffuseTransmissionTest/* -Copyright: +Copyright: 2025 Darmstadt Graphics Group GmbH 2015 Khronos Group 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/DirectionalLight/* -Copyright: +Copyright: 2020 Public License: CC0-1.0 Files: Models/DispersionTest/* -Copyright: +Copyright: 2023 AGI License: CC-BY-4.0 Files: Models/DragonAttenuation/* -Copyright: +Copyright: 1996 Stanford University Computer Graphics Laboratory 2017 Morgan McGuire 2021 Public License: LicenseRef-Stanford-Graphics AND CC0-1.0 Files: Models/DragonDispersion/* -Copyright: +Copyright: 1996 Stanford University Computer Graphics Laboratory 2017 Morgan McGuire 2021 Public License: LicenseRef-Stanford-Graphics AND CC0-1.0 Files: Models/Duck/* -Copyright: +Copyright: 2006 Sony License: SCEA Files: Models/EmissiveStrengthTest/* -Copyright: +Copyright: 2022 AGI License: CC-BY-4.0 Files: Models/EnvironmentTest/* -Copyright: +Copyright: 2017 Adobe License: LicenseRef-Adobe-Stock Files: Models/FlightHelmet/* -Copyright: +Copyright: 2018 Public License: CC0-1.0 Files: Models/Fox/* -Copyright: +Copyright: 2014 Public 2014 tomkranis 2017 @AsoboStudio and @scurest License: CC0-1.0 AND CC-BY-4.0 Files: Models/GlamVelvetSofa/* -Copyright: +Copyright: 2021 Wayfair, LLC License: CC-BY-4.0 Files: Models/GlassBrokenWindow/* -Copyright: +Copyright: 2023 Wayfair License: CC-BY-4.0 Files: Models/GlassHurricaneCandleHolder/* -Copyright: +Copyright: 2021 Wayfair, LLC 2015 Khronos Group 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/GlassVaseFlowers/* -Copyright: +Copyright: 2023 Public 2023 Public License: CC0-1.0 Files: Models/IORTestGrid/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/InterpolationTest/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/IridescenceAbalone/* -Copyright: +Copyright: 2015 Abby Crawford 2023 Eric Chadwick License: CC-BY-4.0 Files: Models/IridescenceDielectricSpheres/* -Copyright: +Copyright: 2019 Public License: CC0-1.0 Files: Models/IridescenceLamp/* -Copyright: +Copyright: 2022 Wayfair, LLC License: CC-BY-4.0 Files: Models/IridescenceMetallicSpheres/* -Copyright: +Copyright: 2022 UX3D License: CC0-1.0 Files: Models/IridescenceSuzanne/* -Copyright: +Copyright: 2022 UX3D 2021 Pascal Schoen License: CC0-1.0 Files: Models/IridescentDishWithOlives/* -Copyright: +Copyright: 2020 Wayfair, LLC License: CC-BY-4.0 Files: Models/Lantern/* -Copyright: +Copyright: 2017 Microsoft 2018 Frank Galligan License: CC0-1.0 Files: Models/LightVisibility/* -Copyright: +Copyright: 2025 Khronos Group License: CC0-1.0 Files: Models/LightsPunctualLamp/* -Copyright: +Copyright: 2021 DGG License: CC-BY-4.0 Files: Models/MandarinOrange/* -Copyright: +Copyright: 2015 zamdreamer 2023 Wayfair License: CC-BY-4.0 Files: Models/MaterialsVariantsShoe/* -Copyright: +Copyright: 2021 Shopify License: CC-BY-4.0 Files: Models/MeshPrimitiveModes/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 @@ -492,316 +492,316 @@ Copyright: License: CC0-1.0 Files: Models/MetalRoughSpheres/* -Copyright: +Copyright: 2017 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/MetalRoughSpheresNoTextures/* -Copyright: +Copyright: 2019 Public 2019 Public License: CC0-1.0 Files: Models/MorphPrimitivesTest/* -Copyright: +Copyright: 2018 ft-lab 2020 Frank Galligan License: CC-BY-4.0 Files: Models/MorphStressTest/* -Copyright: +Copyright: 2021 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/MosquitoInAmber/* -Copyright: +Copyright: 2018 Sketchfab 2019 Sketchfab License: CC-BY-4.0 Files: Models/MultiUVTest/* -Copyright: +Copyright: 2017 Hilo 3D 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/MultipleScenes/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/NegativeScaleTest/* -Copyright: +Copyright: 2023 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/NodePerformanceTest/* -Copyright: +Copyright: 2024 Public License: CC0-1.0 Files: Models/NormalTangentMirrorTest/* -Copyright: +Copyright: 2018 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/NormalTangentTest/* -Copyright: +Copyright: 2018 Analytical Graphics, Inc. License: CC0-1.0 Files: Models/OrientationTest/* -Copyright: +Copyright: 2017 Unknown License: CC-BY-4.0 Files: Models/PlaysetLightTest/* -Copyright: +Copyright: 2024 Inter IKEA Systems B.V. License: CC BY-NC-SA 4.0 Files: Models/PointLightIntensityTest/* -Copyright: +Copyright: 2025 Public License: CC0-1.0 Files: Models/PotOfCoals/* -Copyright: +Copyright: 2023 Darmstadt Graphics Group GmbH 2015 Khronos Group 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/PotOfCoalsAnimationPointer/* -Copyright: +Copyright: 2024 Darmstadt Graphics Group GmbH 2015 Khronos Group 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/PrimitiveModeNormalsTest/* -Copyright: +Copyright: 2020 public License: CC0-1.0 Files: Models/RecursiveSkeletons/* -Copyright: +Copyright: 2017 Cesium License: CC-BY-4.0 Files: Models/RiggedFigure/* -Copyright: +Copyright: 2017 Cesium License: CC-BY-4.0 Files: Models/RiggedSimple/* -Copyright: +Copyright: 2017 Cesium License: CC-BY-4.0 Files: Models/ScatteringSkull/* -Copyright: +Copyright: 2025 Public License: CC0-1.0 Files: Models/SciFiHelmet/* -Copyright: +Copyright: 2017 Public 2017 Public License: CC0-1.0 Files: Models/SheenChair/* -Copyright: +Copyright: 2020 Wayfair, LLC License: CC0-1.0 Files: Models/SheenCloth/* -Copyright: +Copyright: 2020 Microsoft License: CC0-1.0 Files: Models/SheenTestGrid/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/SheenWoodLeatherSofa/* -Copyright: +Copyright: 2024 Darmstadt Graphics Group GmbH 2021 Public domain License: CC-BY-4.0 AND CC0-1.0 Files: Models/SimpleInstancing/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/SimpleMaterial/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/SimpleMeshes/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/SimpleMorph/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/SimpleSkin/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/SimpleSparseAccessor/* -Copyright: +Copyright: 2017 Public License: CC-BY-4.0 Files: Models/SimpleTexture/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/SpecGlossVsMetalRough/* -Copyright: +Copyright: 2017 Microsoft License: CC-BY-4.0 Files: Models/SpecularSilkPouf/* -Copyright: +Copyright: 2023 Copyright 2023 Wayfair, LLC License: CC-BY-4.0 Files: Models/SpecularTest/* -Copyright: +Copyright: 2021 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/Sponza/* -Copyright: +Copyright: 2016 Crytek License: LicenseRef-CRYENGINE-Agreement Files: Models/StainedGlassLamp/* -Copyright: +Copyright: 2021 Wayfair License: CC-BY-4.0 Files: Models/SunglassesKhronos/* -Copyright: +Copyright: 2024 Darmstadt Graphics Group GmbH 2015 Khronos Group 2017 Khronos Group License: CC-BY-4.0 AND LicenseRef-LegalMark-Khronos Files: Models/Suzanne/* -Copyright: +Copyright: 2017 UX3D License: CC0-1.0 Files: Models/TextureCoordinateTest/* -Copyright: +Copyright: 2017 Analytical Graphics, Inc. License: CC0-1.0 Files: Models/TextureEncodingTest/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/TextureLinearInterpolationTest/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/TextureSettingsTest/* -Copyright: +Copyright: 2017 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/TextureTransformMultiTest/* -Copyright: +Copyright: 2020 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/TextureTransformTest/* -Copyright: +Copyright: 2018 Microsoft License: CC0-1.0 Files: Models/ToyCar/* -Copyright: +Copyright: 2020 Public 2020 Public License: CC0-1.0 Files: Models/TransmissionOrderTest/* -Copyright: +Copyright: 2025 Public 2021 Public License: CC0-1.0 Files: Models/TransmissionRoughnessTest/* -Copyright: +Copyright: 2021 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/TransmissionTest/* -Copyright: +Copyright: 2020 Public License: CC0-1.0 Files: Models/TransmissionThinwallTestGrid/* -Copyright: +Copyright: 2023 Public License: CC0-1.0 Files: Models/Triangle/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/TriangleWithoutIndices/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/TwoSidedPlane/* -Copyright: +Copyright: 2017 UX3D License: CC0-1.0 Files: Models/Unicode❤♻Test/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/UnlitTest/* -Copyright: +Copyright: 2019 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/VertexColorTest/* -Copyright: +Copyright: 2018 Analytical Graphics, Inc. License: CC-BY-4.0 Files: Models/VirtualCity/* -Copyright: +Copyright: 2017 3DRT License: LicenseRef-3DRT-Testing Files: Models/WaterBottle/* -Copyright: +Copyright: 2017 Public License: CC0-1.0 Files: Models/XmpMetadataRoundedCube/* -Copyright: +Copyright: 2021 Adam Morris License: CC-BY-4.0 diff --git a/Models/AnimatedCube/glTF/AnimatedCube.gltf b/Models/AnimatedCube/glTF/AnimatedCube.gltf index 5490e6b1..29cd6776 100644 --- a/Models/AnimatedCube/glTF/AnimatedCube.gltf +++ b/Models/AnimatedCube/glTF/AnimatedCube.gltf @@ -251,4 +251,4 @@ "source" : 0 } ] -} \ No newline at end of file +} diff --git a/Models/AnimatedMorphCube/README.body.md b/Models/AnimatedMorphCube/README.body.md index b6a21c08..e533f86a 100644 --- a/Models/AnimatedMorphCube/README.body.md +++ b/Models/AnimatedMorphCube/README.body.md @@ -6,7 +6,7 @@ The cube contains two morph targets in it: - * **`thin`** : moves the vertices so that it becomes super-thin + * **`thin`** : moves the vertices so that it becomes super-thin * **`angle`** : moves the vertices so that it forms a ramp -The animation loops, morphing between these two states. \ No newline at end of file +The animation loops, morphing between these two states. diff --git a/Models/AnimatedMorphCube/glTF-Quantized/AnimatedMorphCube.gltf b/Models/AnimatedMorphCube/glTF-Quantized/AnimatedMorphCube.gltf index 870695e3..28aed3f3 100644 --- a/Models/AnimatedMorphCube/glTF-Quantized/AnimatedMorphCube.gltf +++ b/Models/AnimatedMorphCube/glTF-Quantized/AnimatedMorphCube.gltf @@ -256,4 +256,4 @@ } ], "scene":0 -} \ No newline at end of file +} diff --git a/Models/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf b/Models/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf index b1b72014..a7fcaf54 100644 --- a/Models/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf +++ b/Models/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf @@ -279,4 +279,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Models/AnimatedTriangle/README.body.md b/Models/AnimatedTriangle/README.body.md index 632b69cc..62595157 100644 --- a/Models/AnimatedTriangle/README.body.md +++ b/Models/AnimatedTriangle/README.body.md @@ -7,4 +7,4 @@ The following images show the data layout of this sample: ![simpleTriangle](screenshot/simpleTriangle.png) -![animation](screenshot/animation.png) \ No newline at end of file +![animation](screenshot/animation.png) diff --git a/Models/AnimationPointerUVs/README.body.md b/Models/AnimationPointerUVs/README.body.md index 10ce90d9..04c378fa 100644 --- a/Models/AnimationPointerUVs/README.body.md +++ b/Models/AnimationPointerUVs/README.body.md @@ -26,9 +26,9 @@ This model tests UV transform animations with [KHR_animation_pointer](https://gi * `transmissionTexture` from [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_transmission/README.md) * `thicknessTexture` from [KHR_materials_volume](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md) -Each material contains a "control" texture which is not animated, to test that only the desired texture is being animated instead of all textures in the material. +Each material contains a "control" texture which is not animated, to test that only the desired texture is being animated instead of all textures in the material. -Each texture includes a text label for easier verification of which are animated versus static. +Each texture includes a text label for easier verification of which are animated versus static. ![screenshot](screenshot/anisotropyAnimated.gif)
_Animation of KHR_materials_anisotropy_ @@ -37,4 +37,4 @@ A directional light has been added behind the assets to provide back lighting fo Cameras are provided for views of each extension or property type. -The asset was created in 3ds Max 2024, and exported with the [HS glTF Exporter](https://nu1963u.wixsite.com/custom3dsmax/gltfpluginfor3dsmax). Textures were generated with [Filter Forge](https://www.filterforge.com/). \ No newline at end of file +The asset was created in 3ds Max 2024, and exported with the [HS glTF Exporter](https://nu1963u.wixsite.com/custom3dsmax/gltfpluginfor3dsmax). Textures were generated with [Filter Forge](https://www.filterforge.com/). diff --git a/Models/AnisotropyBarnLamp/README.body.md b/Models/AnisotropyBarnLamp/README.body.md index d5487947..49ffed0c 100644 --- a/Models/AnisotropyBarnLamp/README.body.md +++ b/Models/AnisotropyBarnLamp/README.body.md @@ -22,9 +22,9 @@ The asset has three meshes, each using their own materials: 1. The incandescent filament inside the light bulb uses a PBR material with an emissive color and [KHR_materials_emissive_strength](https://github.com/KhronosGroup/gltf/tree/main/extensions/2.0/Khronos/KHR_materials_emissive_strength#khr_materials_emissive_strength) to create high-dynamic range emission. If the renderer supports it, the filament should glow with a bloom effect. -2. The light bulb glass uses [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) for clear glass with reflection and refraction. +2. The light bulb glass uses [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) for clear glass with reflection and refraction. -3. The metal parts have multi-layer surface reflections. The copper is covered with fine grooves which cause anisotropic-stretched reflections, here replicated with [KHR_materials_anisotropy](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy). Some of the copper has oxidized in the corners reducing reflectivity and metalness. The grooves and oxidation are present in the baseColorTexture and in the roughnessTexture, which is in the green channel of the `metallicRoughnessTexture`. The metal parts have additionally been covered in a glossy clearcoat glaze which contributes non-anisotropic reflections, here simulated with [KHR_materials_clearcoat](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat). +3. The metal parts have multi-layer surface reflections. The copper is covered with fine grooves which cause anisotropic-stretched reflections, here replicated with [KHR_materials_anisotropy](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy). Some of the copper has oxidized in the corners reducing reflectivity and metalness. The grooves and oxidation are present in the baseColorTexture and in the roughnessTexture, which is in the green channel of the `metallicRoughnessTexture`. The metal parts have additionally been covered in a glossy clearcoat glaze which contributes non-anisotropic reflections, here simulated with [KHR_materials_clearcoat](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat). ![Textures for the lamp material.](screenshot/anisotropy_Textures.jpg) @@ -37,7 +37,7 @@ The asset has three meshes, each using their own materials: Anisotropy enabled (above left), compared with disabled (above right). -The anisotropy rotation is varied across the model using an `anisotropyTexture`. The red channel and green channel control the rotation relative to the surface tangents, while the blue channel acts as a scalar or mask for the overall anisotropy. Radial gradient sweeps are used to create the radial anisotropy where the metal parts have been brushed in a circular pattern. +The anisotropy rotation is varied across the model using an `anisotropyTexture`. The red channel and green channel control the rotation relative to the surface tangents, while the blue channel acts as a scalar or mask for the overall anisotropy. Radial gradient sweeps are used to create the radial anisotropy where the metal parts have been brushed in a circular pattern. ![Closeups of the anisotropy texture, showing what is in each color channel.](screenshot/anisotropy_Channels.jpg) @@ -51,30 +51,30 @@ The anisotropy rotation is varied across the model using an `anisotropyTexture`. (above) A diagram to show which colors to use in the `anisotropyTexture` to get specific results on different parts of the model. * Ellipses show which colors will stretch reflections in various directions. * Arrows indicate directions of microgrooves or hairs (perpendicular to anisotropy). -* Circle at bottom right is in front of the color to use for zero anisotropy (black in the blue channel). Yellowish green has been used in this area (0.5,1,0); more information on this choice below. +* Circle at bottom right is in front of the color to use for zero anisotropy (black in the blue channel). Yellowish green has been used in this area (0.5,1,0); more information on this choice below. There is a close correlation between the texture coordinates and the `anisotropyRotation`, because surface tangents are calculated from the UVs and the surface normals of the model. This is explained in a video from Babylon.js [Unraveling Advanced Anisotropic Reflections](https://www.youtube.com/watch?v=Zk0A5UzNLNw). ![The anisotropy texture shown on the model, next to a wireframe of the UV texture coordinates](screenshot/anisotropy_TextureCoordinates.jpg) -(above) Texture coordinates for the metal material, displayed with the `anisotropyTexture`. +(above) Texture coordinates for the metal material, displayed with the `anisotropyTexture`. -The parts with vertical UV strips are assigned a pink color to stretch the anisotropy in a horizontal direction (perpendicular to the brushed pattern) while the horizontal UV strips use a cyan color to stretch the anisotropy in a vertical direction. +The parts with vertical UV strips are assigned a pink color to stretch the anisotropy in a horizontal direction (perpendicular to the brushed pattern) while the horizontal UV strips use a cyan color to stretch the anisotropy in a vertical direction. ![Screenshots comparing the effects of removing each color channel, in turn.](screenshot/anisotropy_RemovingChannels.jpg) -(above) The affect of each color channel in the `anisotropyTexture`. Left to right: the full anisotropy texture, filling the red channel with black, filling the green channel with black, filling the blue channel with black. +(above) The affect of each color channel in the `anisotropyTexture`. Left to right: the full anisotropy texture, filling the red channel with black, filling the green channel with black, filling the blue channel with black. -Both the red and green channels are needed for well-shaped anisotropic reflections. The blue channel can be used to disable anisotropy where micro-grooves are not prominent on the surface. +Both the red and green channels are needed for well-shaped anisotropic reflections. The blue channel can be used to disable anisotropy where micro-grooves are not prominent on the surface. When a bump texture is in use with anisotropy, high frequency bump details may need to have anisotropy disabled to achieve better bump lighting results. In this asset, the raised text and knurled grips use black in the blue channel to disable anisotropy. -## Normalizing Anisotropy +## Normalizing Anisotropy -A well-formed `anisotropyTexture` needs to be normalized to ensure proper lighting. Each pixel creates a directional 2D vector whose unit length must be one. Without this, anisotropy is likely to yield incorrect results. +A well-formed `anisotropyTexture` needs to be normalized to ensure proper lighting. Each pixel creates a directional 2D vector whose unit length must be one. Without this, anisotropy is likely to yield incorrect results. -When normalizing an `anisotropyTexture`, the blue channel should be omitted from normalization because it is used for `anisotropyStrength` not rotation. +When normalizing an `anisotropyTexture`, the blue channel should be omitted from normalization because it is used for `anisotropyStrength` not rotation. ![Screenshot of a normalization graph in Substance 3D Designer.](screenshot/anisotropy_NormalizeGraph.jpg) @@ -82,7 +82,7 @@ When normalizing an `anisotropyTexture`, the blue channel should be omitted from This graph can be downloaded as a SBSAR file: [Substance_NormalizeRG.zip](screenshot/Substance_NormalizeRG.zip). This is a Substance 3D Asset which can be used to normalize anisotropy textures with [Adobe Substance Player](https://helpx.adobe.com/substance-3d-player/home.html) and other [applications which support SBSAR](https://helpx.adobe.com/substance-3d-integrations/home.html). -When assigning zero anisotropy to high-frequency details like text, it is best to set the red and green channels of the anisotropy texture to the same color as the surrounding area. This can help avoid normalization artifacts where values produce NaNs from divide-by-zero errors, as shown in the bottom example. +When assigning zero anisotropy to high-frequency details like text, it is best to set the red and green channels of the anisotropy texture to the same color as the surrounding area. This can help avoid normalization artifacts where values produce NaNs from divide-by-zero errors, as shown in the bottom example. Keeping high-frequency values in the blue channel and using homogenous colors in the red and green channels will produce a cleaner texture, which ultimately compresses better and makes a smaller asset size. @@ -93,9 +93,9 @@ Keeping high-frequency values in the blue channel and using homogenous colors in ## KTX2 BasisU Textures -A variant of the asset is provided KTX2 textures using [Basis Universal texture compression](https://github.com/KhronosGroup/KTX-Software). The PNG textures were processed with UASTC compression using `toktx`, then referenced in the glTF using the [KHR_texture_basisu](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu/) extension. +A variant of the asset is provided KTX2 textures using [Basis Universal texture compression](https://github.com/KhronosGroup/KTX-Software). The PNG textures were processed with UASTC compression using `toktx`, then referenced in the glTF using the [KHR_texture_basisu](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu/) extension. -The KTX2 textures end up with smaller file sizes (about half) and crucially with much smaller GPU memory footprint (about one fifth) compared to the PNG textures. With careful attention to compression settings, there is virtually no visual difference between the PNG and KTX2 textures when the models are rendered side-by-side. For more information on compression settings, see the [KTX Artist Guide](https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXArtistGuide.md#ktx-artist-guide). +The KTX2 textures end up with smaller file sizes (about half) and crucially with much smaller GPU memory footprint (about one fifth) compared to the PNG textures. With careful attention to compression settings, there is virtually no visual difference between the PNG and KTX2 textures when the models are rendered side-by-side. For more information on compression settings, see the [KTX Artist Guide](https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXArtistGuide.md#ktx-artist-guide). ``` toktx --t2 --encode uastc --uastc_quality 4 --uastc_rdo_l .25 --uastc_rdo_d 65536 --zcmp 22 --assign_oetf linear --assign_primaries none AnisotropyBarnLamp_anisotropy.ktx2 AnisotropyBarnLamp_anisotropy.png --verbose @@ -110,4 +110,4 @@ toktx --t2 --encode uastc --uastc_quality 4 --uastc_rdo_l .25 --uastc_rdo_d 6553 ## Creation Details -The asset was created using [3ds Max](https://www.autodesk.com/products/3ds-max), exported to glTF using [Max2Babylon](https://github.com/BabylonJS/Exporters#babylonjs-exporters), and materials were edited in [Visual Studio Code](https://code.visualstudio.com/) with [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode#gltf-tools-extension-for-visual-studio-code). \ No newline at end of file +The asset was created using [3ds Max](https://www.autodesk.com/products/3ds-max), exported to glTF using [Max2Babylon](https://github.com/BabylonJS/Exporters#babylonjs-exporters), and materials were edited in [Visual Studio Code](https://code.visualstudio.com/) with [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode#gltf-tools-extension-for-visual-studio-code). diff --git a/Models/AnisotropyBarnLamp/glTF-KTX-BasisU/AnisotropyBarnLamp.gltf b/Models/AnisotropyBarnLamp/glTF-KTX-BasisU/AnisotropyBarnLamp.gltf index 12a2c745..000de5d8 100644 --- a/Models/AnisotropyBarnLamp/glTF-KTX-BasisU/AnisotropyBarnLamp.gltf +++ b/Models/AnisotropyBarnLamp/glTF-KTX-BasisU/AnisotropyBarnLamp.gltf @@ -363,4 +363,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/AnisotropyBarnLamp/glTF/AnisotropyBarnLamp.gltf b/Models/AnisotropyBarnLamp/glTF/AnisotropyBarnLamp.gltf index 3aefa0c9..24e00761 100644 --- a/Models/AnisotropyBarnLamp/glTF/AnisotropyBarnLamp.gltf +++ b/Models/AnisotropyBarnLamp/glTF/AnisotropyBarnLamp.gltf @@ -347,4 +347,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/AnisotropyStrengthTest/README.body.md b/Models/AnisotropyStrengthTest/README.body.md index de2abc55..ef2bd074 100644 --- a/Models/AnisotropyStrengthTest/README.body.md +++ b/Models/AnisotropyStrengthTest/README.body.md @@ -9,4 +9,3 @@ This model tests the strength parameter for [`KHR_materials_anisotropy`](https:/ A grid of spheres compares material roughness (horizontally) to anisotropy strength (vertically). Note the `KHR_materials_anisotropy` specification provides formulas to clearly define how anisotropy strength interacts with material roughness. The effects should be most apparent in the column with zero material roughness, and anisotropy should not offer any effect when material roughness is 1.0. - diff --git a/Models/AnisotropyStrengthTest/glTF/AnisotropyStrengthTest.gltf b/Models/AnisotropyStrengthTest/glTF/AnisotropyStrengthTest.gltf index ab88bd90..5e9f8a15 100644 --- a/Models/AnisotropyStrengthTest/glTF/AnisotropyStrengthTest.gltf +++ b/Models/AnisotropyStrengthTest/glTF/AnisotropyStrengthTest.gltf @@ -1838,4 +1838,4 @@ } ], "scene": 0 -} \ No newline at end of file +} diff --git a/Models/AntiqueCamera/README.body.md b/Models/AntiqueCamera/README.body.md index 3655bf10..0e51e4df 100644 --- a/Models/AntiqueCamera/README.body.md +++ b/Models/AntiqueCamera/README.body.md @@ -4,4 +4,4 @@ ## Description -Static model of old camera on a tripod, with UX3D logo on one of the legs. \ No newline at end of file +Static model of old camera on a tripod, with UX3D logo on one of the legs. diff --git a/Models/AttenuationTest/README.body.md b/Models/AttenuationTest/README.body.md index 1d404bc4..f466c4d4 100644 --- a/Models/AttenuationTest/README.body.md +++ b/Models/AttenuationTest/README.body.md @@ -28,4 +28,4 @@ The "Node Scale" row tests the interaction between thickness and scale. Each cu ### Attenuation Distance -In the final row, "Attenuation Distance", the cubes are a different size from all of the other rows. This row features all unit-size cubes, and the attenuation distance of each cube has been adjusted to be the inverse of the cube's thickness on the other rows. This means that although the size of these cubes may appear different, the shade of blue coloring of each cube should match the coloring of the rest of the column. \ No newline at end of file +In the final row, "Attenuation Distance", the cubes are a different size from all of the other rows. This row features all unit-size cubes, and the attenuation distance of each cube has been adjusted to be the inverse of the cube's thickness on the other rows. This means that although the size of these cubes may appear different, the shade of blue coloring of each cube should match the coloring of the rest of the column. diff --git a/Models/Avocado/README.body.md b/Models/Avocado/README.body.md index eccafe7e..933bfee0 100644 --- a/Models/Avocado/README.body.md +++ b/Models/Avocado/README.body.md @@ -4,4 +4,4 @@ ## Description -A cut avocado showing the pit and flesh, using a hand-painted texture. \ No newline at end of file +A cut avocado showing the pit and flesh, using a hand-painted texture. diff --git a/Models/Avocado/glTF-Quantized/Avocado.gltf b/Models/Avocado/glTF-Quantized/Avocado.gltf index 96f231fe..7baba55e 100644 --- a/Models/Avocado/glTF-Quantized/Avocado.gltf +++ b/Models/Avocado/glTF-Quantized/Avocado.gltf @@ -218,4 +218,4 @@ } ], "scene":0 -} \ No newline at end of file +} diff --git a/Models/Avocado/glTF/Avocado.gltf b/Models/Avocado/glTF/Avocado.gltf index 55fcd955..55821b61 100644 --- a/Models/Avocado/glTF/Avocado.gltf +++ b/Models/Avocado/glTF/Avocado.gltf @@ -152,4 +152,4 @@ "source": 2 } ] -} \ No newline at end of file +} diff --git a/Models/BarramundiFish/README.body.md b/Models/BarramundiFish/README.body.md index 040998f7..d0ae4bca 100644 --- a/Models/BarramundiFish/README.body.md +++ b/Models/BarramundiFish/README.body.md @@ -4,4 +4,4 @@ ## Description -A fish created with Core glTF 2.0. \ No newline at end of file +A fish created with Core glTF 2.0. diff --git a/Models/BarramundiFish/glTF/BarramundiFish.gltf b/Models/BarramundiFish/glTF/BarramundiFish.gltf index 1fd5708f..a4400ed0 100644 --- a/Models/BarramundiFish/glTF/BarramundiFish.gltf +++ b/Models/BarramundiFish/glTF/BarramundiFish.gltf @@ -155,4 +155,4 @@ "source": 2 } ] -} \ No newline at end of file +} diff --git a/Models/BoomBox/README.body.md b/Models/BoomBox/README.body.md index 448ffcf9..7a6d2587 100644 --- a/Models/BoomBox/README.body.md +++ b/Models/BoomBox/README.body.md @@ -4,4 +4,4 @@ ## Description -A portable radio with glowing front panel created with Core glTF 2.0. \ No newline at end of file +A portable radio with glowing front panel created with Core glTF 2.0. diff --git a/Models/BoomBox/glTF/BoomBox.gltf b/Models/BoomBox/glTF/BoomBox.gltf index b5e53c31..04a62a99 100644 --- a/Models/BoomBox/glTF/BoomBox.gltf +++ b/Models/BoomBox/glTF/BoomBox.gltf @@ -169,4 +169,4 @@ "source": 3 } ] -} \ No newline at end of file +} diff --git a/Models/BoomBoxWithAxes/README.body.md b/Models/BoomBoxWithAxes/README.body.md index 45f8e71f..87b3e4e1 100644 --- a/Models/BoomBoxWithAxes/README.body.md +++ b/Models/BoomBoxWithAxes/README.body.md @@ -4,4 +4,4 @@ ## Description -A portable radio with glowing front panel created with Core glTF 2.0, with an axis tripod above it showing the XYZ axis orientations. \ No newline at end of file +A portable radio with glowing front panel created with Core glTF 2.0, with an axis tripod above it showing the XYZ axis orientations. diff --git a/Models/BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf b/Models/BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf index 6f7d7440..4ce379ec 100644 --- a/Models/BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf +++ b/Models/BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf @@ -568,4 +568,4 @@ "source": 4 } ] -} \ No newline at end of file +} diff --git a/Models/Box/README.body.md b/Models/Box/README.body.md index 2e55a124..e5665629 100644 --- a/Models/Box/README.body.md +++ b/Models/Box/README.body.md @@ -4,4 +4,4 @@ ## Description -Simple cube model. \ No newline at end of file +Simple cube model. diff --git a/Models/BoxAnimated/README.body.md b/Models/BoxAnimated/README.body.md index 0387e9da..08a3f3a6 100644 --- a/Models/BoxAnimated/README.body.md +++ b/Models/BoxAnimated/README.body.md @@ -23,4 +23,4 @@ animation to remain sensible. This model will reveal such an issue on subsequent bounces of the inner purple box. In affected runtimes, the box will begin rotating before it has moved to the top position, and collide with the blue box. If you see this, please file an issue -on the affected runtime's issue tracker. \ No newline at end of file +on the affected runtime's issue tracker. diff --git a/Models/BoxInterleaved/README.body.md b/Models/BoxInterleaved/README.body.md index 595c5fdd..6536ef41 100644 --- a/Models/BoxInterleaved/README.body.md +++ b/Models/BoxInterleaved/README.body.md @@ -4,4 +4,4 @@ ## Description -Box example with interleaved position and normal attributes. \ No newline at end of file +Box example with interleaved position and normal attributes. diff --git a/Models/BoxTextured/README.body.md b/Models/BoxTextured/README.body.md index 427519fe..922917f3 100644 --- a/Models/BoxTextured/README.body.md +++ b/Models/BoxTextured/README.body.md @@ -4,4 +4,4 @@ ## Description -Box with a power-of-2 texture, using the Cesium logo. \ No newline at end of file +Box with a power-of-2 texture, using the Cesium logo. diff --git a/Models/BoxVertexColors/README.body.md b/Models/BoxVertexColors/README.body.md index c0eaec18..e99b413c 100644 --- a/Models/BoxVertexColors/README.body.md +++ b/Models/BoxVertexColors/README.body.md @@ -4,4 +4,4 @@ ## Description -A simple unit cube that uses vertex colors, stored in the `COLORS_0` attribute. The color of each vertex is given by the RGB colors that are defined by the vertex coordinates. So the vertex at (0,0,0) is black, the vertex at (1,0,0) is red, the vertex at (1,1,0) is yellow, ..., and the vertex at (1,1,1) is white. +A simple unit cube that uses vertex colors, stored in the `COLORS_0` attribute. The color of each vertex is given by the RGB colors that are defined by the vertex coordinates. So the vertex at (0,0,0) is black, the vertex at (1,0,0) is red, the vertex at (1,1,0) is yellow, ..., and the vertex at (1,1,1) is white. diff --git a/Models/BoxVertexColors/glTF-Embedded/BoxVertexColors.gltf b/Models/BoxVertexColors/glTF-Embedded/BoxVertexColors.gltf index 8c56cd46..620dc907 100644 --- a/Models/BoxVertexColors/glTF-Embedded/BoxVertexColors.gltf +++ b/Models/BoxVertexColors/glTF-Embedded/BoxVertexColors.gltf @@ -72,4 +72,4 @@ "scenes" : [ { "nodes" : [ 0 ] } ] -} \ No newline at end of file +} diff --git a/Models/BoxVertexColors/glTF/BoxVertexColors.gltf b/Models/BoxVertexColors/glTF/BoxVertexColors.gltf index 962b94b2..1f98fdb5 100644 --- a/Models/BoxVertexColors/glTF/BoxVertexColors.gltf +++ b/Models/BoxVertexColors/glTF/BoxVertexColors.gltf @@ -72,4 +72,4 @@ "scenes" : [ { "nodes" : [ 0 ] } ] - } \ No newline at end of file + } diff --git a/Models/BoxVertexColors/metadata.json b/Models/BoxVertexColors/metadata.json index 4d858786..c99d8d33 100644 --- a/Models/BoxVertexColors/metadata.json +++ b/Models/BoxVertexColors/metadata.json @@ -20,6 +20,6 @@ "screenshot": "screenshot/screenshot.png", "name": "Box Vertex Colors", "path": "./Models/BoxVertexColors", - "summary": "A simple unit cube that uses vertex colors, stored in the `COLORS_0` attribute. ", + "summary": "A simple unit cube that uses vertex colors, stored in the `COLORS_0` attribute.", "createReadme": true } diff --git a/Models/BrainStem/README.body.md b/Models/BrainStem/README.body.md index 16076e55..a183585b 100644 --- a/Models/BrainStem/README.body.md +++ b/Models/BrainStem/README.body.md @@ -4,4 +4,4 @@ ## Description -Articulated robot with animation and hierarchy. \ No newline at end of file +Articulated robot with animation and hierarchy. diff --git a/Models/Cameras/README.body.md b/Models/Cameras/README.body.md index 5607136c..516dbaa7 100644 --- a/Models/Cameras/README.body.md +++ b/Models/Cameras/README.body.md @@ -13,4 +13,3 @@ section of the glTF tutorial. The following image shows the data layout of this sample: ![simpleSquare](screenshot/simpleSquare.png) - diff --git a/Models/Cameras/glTF-Embedded/Cameras.gltf b/Models/Cameras/glTF-Embedded/Cameras.gltf index cdeacc22..5c0628c8 100644 --- a/Models/Cameras/glTF-Embedded/Cameras.gltf +++ b/Models/Cameras/glTF-Embedded/Cameras.gltf @@ -19,7 +19,7 @@ "camera" : 1 } ], - + "cameras" : [ { "type": "perspective", @@ -40,7 +40,7 @@ } } ], - + "meshes" : [ { "primitives" : [ { @@ -92,7 +92,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/Cameras/glTF/Cameras.gltf b/Models/Cameras/glTF/Cameras.gltf index 48d5adf5..aa23a030 100644 --- a/Models/Cameras/glTF/Cameras.gltf +++ b/Models/Cameras/glTF/Cameras.gltf @@ -19,7 +19,7 @@ "camera" : 1 } ], - + "cameras" : [ { "type": "perspective", @@ -40,7 +40,7 @@ } } ], - + "meshes" : [ { "primitives" : [ { @@ -92,7 +92,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/CarConcept/glTF-JPG/CarConcept.gltf b/Models/CarConcept/glTF-JPG/CarConcept.gltf index 709513d0..f546b41d 100644 --- a/Models/CarConcept/glTF-JPG/CarConcept.gltf +++ b/Models/CarConcept/glTF-JPG/CarConcept.gltf @@ -17505,4 +17505,4 @@ "sampler": 0 } ] -} \ No newline at end of file +} diff --git a/Models/CarConcept/glTF-WEBP/CarConcept.gltf b/Models/CarConcept/glTF-WEBP/CarConcept.gltf index c3f706d7..cb7bea41 100644 --- a/Models/CarConcept/glTF-WEBP/CarConcept.gltf +++ b/Models/CarConcept/glTF-WEBP/CarConcept.gltf @@ -17569,4 +17569,4 @@ "sampler": 0 } ] -} \ No newline at end of file +} diff --git a/Models/CarConcept/glTF/CarConcept.gltf b/Models/CarConcept/glTF/CarConcept.gltf index 02c76934..c3b4941b 100644 --- a/Models/CarConcept/glTF/CarConcept.gltf +++ b/Models/CarConcept/glTF/CarConcept.gltf @@ -17505,4 +17505,4 @@ "sampler": 0 } ] -} \ No newline at end of file +} diff --git a/Models/CarbonFibre/README.body.md b/Models/CarbonFibre/README.body.md index 7d779403..de08a18d 100644 --- a/Models/CarbonFibre/README.body.md +++ b/Models/CarbonFibre/README.body.md @@ -6,8 +6,8 @@ Screenshot from the [glTF Sample Viewer](https://github.khronos.org/glTF-Sample- ## Description -This model is a sphere using the glTF extension [`KHR_materials_anisotropy`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy) to create a carbon fibre material. +This model is a sphere using the glTF extension [`KHR_materials_anisotropy`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy) to create a carbon fibre material. -The normalTexture is a higher resolution than the others to preserve more details in the shapes of individual fibres. The anisotropyTexture could in theory be only 4x4 pixels however that tends to introduce upscale artifacts. +The normalTexture is a higher resolution than the others to preserve more details in the shapes of individual fibres. The anisotropyTexture could in theory be only 4x4 pixels however that tends to introduce upscale artifacts. ![textures](screenshot/textures.jpg) diff --git a/Models/CarbonFibre/glTF/CarbonFibre.gltf b/Models/CarbonFibre/glTF/CarbonFibre.gltf index 263b0fbb..650f557e 100644 --- a/Models/CarbonFibre/glTF/CarbonFibre.gltf +++ b/Models/CarbonFibre/glTF/CarbonFibre.gltf @@ -178,4 +178,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/CesiumMan/README.body.md b/Models/CesiumMan/README.body.md index d65682f4..f0c11c42 100644 --- a/Models/CesiumMan/README.body.md +++ b/Models/CesiumMan/README.body.md @@ -4,4 +4,4 @@ ## Description -Animated and skinned character with the Cesium logo. \ No newline at end of file +Animated and skinned character with the Cesium logo. diff --git a/Models/CesiumMan/glTF/CesiumMan.gltf b/Models/CesiumMan/glTF/CesiumMan.gltf index f474e54a..5fce2932 100644 --- a/Models/CesiumMan/glTF/CesiumMan.gltf +++ b/Models/CesiumMan/glTF/CesiumMan.gltf @@ -2712,4 +2712,4 @@ "byteLength": 252664 } ] -} \ No newline at end of file +} diff --git a/Models/CesiumMilkTruck/README.body.md b/Models/CesiumMilkTruck/README.body.md index 017ee349..ead75b41 100644 --- a/Models/CesiumMilkTruck/README.body.md +++ b/Models/CesiumMilkTruck/README.body.md @@ -4,4 +4,4 @@ ## Description -Textured. Multiple nodes/meshes. Animations. Cesium logo. \ No newline at end of file +Textured. Multiple nodes/meshes. Animations. Cesium logo. diff --git a/Models/ChairDamaskPurplegold/README.body.md b/Models/ChairDamaskPurplegold/README.body.md index 84639435..a3228981 100644 --- a/Models/ChairDamaskPurplegold/README.body.md +++ b/Models/ChairDamaskPurplegold/README.body.md @@ -5,11 +5,11 @@ ## Description -This represents a wood-framed chair with a fabric seat, tufted with fabric buttons. It does not represent a real Wayfair product. +This represents a wood-framed chair with a fabric seat, tufted with fabric buttons. It does not represent a real Wayfair product. -There are four materials: fabric, wood, metal, and label. +There are four materials: fabric, wood, metal, and label. -The damask-patterned satin and velvet fabric has been textured to simulate human touches bending the velvet fibers, via noise patterns in the normal bump texture. The metalness texture is used to assign the gold threads as metal and the purple threads as non-metal. The KHR_materials_sheen extension provides velvet fresnel, while the KHR_materials_specular extension alters the specular color as seen in satin and velvet fabric samples. +The damask-patterned satin and velvet fabric has been textured to simulate human touches bending the velvet fibers, via noise patterns in the normal bump texture. The metalness texture is used to assign the gold threads as metal and the purple threads as non-metal. The KHR_materials_sheen extension provides velvet fresnel, while the KHR_materials_specular extension alters the specular color as seen in satin and velvet fabric samples. Real-world satin brocade example: -* https://www.moodfabrics.com/purple-and-metallic-gold-vestment-jacquard-318335 \ No newline at end of file +* https://www.moodfabrics.com/purple-and-metallic-gold-vestment-jacquard-318335 diff --git a/Models/ChairDamaskPurplegold/glTF/ChairDamaskPurplegold.gltf b/Models/ChairDamaskPurplegold/glTF/ChairDamaskPurplegold.gltf index 240025f4..46eeb3ae 100644 --- a/Models/ChairDamaskPurplegold/glTF/ChairDamaskPurplegold.gltf +++ b/Models/ChairDamaskPurplegold/glTF/ChairDamaskPurplegold.gltf @@ -1279,4 +1279,4 @@ "wrapT": 10497 } ] -} \ No newline at end of file +} diff --git a/Models/ChronographWatch/README.body.md b/Models/ChronographWatch/README.body.md index 4d1fda29..c81e3e3d 100644 --- a/Models/ChronographWatch/README.body.md +++ b/Models/ChronographWatch/README.body.md @@ -5,20 +5,20 @@ ## Description -This asset represents a wrist watch with animated second hand and material variants, including the 3D Commerce and Khronos Group and DGG logos. +This asset represents a wrist watch with animated second hand and material variants, including the 3D Commerce and Khronos Group and DGG logos. -The asset was started from "Chronograph Watch Mudmaster" (https://skfb.ly/oAsPA) by graphiccompressor, licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/). +The asset was started from "Chronograph Watch Mudmaster" (https://skfb.ly/oAsPA) by graphiccompressor, licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/). ![Screenshots from Sketchfab of the source asset, shaded and wireframe](screenshot/sketchfab.jpg)
_Screenshots from Sketchfab of the original asset, with 885k triangles._ -It was then optimized and converted into a well-formed glTF asset, to showcase the potential for high graphical quality in glTF while maintaining a small download size, and to provide instructions on how to optimize and convert similar assets. +It was then optimized and converted into a well-formed glTF asset, to showcase the potential for high graphical quality in glTF while maintaining a small download size, and to provide instructions on how to optimize and convert similar assets. ## Model Cleanup The source model was provided in FBX, glTF, and USDz formats. FBX is usually the best for editing because it preserves quads and polygons, which allows edge loop workflows during content authoring. -The source FBX file was imported into 3ds Max for initial editing and animation. +The source FBX file was imported into 3ds Max for initial editing and animation. ![Screenshot from 3ds Max](screenshot/fbx-in-3ds-max.jpg)
_Screenshot from 3ds Max of the imported FBX, with object names, shaded wireframe, and materials._ @@ -32,21 +32,21 @@ To fix this, the whole model was moved forward slightly such that the world orig ## Animation -Animation was created for the second hand at 24 frames per second, to allow the model to be imported more easily into Blender later for optimization. +Animation was created for the second hand at 24 frames per second, to allow the model to be imported more easily into Blender later for optimization. To show the typical non-smooth "tick-tock" rotation between the second markings on the watch face, the hand was rotated using "Step" tangents which created a binary motion, without any interpolation between keyframes. This caused the second hand to stay at the 12 position for 24 frames (frame 0 to frame 23) then suddenly jump to the 1st second mark at frame 24. ![Screenshot from 3ds Max](screenshot/animation-step-tangents.jpg)
_Screenshot from 3ds Max showing the Step tangents for the second hand._ -The total rotation around the watch face is 360 degrees, so dividing this into 60 seconds meant the second hand needed to be rotated 6 degrees for each second. +The total rotation around the watch face is 360 degrees, so dividing this into 60 seconds meant the second hand needed to be rotated 6 degrees for each second. -To repeat the second hand motion, the animation controller was set to use "Relative Repeat". This meant only two animation keyframes needed to be created, at zero and six degrees, and the controller would cause the binary rotation to repeat indefinitely. +To repeat the second hand motion, the animation controller was set to use "Relative Repeat". This meant only two animation keyframes needed to be created, at zero and six degrees, and the controller would cause the binary rotation to repeat indefinitely. ![Screenshot from 3ds Max](screenshot/animation-out-of-range-types.jpg)
_Screenshot from 3ds Max showing the Relative Repeat controller._ -Then the total time range was set to 1440 frames, which is 24 frames per second x 60 seconds. This caused the second hand to complete a whole circuit of the watch face at frame 1440. +Then the total time range was set to 1440 frames, which is 24 frames per second x 60 seconds. This caused the second hand to complete a whole circuit of the watch face at frame 1440. ![Screenshot from 3ds Max](screenshot/hs-gltf-exporter.jpg)
_Screenshot from 3ds Max showing the glTF export settings._ @@ -58,7 +58,7 @@ The model was then exported out of 3ds Max in glTF format, using the [HS glTF Im ## Materials -The Autodesk Standard Surface Materials from the FBX were converted into glTF Materials, and assigned appropriate values. +The Autodesk Standard Surface Materials from the FBX were converted into glTF Materials, and assigned appropriate values. The watch band was given a carbon fiber material, by reusing the normal map texture from the sample asset [CarbonFibre](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/CarbonFibre#screenshot). For this asset the glTF extension [KHR_materials_anisotropy](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_anisotropy/README.md#khr_materials_anisotropy) was not needed. While this material is not strictly physically accurate, the normal map alone was considered good enough. Whenever possible, it is a good practice to use as few extensions as possible, since it's not always guaranteed that all renderers will support all extensions. @@ -67,9 +67,9 @@ Normal maps should always be normalized before final delivery, to make sure the ![Carbon fiber materials and normal map](screenshot/carbon-fiber.jpg)
_Carbon fiber normal map, and the resulting material variants._ -To customize the watch for glTF use, the Blender and Mudmaster logo meshes were removed, then the Khronos Group and 3D Commerce and DGG logos were applied as textures. The 3D Commerce logo was set up to be baked along with the rest of the meshes comprising the watch face, into one cohesive texture set (see below for details about using the Remesher). +To customize the watch for glTF use, the Blender and Mudmaster logo meshes were removed, then the Khronos Group and 3D Commerce and DGG logos were applied as textures. The 3D Commerce logo was set up to be baked along with the rest of the meshes comprising the watch face, into one cohesive texture set (see below for details about using the Remesher). -The Khronos Group and DGG logos were created as cropped textures, which didn't strictly match the dimensions of the meshes. Instead, the UV was set to roughly fit the meshes, and the glTF texture Samplers were set to use the wrap mode `ClampToEdge`. This allowed each texture to be applied to the whole surface, then to use [KHR_texture_transform](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#khr_texture_transform) for precise placement, and the colors of the edge pixels simply repeated out to the edges of the material, for a seamless decal. +The Khronos Group and DGG logos were created as cropped textures, which didn't strictly match the dimensions of the meshes. Instead, the UV was set to roughly fit the meshes, and the glTF texture Samplers were set to use the wrap mode `ClampToEdge`. This allowed each texture to be applied to the whole surface, then to use [KHR_texture_transform](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#khr_texture_transform) for precise placement, and the colors of the edge pixels simply repeated out to the edges of the material, for a seamless decal. ![glTF code for the texture samplers](screenshot/sampler-wrapmodes.jpg)
_The texture samplers, showing the wrapS and wrapT values for `ClampToEdge`._ @@ -86,12 +86,12 @@ After adding the texture transforms, the logos were scaled and moved into the co ## Optimization -The model was imported into Blender for optimization, and the [RapidPipeline Blender Add-On](https://docs.rapidpipeline.com/docs/componentDocs/BlenderPlugin/blender-plugin-overview) was used to process different sets of meshes. The meshes were organized into Collections, to allow them to be processed using different optimization settings. +The model was imported into Blender for optimization, and the [RapidPipeline Blender Add-On](https://docs.rapidpipeline.com/docs/componentDocs/BlenderPlugin/blender-plugin-overview) was used to process different sets of meshes. The meshes were organized into Collections, to allow them to be processed using different optimization settings. ![Meshes shown in Blender, organized into Collections](screenshot/blender-collections.jpg)
_The meshes in Blender, organized into Collections. The meshes for the watch face are selected and highlighted in green._ -The watch face under the glass was built out of 55 individual mesh parts; each letter was its own mesh part. Optimizing these with straightforward decimation would have been counterproductive since there was no way to achieve significant savings without severely distorting the shapes. +The watch face under the glass was built out of 55 individual mesh parts; each letter was its own mesh part. Optimizing these with straightforward decimation would have been counterproductive since there was no way to achieve significant savings without severely distorting the shapes. Instead to solve this it was decided to use a Remesher to shrink-wrap a new unified mesh overtop the existing meshes, then bake all the original mesh details into new textures. This allowed the shrink-wrapped mesh to be decimated significantly, while preserving all the fine detail from the original separated surfaces. @@ -103,7 +103,7 @@ The large numerals for 12/3/6/9 were kept separate from the watch face, to allow ![Watch face variants](screenshot/watch-face-variants.jpg)
_The four material variants, showing coloration of the large numerals._ -Most of the rest of the asset was organized into a Collection for decimation. The tiling and localized transforms needed to be preserved for the carbon fiber texture and for the logos, and the meshes needed to be combined by material to reduce draw calls. So for example all the buttons needed to be combined into a single combined mesh with one material. +Most of the rest of the asset was organized into a Collection for decimation. The tiling and localized transforms needed to be preserved for the carbon fiber texture and for the logos, and the meshes needed to be combined by material to reduce draw calls. So for example all the buttons needed to be combined into a single combined mesh with one material. ![Collection for decimation](screenshot/collection-for-decimation.jpg)
_The meshes for decimation and UV preservation._ @@ -113,17 +113,17 @@ The RapidPipeline plugin was used to perform all these actions together, and to ![Collection for decimation](screenshot/decimation-before-vs-after.jpg)
_The meshes before and after decimation with UV preservation and AO baking._ -The final asset has two AO textures, one for the remeshed watch face and the other for the rest of the asset. Ambient occlusion is a significant material ingredient for real-time physically based rendering, and should be added whenever possible to add realistic localized shading. This is best done in a pre-processing step, to minimize runtime rendering overhead. +The final asset has two AO textures, one for the remeshed watch face and the other for the rest of the asset. Ambient occlusion is a significant material ingredient for real-time physically based rendering, and should be added whenever possible to add realistic localized shading. This is best done in a pre-processing step, to minimize runtime rendering overhead. ![Ambient occlusion compared.](screenshot/ambient-occlusion-comparison.jpg)
_Without ambient occlusion (left), with AO (middle), and AO alone (right)._ -The backplate for the watch is entirely metal and mostly flat with subtle curvature. Smooth metallic surfaces present a particular problem in real-time rendering as they stress most optimization techniques. For this asset the best approach was to not decimate the original geometry, and to avoid normal mapping. +The backplate for the watch is entirely metal and mostly flat with subtle curvature. Smooth metallic surfaces present a particular problem in real-time rendering as they stress most optimization techniques. For this asset the best approach was to not decimate the original geometry, and to avoid normal mapping. ![Shading methods for smooth metallic surfaces.](screenshot/backplate-geometry.jpg)
_Geometry alone (left), decimated and normal mapped (middle), decimated alone (right)._ -The original mesh for the backplate was already fairly optimized at only 2816 triangles (left). If the mesh was decimated it showed tesselation artifacts (far right). One common solution for low-resolution meshes (as shown in the middle) is to bake a normal map from the high-res surface. However smooth metallic surfaces expose the limitations of using an 8-bits-per-channel normal map, because there is not enough precision to represent subtle surface curvature. +The original mesh for the backplate was already fairly optimized at only 2816 triangles (left). If the mesh was decimated it showed tesselation artifacts (far right). One common solution for low-resolution meshes (as shown in the middle) is to bake a normal map from the high-res surface. However smooth metallic surfaces expose the limitations of using an 8-bits-per-channel normal map, because there is not enough precision to represent subtle surface curvature. The best solution here was to accept a few more more triangles and to not use a normal map at all. This also ends up saving file size and video memory, since high-definition textures can be fairly expensive in memory. @@ -158,7 +158,7 @@ The asset was output with three different texture formats: | \glTF-KTX | KTX2 | 5.6mb | 13.1mb | | \glTF-WebP | WebP | 5.4mb | 75.8mb | -PNG textures were converted to 8 bits per pixel (256 colors) where it was possible without losing quality; only the `carbonfiber_normal` and `watchface_orm` required 24 bits per pixel. +PNG textures were converted to 8 bits per pixel (256 colors) where it was possible without losing quality; only the `carbonfiber_normal` and `watchface_orm` required 24 bits per pixel. KTX2 textures were converted using ETC1S for most textures to achieve smaller file sizes, and only the normal map was converted using UASTC (with super compression) because the normals were more prone to artifacting. @@ -171,4 +171,4 @@ WebP textures were converted at compression level 85, except the normal map whic
_Zooming into the watch face, texture compression artifacts can be seen._ ![Texture formats compared, carbon fiber in closeup](screenshot/png-ktx-webp-carbon-fiber.jpg) -
_The carbon fiber textures show virtually no difference, even when viewed closeup._ \ No newline at end of file +
_The carbon fiber textures show virtually no difference, even when viewed closeup._ diff --git a/Models/ChronographWatch/glTF-KTX-BasisU/ChronographWatch.gltf b/Models/ChronographWatch/glTF-KTX-BasisU/ChronographWatch.gltf index eaa73439..7dd8fa9f 100644 --- a/Models/ChronographWatch/glTF-KTX-BasisU/ChronographWatch.gltf +++ b/Models/ChronographWatch/glTF-KTX-BasisU/ChronographWatch.gltf @@ -2623,4 +2623,4 @@ "sampler": 0 } ] -} \ No newline at end of file +} diff --git a/Models/ChronographWatch/glTF-WEBP/ChronographWatch.gltf b/Models/ChronographWatch/glTF-WEBP/ChronographWatch.gltf index d7bf6929..4e28d933 100644 --- a/Models/ChronographWatch/glTF-WEBP/ChronographWatch.gltf +++ b/Models/ChronographWatch/glTF-WEBP/ChronographWatch.gltf @@ -2623,4 +2623,4 @@ "sampler": 0 } ] -} \ No newline at end of file +} diff --git a/Models/ChronographWatch/glTF/ChronographWatch.gltf b/Models/ChronographWatch/glTF/ChronographWatch.gltf index 878a853c..46c06c94 100644 --- a/Models/ChronographWatch/glTF/ChronographWatch.gltf +++ b/Models/ChronographWatch/glTF/ChronographWatch.gltf @@ -2585,4 +2585,4 @@ "source": 7 } ] -} \ No newline at end of file +} diff --git a/Models/ClearCoatCarPaint/README.body.md b/Models/ClearCoatCarPaint/README.body.md index 0e90d6c7..55c558b7 100644 --- a/Models/ClearCoatCarPaint/README.body.md +++ b/Models/ClearCoatCarPaint/README.body.md @@ -6,11 +6,11 @@ Screenshot from the [glTF Sample Viewer](https://github.khronos.org/glTF-Sample- ## Description -This model is a sphere using the glTF extension [`KHR_materials_clearcoat`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat) overtop a car paint base material. +This model is a sphere using the glTF extension [`KHR_materials_clearcoat`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat) overtop a car paint base material. -The base material is meant to mimic the scattering from micro flakes such as used in some car paints. +The base material is meant to mimic the scattering from micro flakes such as used in some car paints. -The model uses a single bitmap for the normal bump texture with a random per-pixel noise pattern, and the glTF extension [`KHR_texture_transform`](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform) to increase bump tiling. +The model uses a single bitmap for the normal bump texture with a random per-pixel noise pattern, and the glTF extension [`KHR_texture_transform`](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform) to increase bump tiling. ![bump texture](screenshot/normal_bump_enlarged.jpg) @@ -18,4 +18,3 @@ The normal bump texture, enlarged 200% to show detail. Roughness was increased to 0.4 to scatter the reflected light and to provide a contrast with the clear coat layer which uses zero Roughness. Metalness was set arbitrarily to a partial value of 0.3 to increase the specularity of the base material. - diff --git a/Models/ClearCoatCarPaint/glTF/ClearCoatCarPaint.gltf b/Models/ClearCoatCarPaint/glTF/ClearCoatCarPaint.gltf index 61274304..556e25e7 100644 --- a/Models/ClearCoatCarPaint/glTF/ClearCoatCarPaint.gltf +++ b/Models/ClearCoatCarPaint/glTF/ClearCoatCarPaint.gltf @@ -170,4 +170,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/ClearCoatCarPaint/metadata.json b/Models/ClearCoatCarPaint/metadata.json index 79dcba54..dc3f613a 100644 --- a/Models/ClearCoatCarPaint/metadata.json +++ b/Models/ClearCoatCarPaint/metadata.json @@ -20,6 +20,6 @@ "screenshot": "screenshot/screenshot.jpg", "name": "Clear Coat Car Paint", "path": "./Models/ClearCoatCarPaint", - "summary": "This model is a sphere using the glTF ClearCoat extension overtop a car paint base material. ", + "summary": "This model is a sphere using the glTF ClearCoat extension overtop a car paint base material.", "createReadme": true } diff --git a/Models/ClearCoatTest/README.body.md b/Models/ClearCoatTest/README.body.md index 3e80cb18..e7e8540b 100644 --- a/Models/ClearCoatTest/README.body.md +++ b/Models/ClearCoatTest/README.body.md @@ -55,4 +55,4 @@ On this row, the same normal map has been applied to both the base layer and the ### Coat normal map -This row uses a normal map on the coating, while the base layer is smooth. In this case it is intended to look similar to clear plastic wrap (but without any roughness variation). In the center column, the base layer's wide reflections should be visible under the coating's thin reflections. \ No newline at end of file +This row uses a normal map on the coating, while the base layer is smooth. In this case it is intended to look similar to clear plastic wrap (but without any roughness variation). In the center column, the base layer's wide reflections should be visible under the coating's thin reflections. diff --git a/Models/ClearCoatTest/glTF/ClearCoatTest.gltf b/Models/ClearCoatTest/glTF/ClearCoatTest.gltf index ace783db..cc68a428 100644 --- a/Models/ClearCoatTest/glTF/ClearCoatTest.gltf +++ b/Models/ClearCoatTest/glTF/ClearCoatTest.gltf @@ -1631,4 +1631,4 @@ "extensionsUsed": [ "KHR_materials_clearcoat" ] -} \ No newline at end of file +} diff --git a/Models/ClearcoatWicker/README.body.md b/Models/ClearcoatWicker/README.body.md index 521d50a3..f60e35de 100644 --- a/Models/ClearcoatWicker/README.body.md +++ b/Models/ClearcoatWicker/README.body.md @@ -6,5 +6,4 @@ Screenshot from the [glTF Sample Viewer](https://github.khronos.org/glTF-Sample- ## Description -This model is a sphere using the glTF extension [`KHR_materials_clearcoat`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat) to create a wicker material covered with a wrinkled plastic clearcoat, to demonstrate the usage of a clearcoat bump texture. - +This model is a sphere using the glTF extension [`KHR_materials_clearcoat`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat) to create a wicker material covered with a wrinkled plastic clearcoat, to demonstrate the usage of a clearcoat bump texture. diff --git a/Models/ClearcoatWicker/glTF/ClearcoatWicker.gltf b/Models/ClearcoatWicker/glTF/ClearcoatWicker.gltf index b1fe269c..a5f6bb50 100644 --- a/Models/ClearcoatWicker/glTF/ClearcoatWicker.gltf +++ b/Models/ClearcoatWicker/glTF/ClearcoatWicker.gltf @@ -186,4 +186,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/CommercialRefrigerator/README.body.md b/Models/CommercialRefrigerator/README.body.md index c01c28fc..d98fd2d8 100644 --- a/Models/CommercialRefrigerator/README.body.md +++ b/Models/CommercialRefrigerator/README.body.md @@ -6,9 +6,9 @@ ## Description -This asset represents a small glass-fronted commercial refrigerator of the type seen commonly in convenience stores. +This asset represents a small glass-fronted commercial refrigerator of the type seen commonly in convenience stores. -The asset was created to demonstrate a high quality model for e-commerce use, and to provide instructions on how to create similar assets using current industry-accepted 3D content creation techniques. +The asset was created to demonstrate a high quality model for e-commerce use, and to provide instructions on how to create similar assets using current industry-accepted 3D content creation techniques. ## Source Asset @@ -18,7 +18,7 @@ This asset looked good in Sketchfab, but it needed editing to work better with t ## Model Cleanup -The source model is provided in FBX, glTF, and USDz formats. FBX is usually the best for editing because it preserves quads and polygons, which helps with modeling operations. However the FBX file did not have textures assigned to the materials, and the UVs did not match the bitmaps. +The source model is provided in FBX, glTF, and USDz formats. FBX is usually the best for editing because it preserves quads and polygons, which helps with modeling operations. However the FBX file did not have textures assigned to the materials, and the UVs did not match the bitmaps. ![A list of node names in a hierarchy, a shaded wireframe of the refrigerator, and a shaded non-wireframe view](screenshot/gltf-source-hierarchy.jpg)
_The source node names & hierarchy, and the triangulated meshes._ @@ -33,11 +33,11 @@ _Some of the source meshes had non-default transforms._ The refrigerator imported with the front facing the other way, along positive Y (3ds Max uses Z up world orientation). The whole asset needed to be rotated 180 degrees to face the front. -Then the meshes needed to have their transforms reset. This means the positions, rotations, and scales of the meshes were set to default values. Clean transforms are necessary for a well-formed 3D asset, as they allow renderers and editing tools to transform the parts accurately. +Then the meshes needed to have their transforms reset. This means the positions, rotations, and scales of the meshes were set to default values. Clean transforms are necessary for a well-formed 3D asset, as they allow renderers and editing tools to transform the parts accurately. ## Chamfers for Shading -The source model had a few shading errors, where vertex normals were averaged or smoothed across right angles. These were fixed by adding chamfers... thin bevels along hard edges. +The source model had a few shading errors, where vertex normals were averaged or smoothed across right angles. These were fixed by adding chamfers... thin bevels along hard edges. ![Shaded and wireframe views of the upper part of the refrigerator, before and after chamfering](screenshot/chamfers-before-after.jpg)
_Chamfers were added for improved shading._ @@ -49,25 +49,25 @@ _Bevels can be added, and vertex normals can be adjusted for clean shading._ Left to right in the image above: 1. Simple geometry with face-aligned vertex normals (flat shading). -2. Vertex normals averaged across neighboring faces (smooth shading). +2. Vertex normals averaged across neighboring faces (smooth shading). 3. Bevels added. -4. Vertex normals weighted to align with the largest faces. +4. Vertex normals weighted to align with the largest faces. With this technique, the transitions in smooth shading are confined to the beveled faces of the model, resulting in clean well-ordered shading with a minimal number of vertices. -This method avoids having to use a normal map to create the beveled edges, which helps reduce the download size of the finished asset. The vertices for the chamfers "cost less" in download size than a full normal map texture would. +This method avoids having to use a normal map to create the beveled edges, which helps reduce the download size of the finished asset. The vertices for the chamfers "cost less" in download size than a full normal map texture would. ## Material Organization -The materials in the source mesh were arranged in a different way than what was desired for the new asset. +The materials in the source mesh were arranged in a different way than what was desired for the new asset. ![Node lists are shown with selections of meshes, indicating three collections of nodes](screenshot/source-materials-hierarchy.jpg)
_Source meshes selected by material._ The new model will have an interior with baked lighting, using an emissiveTexture. The emissive will also be used for the lighted signage. Combining them together will allow the asset to use only one emissve texture, and the combined lighting can be easily turned on and off by disabling the emissive. -![A colored wireframe shows three structures in the refrigerator.](screenshot/intended-materials.jpg)
+![A colored wireframe shows three structures in the refrigerator.](screenshot/intended-materials.jpg)
_Meshes colored to represent the new material structure. Red for interior, green for exterior, white for glass._ The asset will have three main materials: @@ -79,51 +79,51 @@ When creating glass for a real-time model, it is especially important to use a s * Performance * Render order -Performance: glass can use the glTF extension [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission) to simulate refraction, reflection, absorption, and other realistic properties. However these effects rely on a multi-pass render technique which can cause real-time performance to drop, so it is best to use it on as few surfaces as possible. +Performance: glass can use the glTF extension [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission) to simulate refraction, reflection, absorption, and other realistic properties. However these effects rely on a multi-pass render technique which can cause real-time performance to drop, so it is best to use it on as few surfaces as possible. Render order: when transmissive surfaces are rendered in a real-time viewer, often only one layer of transmission can be rendered. Any transmissive surfaces behind the glass would be invisible. For this reason the wine bottles were set as opaque. -The asset [GlassVaseFlowers](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/GlassVaseFlowers) is a good demonstration of this limitation. When viewed from below, the transmissive base completely occludes the upper glass parts. +The asset [GlassVaseFlowers](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/GlassVaseFlowers) is a good demonstration of this limitation. When viewed from below, the transmissive base completely occludes the upper glass parts. -![A glass vase containing flowers is seen from below, with the real-time rasterizer occluding parts of the glass, while the pathtracer shows all parts](screenshot/rasterizer-vs-pathtracer.jpg)
+![A glass vase containing flowers is seen from below, with the real-time rasterizer occluding parts of the glass, while the pathtracer shows all parts](screenshot/rasterizer-vs-pathtracer.jpg)
_Real-time rasterizer (left) versus a non-real-time pathtracer, in the [three.js Editor](https://threejs.org/editor/). Notice how parts of the base are obscured in the real-time view._ Another way to add transparent surfaces behind transmission could be to use `alphaMode:Blend`. However this has limitations as well. Some real-time rasterizers will not render alpha blend behind transmission, while others will. -![The glass flower vases are shown in different renderers, with three.js occluding alpha blend](screenshot/threejs-vs-babylonjs.jpg)
+![The glass flower vases are shown in different renderers, with three.js occluding alpha blend](screenshot/threejs-vs-babylonjs.jpg)
_Three.js (left) does not render alpha blend behind tranmission, but Babylon.js does._ -## Texture Baking +## Texture Baking -To redistribute the source textures into the new material structure, a 2nd UV was generated for each of the three intended materials: interior, exterior, and glass. +To redistribute the source textures into the new material structure, a 2nd UV was generated for each of the three intended materials: interior, exterior, and glass. -![The UV layouts for the three materials are shown](screenshot/uv-layouts.jpg)
+![The UV layouts for the three materials are shown](screenshot/uv-layouts.jpg)
_The UV layouts for the three materials._ Then the textures were "baked" from their original UV layouts into the new UVs, using _Bake To Texture_ in 3ds Max. -![The Bake To Texture interface is shown with the desired render elements](screenshot/bake-to-texture.jpg)
+![The Bake To Texture interface is shown with the desired render elements](screenshot/bake-to-texture.jpg)
_Bake To Texture with render elements for the exterior case and for the interior._ The Arnold renderer was initially used to transfer the textures to the new UV layout. However some errors appeared in the bakes, where Arnold was mistakenly raycasting parts of nearby meshes. Switching to the V-Ray renderer avoided these artifacts. -![Bake To Texture artifacts are shown from using the Arnold renderer](screenshot/arnold-baking-errors.jpg)
+![Bake To Texture artifacts are shown from using the Arnold renderer](screenshot/arnold-baking-errors.jpg)
_Bake To Texture errors in the ambient occlusion bake._ ## Emissive Light Baking -The interior lighting in the source asset was done with a real-time light that casts shadows. While this works great in Sketchfab's renderer, shadow casting is not enabled in most web renderers. +The interior lighting in the source asset was done with a real-time light that casts shadows. While this works great in Sketchfab's renderer, shadow casting is not enabled in most web renderers. In a glTF material an `emissiveTexture` can be repurposed for baked lighting. Because Emissive is additive this can cause it to overpowers the baseColorTexture. Care must be taken to edit a baked lightmap to re-introduce parts of the baseColorTexture. -![The refrigerator is shown with Emissive enabled on one side, and disabled on the other](screenshot/emissive_On_Off.jpg)
+![The refrigerator is shown with Emissive enabled on one side, and disabled on the other](screenshot/emissive_On_Off.jpg)
_The emissive lightmap, on versus off._ To create the lightmap for this asset, a _VRayLightMtl_ was added to the flourescent tube and _Bake To Texture_ was used to generate a _VRayLightingMap_ render element. Photoshop was then used to bias the lighting so it would be more evenly distributed in the interior. -![The original emissive bake is darker, next to the edited and brighter final texture](screenshot/vray-lighting-map.jpg)
+![The original emissive bake is darker, next to the edited and brighter final texture](screenshot/vray-lighting-map.jpg)
_The raw VRayLIghtingMap bake, and the edited result._ The printed label in the top right interior was re-added on top of the lightmap, and the upper backlit signage was also composited on top. The lightmap was de-noised, then the empty areas were filled in between the UV shells. This prevented seams when textures were filtered during rendering to fix aliasing. @@ -132,27 +132,27 @@ The printed label in the top right interior was re-added on top of the lightmap, The glass for the door is best done as a single-sided quad, with the glTF material setting `"doubleSided": true`. If an explicit backfacing quad was added, this would cause rendering artifacts in pathtracers, since they nearly always render with backface culling disabled, which would cause the front and back quads to be rendered on top of each other. -A texture of [rusty metal from PolyHaven](https://polyhaven.com/a/rusty_metal_03) was used for the condensation on the glass. The red channel was extracted, inverted, leveled, placed into the green channel, and assigned as a `metallicRoughnessTexture`. +A texture of [rusty metal from PolyHaven](https://polyhaven.com/a/rusty_metal_03) was used for the condensation on the glass. The red channel was extracted, inverted, leveled, placed into the green channel, and assigned as a `metallicRoughnessTexture`. -![A photo of rusty metal, next to an edited grayscale version, next to the final green version](screenshot/glass-roughness.jpg)
+![A photo of rusty metal, next to an edited grayscale version, next to the final green version](screenshot/glass-roughness.jpg)
_A photo of rust was edited to create the roughness texture._ The roughnessFactor was adjusted to 0.75, using the [three.js Editor](https://threejs.org/editor/) web app to interactively determine which settings to use. Then [Microsoft Visual Studio Code](https://code.visualstudio.com) with the [Cesium glTF Tools Extension](https://marketplace.visualstudio.com/items?itemName=cesium.gltf-vscode) was used to edit the values into the .glTF file. -![An animated GIF showing the adjustment of Roughness and how it blurs the glass refraction](screenshot/glass-roughness.gif)
+![An animated GIF showing the adjustment of Roughness and how it blurs the glass refraction](screenshot/glass-roughness.gif)
_The [three.js Editor](https://threejs.org/editor/) can be used to interactively fine-tune material settings._ -The extension [KHR_material_clearcoat](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat) was added to increase the reflectivity of the glass. The rust photo in the `metallicRoughnessTexture` was great for blurring refractions, but it also blurred reflections. +The extension [KHR_material_clearcoat](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat) was added to increase the reflectivity of the glass. The rust photo in the `metallicRoughnessTexture` was great for blurring refractions, but it also blurred reflections. -To restore sharp and bright reflections the `clearcoatFactor` was set to 1 and the `clearcoatRoughnessFactor` was set to 0. This created bright reflection on the outside, while keeping blurry refractions on the inside. +To restore sharp and bright reflections the `clearcoatFactor` was set to 1 and the `clearcoatRoughnessFactor` was set to 0. This created bright reflection on the outside, while keeping blurry refractions on the inside. -![Two screenshots show how clearcoat adds a brighter reflection](screenshot/clearcoat_On_Off.jpg)
+![Two screenshots show how clearcoat adds a brighter reflection](screenshot/clearcoat_On_Off.jpg)
_Clearcoat added (left) versus without._ ## Naming and Hierarchy -Model parts were attached together into as few meshes as possible. This improved real-time rendering performance. Then models were renamed to use logical names. This will help keep the model organized, and make it easier for others to use the asset. +Model parts were attached together into as few meshes as possible. This improved real-time rendering performance. Then models were renamed to use logical names. This will help keep the model organized, and make it easier for others to use the asset. Meshes were linked together into hierarchies and pivots were adjusted, so parts can be rotated for examination and to allow interactivity. This allows the refrigerator to be opened, and the glass moves along with it in a natural fashion. @@ -162,24 +162,24 @@ The door was animated to open and close using bezier ease curves. This creates a However in glTF there are no ease curves and animation keyframes are always linear. Here is a comparison of ease curves vs. linear rotation: -![An animated GIF shows two refrigerators, one with natural ease curve rotation, the other with mechanical linear rotation](screenshot/ease-vs-linear.gif)
+![An animated GIF shows two refrigerators, one with natural ease curve rotation, the other with mechanical linear rotation](screenshot/ease-vs-linear.gif)
_Ease curve rotation (left) versus linear rotation._ The difference may appear subtle but linear rotation can look mechanical or robotic. Ease curves are preferrable for natural-looking animations. To preserve ease curves in glTF, the animation curves can be resampled or "baked" to use linear keyframes, one for each frame of the animation. In 3ds Max this is done in the Motion Panel using the tool _Collapse Transform_. -![Animation curves are shown, one with a few bezier keyframes, the other with a linear keyframe on each animation frame](screenshot/resample-keyframes.jpg)
+![Animation curves are shown, one with a few bezier keyframes, the other with a linear keyframe on each animation frame](screenshot/resample-keyframes.jpg)
_Before and after using Collapse Transform to resample the keyframes._ -Resampling like this will preserve custom curve data but can increase file sizes dramatically. After exporting to glTF, it is best to optimize the animation to reduce the number of keyframes while still retaining the same motion. [RapidPipeline 3D Processor](https://docs.rapidpipeline.com/docs/componentDocs/3dProcessor/3d-processor-overview) was used to automatically optimize the animation curve data, removing redundant keyframes. +Resampling like this will preserve custom curve data but can increase file sizes dramatically. After exporting to glTF, it is best to optimize the animation to reduce the number of keyframes while still retaining the same motion. [RapidPipeline 3D Processor](https://docs.rapidpipeline.com/docs/componentDocs/3dProcessor/3d-processor-overview) was used to automatically optimize the animation curve data, removing redundant keyframes. -![A screenshot of Optimize setting parameters, with the Conservative option being chosen](screenshot/curve-simplification-conservative.jpg)
+![A screenshot of Optimize setting parameters, with the Conservative option being chosen](screenshot/curve-simplification-conservative.jpg)
_RapidPipeline 3D Processor settings for Animation Curve Simplification._ For this asset, setting the _Animation Curve Simplification_ to _Conservative_ removed redundant keyframes while preserving the intent of the original animation. -![Another comparison of animation curves, one with a linear keyframe on each animation frame, and the other with fewer keyframes but roughly same curvature](screenshot/keyframe-optimization.jpg)
+![Another comparison of animation curves, one with a linear keyframe on each animation frame, and the other with fewer keyframes but roughly same curvature](screenshot/keyframe-optimization.jpg)
_Before and after using 3D Processor to optimize the keyframes._ @@ -187,14 +187,14 @@ _Before and after using 3D Processor to optimize the keyframes._ [RapidPipeline 3D Processor](https://docs.rapidpipeline.com/docs/componentDocs/3dProcessor/3d-processor-overview) was also used to optimize and prepare the final glTF and GLB files. -![Screenshots of multiple setting parameters](screenshot/compression-settings.jpg)
+![Screenshots of multiple setting parameters](screenshot/compression-settings.jpg)
_glTF export settings in RapidPipeline 3D Processor._ * _Preserve Texture File Names_ keeps the original names of the textures. These names are usually stripped out to reduce filesize, but they can be useful when debugging or editing. A .glTF file is in plain text which makes it easy to examine in any text editor. -* _Discard unused UVs_ is useful for removing unwanted and unused vertex data. -* _Exclude Tangents_ is disabled to force the creation of tangents. Tangents are used by materials with normal maps to reproduce the same shading as seen by the artist when they were making the asset. +* _Discard unused UVs_ is useful for removing unwanted and unused vertex data. +* _Exclude Tangents_ is disabled to force the creation of tangents. Tangents are used by materials with normal maps to reproduce the same shading as seen by the artist when they were making the asset. * It's often useful to downsize `occlusionTexture` and `metallicRoughnessTexture` files because the decreased resolution is usually not noticeable, but can drastically reduce filesizes which can speed up download time for the user. -* _JPG Compression Quality_ is set to 75/100 because most textures can be compressed heavily without causing too many artifacts. +* _JPG Compression Quality_ is set to 75/100 because most textures can be compressed heavily without causing too many artifacts. * _JPG Compression Normal Quality_ uses a higher value because normal maps tend to cause more visible errors from compression artifacts than other textures. With these settings, the final glTF asset was reduced from 36mb down to 10mb. @@ -203,7 +203,7 @@ With these settings, the final glTF asset was reduced from 36mb down to 10mb. It is often helpful to examine glTF files with the [glTF Validator](https://github.khronos.org/glTF-Validator/) which can point out problems with the asset. A well-formed glTF file behaves predictably in multiple viewers and renderers, preserving the original intent of the artist. -![A screenshot of a result from the glTF Validator, showing zero Errors/Warnings/Infos/Hints](screenshot/glTF-Validator.jpg)
+![A screenshot of a result from the glTF Validator, showing zero Errors/Warnings/Infos/Hints](screenshot/glTF-Validator.jpg)
_The asset report in glTF Validator._ -In particular, the previously-mentioned setting _Discard unused UVs_ and the disabled setting _Exclude Tangents_ helped to remove Warnings from this asset. \ No newline at end of file +In particular, the previously-mentioned setting _Discard unused UVs_ and the disabled setting _Exclude Tangents_ helped to remove Warnings from this asset. diff --git a/Models/CompareAlphaCoverage/README.body.md b/Models/CompareAlphaCoverage/README.body.md index 99c7d057..343fa5ad 100644 --- a/Models/CompareAlphaCoverage/README.body.md +++ b/Models/CompareAlphaCoverage/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Alpha Coverage. This asset shows the differences between three states: alphaMode:Opaque, alphaMode:Mask, and alphaMode:Blend. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Alpha Coverage. This asset shows the differences between three states: alphaMode:Opaque, alphaMode:Mask, and alphaMode:Blend. diff --git a/Models/CompareAlphaCoverage/glTF/CompareAlphaCoverage.gltf b/Models/CompareAlphaCoverage/glTF/CompareAlphaCoverage.gltf index 3b321da5..f06b03d5 100644 --- a/Models/CompareAlphaCoverage/glTF/CompareAlphaCoverage.gltf +++ b/Models/CompareAlphaCoverage/glTF/CompareAlphaCoverage.gltf @@ -866,4 +866,4 @@ "source": 5 } ] -} \ No newline at end of file +} diff --git a/Models/CompareAmbientOcclusion/README.body.md b/Models/CompareAmbientOcclusion/README.body.md index eab09e9a..846c6130 100644 --- a/Models/CompareAmbientOcclusion/README.body.md +++ b/Models/CompareAmbientOcclusion/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Ambient Occlusion. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Ambient Occlusion. diff --git a/Models/CompareAmbientOcclusion/glTF/CompareAmbientOcclusion.gltf b/Models/CompareAmbientOcclusion/glTF/CompareAmbientOcclusion.gltf index 69d39853..806b5723 100644 --- a/Models/CompareAmbientOcclusion/glTF/CompareAmbientOcclusion.gltf +++ b/Models/CompareAmbientOcclusion/glTF/CompareAmbientOcclusion.gltf @@ -744,4 +744,4 @@ "source": 2 } ] -} \ No newline at end of file +} diff --git a/Models/CompareAnisotropy/README.body.md b/Models/CompareAnisotropy/README.body.md index 91f42838..99bab1da 100644 --- a/Models/CompareAnisotropy/README.body.md +++ b/Models/CompareAnisotropy/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Anisotropy. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Anisotropy. diff --git a/Models/CompareAnisotropy/glTF/CompareAnisotropy.gltf b/Models/CompareAnisotropy/glTF/CompareAnisotropy.gltf index 05a5628d..1d22ccd8 100644 --- a/Models/CompareAnisotropy/glTF/CompareAnisotropy.gltf +++ b/Models/CompareAnisotropy/glTF/CompareAnisotropy.gltf @@ -631,4 +631,4 @@ "source": 4 } ] -} \ No newline at end of file +} diff --git a/Models/CompareBaseColor/README.body.md b/Models/CompareBaseColor/README.body.md index bd04d385..1d8cd553 100644 --- a/Models/CompareBaseColor/README.body.md +++ b/Models/CompareBaseColor/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the states of a specific PBR feature; in this case Base Color. This asset shows the differences between three states: baseColorFactor, baseColorTexture, and baseColorTexture with Vertex Color. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the states of a specific PBR feature; in this case Base Color. This asset shows the differences between three states: baseColorFactor, baseColorTexture, and baseColorTexture with Vertex Color. diff --git a/Models/CompareBaseColor/glTF/CompareBaseColor.gltf b/Models/CompareBaseColor/glTF/CompareBaseColor.gltf index 5f53be59..9eae4e5d 100644 --- a/Models/CompareBaseColor/glTF/CompareBaseColor.gltf +++ b/Models/CompareBaseColor/glTF/CompareBaseColor.gltf @@ -468,4 +468,4 @@ "source": 1 } ] -} \ No newline at end of file +} diff --git a/Models/CompareClearcoat/README.body.md b/Models/CompareClearcoat/README.body.md index 17358a09..85459cbc 100644 --- a/Models/CompareClearcoat/README.body.md +++ b/Models/CompareClearcoat/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Clearcoat. This asset shows the differences between three states: metallic spheres with zero roughness, half roughness, and half roughness plus clearcoat. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Clearcoat. This asset shows the differences between three states: metallic spheres with zero roughness, half roughness, and half roughness plus clearcoat. diff --git a/Models/CompareClearcoat/glTF/CompareClearcoat.gltf b/Models/CompareClearcoat/glTF/CompareClearcoat.gltf index afa8a047..3da8e0be 100644 --- a/Models/CompareClearcoat/glTF/CompareClearcoat.gltf +++ b/Models/CompareClearcoat/glTF/CompareClearcoat.gltf @@ -434,4 +434,4 @@ "source": 1 } ] -} \ No newline at end of file +} diff --git a/Models/CompareDispersion/README.body.md b/Models/CompareDispersion/README.body.md index 7da149e5..a2c1c02a 100644 --- a/Models/CompareDispersion/README.body.md +++ b/Models/CompareDispersion/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Dispersion. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Dispersion. diff --git a/Models/CompareDispersion/glTF/CompareDispersion.gltf b/Models/CompareDispersion/glTF/CompareDispersion.gltf index 473a3576..ebafee34 100644 --- a/Models/CompareDispersion/glTF/CompareDispersion.gltf +++ b/Models/CompareDispersion/glTF/CompareDispersion.gltf @@ -474,4 +474,4 @@ "source": 1 } ] -} \ No newline at end of file +} diff --git a/Models/CompareEmissiveStrength/README.body.md b/Models/CompareEmissiveStrength/README.body.md index 8d974d53..ba95cfdb 100644 --- a/Models/CompareEmissiveStrength/README.body.md +++ b/Models/CompareEmissiveStrength/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Emissive versus Emissive plus Emissive Strength. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Emissive versus Emissive plus Emissive Strength. diff --git a/Models/CompareEmissiveStrength/glTF/CompareEmissiveStrength.gltf b/Models/CompareEmissiveStrength/glTF/CompareEmissiveStrength.gltf index 57f9fd20..0f613139 100644 --- a/Models/CompareEmissiveStrength/glTF/CompareEmissiveStrength.gltf +++ b/Models/CompareEmissiveStrength/glTF/CompareEmissiveStrength.gltf @@ -319,4 +319,4 @@ "source": 0 } ] -} \ No newline at end of file +} diff --git a/Models/CompareIor/README.body.md b/Models/CompareIor/README.body.md index 10302cb5..9a3ba87d 100644 --- a/Models/CompareIor/README.body.md +++ b/Models/CompareIor/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case IOR. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case IOR. diff --git a/Models/CompareIor/glTF/CompareIor.gltf b/Models/CompareIor/glTF/CompareIor.gltf index b438a0ae..ced56a1f 100644 --- a/Models/CompareIor/glTF/CompareIor.gltf +++ b/Models/CompareIor/glTF/CompareIor.gltf @@ -469,4 +469,4 @@ "source": 3 } ] -} \ No newline at end of file +} diff --git a/Models/CompareIridescence/README.body.md b/Models/CompareIridescence/README.body.md index 63299e69..22161340 100644 --- a/Models/CompareIridescence/README.body.md +++ b/Models/CompareIridescence/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Iridescence. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Iridescence. diff --git a/Models/CompareIridescence/glTF/CompareIridescence.gltf b/Models/CompareIridescence/glTF/CompareIridescence.gltf index e211690e..32a1d66b 100644 --- a/Models/CompareIridescence/glTF/CompareIridescence.gltf +++ b/Models/CompareIridescence/glTF/CompareIridescence.gltf @@ -317,4 +317,4 @@ "source": 2 } ] -} \ No newline at end of file +} diff --git a/Models/CompareMetallic/README.body.md b/Models/CompareMetallic/README.body.md index 76a2122c..f633ae4d 100644 --- a/Models/CompareMetallic/README.body.md +++ b/Models/CompareMetallic/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Metallic. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Metallic. diff --git a/Models/CompareMetallic/glTF/CompareMetallic.gltf b/Models/CompareMetallic/glTF/CompareMetallic.gltf index 300a4ff4..b002bf72 100644 --- a/Models/CompareMetallic/glTF/CompareMetallic.gltf +++ b/Models/CompareMetallic/glTF/CompareMetallic.gltf @@ -297,4 +297,4 @@ "source": 1 } ] -} \ No newline at end of file +} diff --git a/Models/CompareNormal/README.body.md b/Models/CompareNormal/README.body.md index 5144433b..728aa99e 100644 --- a/Models/CompareNormal/README.body.md +++ b/Models/CompareNormal/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Normal. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Normal. diff --git a/Models/CompareNormal/glTF/CompareNormal.gltf b/Models/CompareNormal/glTF/CompareNormal.gltf index 7fe0720f..352d6a79 100644 --- a/Models/CompareNormal/glTF/CompareNormal.gltf +++ b/Models/CompareNormal/glTF/CompareNormal.gltf @@ -290,4 +290,4 @@ "source": 0 } ] -} \ No newline at end of file +} diff --git a/Models/CompareRoughness/README.body.md b/Models/CompareRoughness/README.body.md index 98149504..e98385ef 100644 --- a/Models/CompareRoughness/README.body.md +++ b/Models/CompareRoughness/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Roughness. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Roughness. diff --git a/Models/CompareRoughness/glTF/CompareRoughness.gltf b/Models/CompareRoughness/glTF/CompareRoughness.gltf index cd1e7209..2786afcf 100644 --- a/Models/CompareRoughness/glTF/CompareRoughness.gltf +++ b/Models/CompareRoughness/glTF/CompareRoughness.gltf @@ -298,4 +298,4 @@ "source": 1 } ] -} \ No newline at end of file +} diff --git a/Models/CompareSheen/README.body.md b/Models/CompareSheen/README.body.md index 5308a444..afdf2b4f 100644 --- a/Models/CompareSheen/README.body.md +++ b/Models/CompareSheen/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Sheen. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Sheen. diff --git a/Models/CompareSheen/glTF/CompareSheen.gltf b/Models/CompareSheen/glTF/CompareSheen.gltf index c83aaaee..1f54b65f 100644 --- a/Models/CompareSheen/glTF/CompareSheen.gltf +++ b/Models/CompareSheen/glTF/CompareSheen.gltf @@ -322,4 +322,4 @@ "source": 2 } ] -} \ No newline at end of file +} diff --git a/Models/CompareSpecular/README.body.md b/Models/CompareSpecular/README.body.md index 7c65a3e0..545fc453 100644 --- a/Models/CompareSpecular/README.body.md +++ b/Models/CompareSpecular/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Specular. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Specular. diff --git a/Models/CompareSpecular/glTF/CompareSpecular.gltf b/Models/CompareSpecular/glTF/CompareSpecular.gltf index d66e4af2..ce0aa51a 100644 --- a/Models/CompareSpecular/glTF/CompareSpecular.gltf +++ b/Models/CompareSpecular/glTF/CompareSpecular.gltf @@ -314,4 +314,4 @@ "source": 1 } ] -} \ No newline at end of file +} diff --git a/Models/CompareTransmission/README.body.md b/Models/CompareTransmission/README.body.md index e1e295bf..eaffcf33 100644 --- a/Models/CompareTransmission/README.body.md +++ b/Models/CompareTransmission/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Alpha Blend versus Transmission. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Alpha Blend versus Transmission. diff --git a/Models/CompareTransmission/glTF/CompareTransmission.gltf b/Models/CompareTransmission/glTF/CompareTransmission.gltf index 9f231f74..f37e7bfb 100644 --- a/Models/CompareTransmission/glTF/CompareTransmission.gltf +++ b/Models/CompareTransmission/glTF/CompareTransmission.gltf @@ -714,4 +714,4 @@ "source": 3 } ] -} \ No newline at end of file +} diff --git a/Models/CompareVolume/README.body.md b/Models/CompareVolume/README.body.md index c4af93bb..1d329edc 100644 --- a/Models/CompareVolume/README.body.md +++ b/Models/CompareVolume/README.body.md @@ -5,4 +5,4 @@ ## Description -This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Transmission alone versus Transmission with Volume. \ No newline at end of file +This model is used on the Khronos glTF PBR website to contrast the omission versus addition of a specific PBR feature; in this case Transmission alone versus Transmission with Volume. diff --git a/Models/Corset/README.body.md b/Models/Corset/README.body.md index 2eec70ec..c451498b 100644 --- a/Models/Corset/README.body.md +++ b/Models/Corset/README.body.md @@ -4,4 +4,4 @@ ## Description -A female fabric mannequin with a corset and a collar. \ No newline at end of file +A female fabric mannequin with a corset and a collar. diff --git a/Models/Corset/glTF/Corset.gltf b/Models/Corset/glTF/Corset.gltf index 18419af6..457d36eb 100644 --- a/Models/Corset/glTF/Corset.gltf +++ b/Models/Corset/glTF/Corset.gltf @@ -155,4 +155,4 @@ "source": 2 } ] -} \ No newline at end of file +} diff --git a/Models/Cube/README.body.md b/Models/Cube/README.body.md index fce63691..384f368b 100644 --- a/Models/Cube/README.body.md +++ b/Models/Cube/README.body.md @@ -4,4 +4,4 @@ ## Description -A cube with non-smoothed faces. \ No newline at end of file +A cube with non-smoothed faces. diff --git a/Models/DamagedHelmet/README.body.md b/Models/DamagedHelmet/README.body.md index 0f8d87fb..6652166e 100644 --- a/Models/DamagedHelmet/README.body.md +++ b/Models/DamagedHelmet/README.body.md @@ -8,4 +8,4 @@ A fictional helmet with textured damage. ## Modifications -The original model was built on an early draft of glTF 2.0 that did not become final. This new model has been imported and re-exported from Blender to bring it into alignment with the final release glTF 2.0 specification. \ No newline at end of file +The original model was built on an early draft of glTF 2.0 that did not become final. This new model has been imported and re-exported from Blender to bring it into alignment with the final release glTF 2.0 specification. diff --git a/Models/DiffuseTransmissionPlant/README.body.md b/Models/DiffuseTransmissionPlant/README.body.md index 4a5e98c6..36bb2047 100644 --- a/Models/DiffuseTransmissionPlant/README.body.md +++ b/Models/DiffuseTransmissionPlant/README.body.md @@ -5,21 +5,21 @@ ## Description -This asset demonstrates the use of [KHR_materials_diffuse_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_diffuse_transmission) to represent thin-surface light transmission of green plant leaves with red backscatter. +This asset demonstrates the use of [KHR_materials_diffuse_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_diffuse_transmission) to represent thin-surface light transmission of green plant leaves with red backscatter. -The original model is available from [Polyhaven](https://polyhaven.com/a/potted_plant_02). The model was edited with 3ds Max. The leaf textures were edited to show red veins, to help communicate the idea that the leaves are red inside, and thus would show red-colored diffuse transmission. +The original model is available from [Polyhaven](https://polyhaven.com/a/potted_plant_02). The model was edited with 3ds Max. The leaf textures were edited to show red veins, to help communicate the idea that the leaves are red inside, and thus would show red-colored diffuse transmission. Leaf backfaces were removed, and `doubleSided:true` used instead, to allow pathtracers to render this asset effectively. Previously the asset had explicit backfacing triangles with a red material, and was relying on backface culling to render properly, but this is not supported in most pathtracers which makes it impossible to check for ground truth. -The leaves are assigned the diffuse transmission extension with a red `diffuseTransmissionColorTexture` to control the transmission. The red veins are darker to emphasize the leaf textures, and the bases of the stem trunks are darker to help these parts blend into the rocks better. +The leaves are assigned the diffuse transmission extension with a red `diffuseTransmissionColorTexture` to control the transmission. The red veins are darker to emphasize the leaf textures, and the bases of the stem trunks are darker to help these parts blend into the rocks better. ![diffuseTransmissionTexture on the model](screenshot/diffuseTransmissionTexture.jpg)
_The diffuseTransmissionColorTexture isolated on the model._ -Fireflies were added, with point lights, and animated to follow a looping path. Chase cameras were added behind the fireflies. +Fireflies were added, with point lights, and animated to follow a looping path. Chase cameras were added behind the fireflies. To emphasize the effect of the point lights on diffuse transmission, the `diffuseTransmissionFactor` for the plant material was set to a low value of 0.1; this prevents the transmission color from overwhelming the baseColor. -Stem intersections with obvious shading differences were adjusted so their vertices could be welded together. +Stem intersections with obvious shading differences were adjusted so their vertices could be welded together. -For optimal texture quality, lossless versions of the textures were re-downloaded from Polyhaven, then the asset was optimized with RapidPipeline and an ambient occlusion texture was baked for the pot and the dirt. \ No newline at end of file +For optimal texture quality, lossless versions of the textures were re-downloaded from Polyhaven, then the asset was optimized with RapidPipeline and an ambient occlusion texture was baked for the pot and the dirt. diff --git a/Models/DiffuseTransmissionPlant/glTF/DiffuseTransmissionPlant.gltf b/Models/DiffuseTransmissionPlant/glTF/DiffuseTransmissionPlant.gltf index 9743423d..8a096e93 100644 --- a/Models/DiffuseTransmissionPlant/glTF/DiffuseTransmissionPlant.gltf +++ b/Models/DiffuseTransmissionPlant/glTF/DiffuseTransmissionPlant.gltf @@ -2680,4 +2680,4 @@ "source": 6 } ] -} \ No newline at end of file +} diff --git a/Models/DiffuseTransmissionTeacup/README.body.md b/Models/DiffuseTransmissionTeacup/README.body.md index 6dcc5d54..fdc4dd93 100644 --- a/Models/DiffuseTransmissionTeacup/README.body.md +++ b/Models/DiffuseTransmissionTeacup/README.body.md @@ -5,10 +5,10 @@ ## Description -This asset demonstrates the use of KHR_materials_diffuse_transmission to represent thin-surface transmission of light through a thin ceramic teacup and saucer. +This asset demonstrates the use of KHR_materials_diffuse_transmission to represent thin-surface transmission of light through a thin ceramic teacup and saucer. ![With the extension, versus without it.](screenshot/with-vs-without.jpg)
_With the extension, versus without it._ ![The ingredients used for Diffuse Transmission](screenshot/diffuse-transmission-features.jpg) -
_The ingredients used for Diffuse Transmission: diffuseTransmissionColorFactor, and diffuseTransmissionFactor._ \ No newline at end of file +
_The ingredients used for Diffuse Transmission: diffuseTransmissionColorFactor, and diffuseTransmissionFactor._ diff --git a/Models/DiffuseTransmissionTest/README.body.md b/Models/DiffuseTransmissionTest/README.body.md index 739eb950..4356e341 100644 --- a/Models/DiffuseTransmissionTest/README.body.md +++ b/Models/DiffuseTransmissionTest/README.body.md @@ -5,9 +5,9 @@ _Screenshot from the [glTF Sample Viewer](https://github.khronos.org/glTF-Sample ## Description -This model tests diffuse transmission inputs for [`KHR_materials_diffuse_transmission`](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_diffuse_transmission#readme). +This model tests diffuse transmission inputs for [`KHR_materials_diffuse_transmission`](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_diffuse_transmission#readme). -There is a single directional punctual light, facing the camera. +There is a single directional punctual light, facing the camera. The smaller rectangles on the left side use Unlit materials to indicate color and texture inputs. @@ -15,4 +15,3 @@ Behind each of the larger rectangles are dark pink rectangles, to emulate the la ![render from Dassault Stellar](screenshot/dassault-stellar.jpg)
_Path-traced render from Dassault Systèmes [Stellar Physically Correct](https://blog.3ds.com/brands/3dexcite/stellar-physically-correct/), using the PBR Neutral tonemapper._ - diff --git a/Models/DirectionalLight/glTF/DirectionalLight.gltf b/Models/DirectionalLight/glTF/DirectionalLight.gltf index 485e08f9..6ae1ad7c 100644 --- a/Models/DirectionalLight/glTF/DirectionalLight.gltf +++ b/Models/DirectionalLight/glTF/DirectionalLight.gltf @@ -49,7 +49,7 @@ -0.6, 0.0, 0.0 - ], + ], "scale": [3, 3, 3] }, { @@ -62,7 +62,7 @@ 0.0, 0.0, 0.0 - ], + ], "scale": [3, 3, 3] }, { @@ -75,7 +75,7 @@ 0.6, 0.0, 0.0 - ], + ], "scale": [3, 3, 3] }, { @@ -313,4 +313,4 @@ "uri": "DirectionalLight.bin" } ] -} \ No newline at end of file +} diff --git a/Models/Duck/README.body.md b/Models/Duck/README.body.md index 98c4afc6..302b4e07 100644 --- a/Models/Duck/README.body.md +++ b/Models/Duck/README.body.md @@ -4,4 +4,4 @@ ## Description -A rubber ducky bath toy. \ No newline at end of file +A rubber ducky bath toy. diff --git a/Models/Duck/glTF-Quantized/Duck.gltf b/Models/Duck/glTF-Quantized/Duck.gltf index 4a4b1613..79744dec 100644 --- a/Models/Duck/glTF-Quantized/Duck.gltf +++ b/Models/Duck/glTF-Quantized/Duck.gltf @@ -1,52 +1,52 @@ -{ - "buffers":[ - { +{ + "buffers":[ + { "uri":"Duck.bin", "byteLength":63656 } ], - "asset":{ + "asset":{ "version":"2.0", "generator":"gltfpack 0.13" }, - "extensionsUsed":[ + "extensionsUsed":[ "KHR_mesh_quantization", "KHR_texture_transform" ], - "extensionsRequired":[ + "extensionsRequired":[ "KHR_mesh_quantization" ], - "bufferViews":[ - { + "bufferViews":[ + { "buffer":0, "byteOffset":0, "byteLength":9596, "byteStride":4, "target":34962 }, - { + { "buffer":0, "byteOffset":9596, "byteLength":19192, "byteStride":8, "target":34962 }, - { + { "buffer":0, "byteOffset":28788, "byteLength":9596, "byteStride":4, "target":34962 }, - { + { "buffer":0, "byteOffset":38384, "byteLength":25272, "target":34963 } ], - "accessors":[ - { + "accessors":[ + { "bufferView":0, "byteOffset":0, "componentType":5120, @@ -54,31 +54,31 @@ "type":"VEC3", "normalized":true }, - { + { "bufferView":1, "byteOffset":0, "componentType":5123, "count":2399, "type":"VEC3", - "min":[ + "min":[ 0, 0, 0 ], - "max":[ + "max":[ 16383, 15251, 11411 ] }, - { + { "bufferView":2, "byteOffset":0, "componentType":5123, "count":2399, "type":"VEC2" }, - { + { "bufferView":3, "byteOffset":0, "componentType":5123, @@ -86,30 +86,30 @@ "type":"SCALAR" } ], - "images":[ - { + "images":[ + { "uri":"DuckCM.png" } ], - "textures":[ - { + "textures":[ + { "source":0 } ], - "materials":[ - { + "materials":[ + { "name":"blinn3-fx", - "pbrMetallicRoughness":{ - "baseColorTexture":{ + "pbrMetallicRoughness":{ + "baseColorTexture":{ "index":0, "texCoord":0, - "extensions":{ - "KHR_texture_transform":{ - "offset":[ + "extensions":{ + "KHR_texture_transform":{ + "offset":[ 0.0264090002, 0.019963026 ], - "scale":[ + "scale":[ 0.000233684244, 0.000234450286 ] @@ -120,11 +120,11 @@ } } ], - "meshes":[ - { - "primitives":[ - { - "attributes":{ + "meshes":[ + { + "primitives":[ + { + "attributes":{ "NORMAL":0, "POSITION":1, "TEXCOORD_0":2 @@ -136,22 +136,22 @@ ] } ], - "nodes":[ - { + "nodes":[ + { "mesh":0, - "translation":[ + "translation":[ -0.692984998, 0.0992936939, -0.613281965 ], - "scale":[ + "scale":[ 0.000101006161, 0.000101006161, 0.000101006161 ] }, - { - "matrix":[ + { + "matrix":[ 0.00999999978, 0, 0, @@ -169,12 +169,12 @@ 0, 1 ], - "children":[ + "children":[ 2 ] }, - { - "matrix":[ + { + "matrix":[ -0.72896868, 0, -0.684547067, @@ -195,18 +195,18 @@ "camera":0 } ], - "scenes":[ - { - "nodes":[ + "scenes":[ + { + "nodes":[ 0, 1 ] } ], - "cameras":[ - { + "cameras":[ + { "type":"perspective", - "perspective":{ + "perspective":{ "yfov":0.660592556, "znear":1, "aspectRatio":1.5, @@ -215,4 +215,4 @@ } ], "scene":0 -} \ No newline at end of file +} diff --git a/Models/EmissiveStrengthTest/README.body.md b/Models/EmissiveStrengthTest/README.body.md index acc01fa9..a9cae9e7 100644 --- a/Models/EmissiveStrengthTest/README.body.md +++ b/Models/EmissiveStrengthTest/README.body.md @@ -37,4 +37,4 @@ emit substantially more light. If a given implementation does not support `KHR_materials_emissive_strength`, the boxes will all appear to emit the same color. For example: -![test fail screenshot](screenshot/test_fail.jpg) \ No newline at end of file +![test fail screenshot](screenshot/test_fail.jpg) diff --git a/Models/EnvironmentTest/README.body.md b/Models/EnvironmentTest/README.body.md index c6d6ecd1..042b9536 100644 --- a/Models/EnvironmentTest/README.body.md +++ b/Models/EnvironmentTest/README.body.md @@ -8,4 +8,4 @@ Three rows of spheres with varying roughness. Top row is white metal, middle row ## Original Asset -https://stock.adobe.com/search/3d-assets?filters%5Bcontent_type%3A3d%5D=1&filters%5B3d_type_id%5D%5B%5D=2&order=relevance&safe_search=1&search_page=1&limit=100&acp=&aco=canyon&price%5B%24%5D=1&get_facets=1&asset_id=122687900 \ No newline at end of file +https://stock.adobe.com/search/3d-assets?filters%5Bcontent_type%3A3d%5D=1&filters%5B3d_type_id%5D%5B%5D=2&order=relevance&safe_search=1&search_page=1&limit=100&acp=&aco=canyon&price%5B%24%5D=1&get_facets=1&asset_id=122687900 diff --git a/Models/EnvironmentTest/glTF-IBL/EnvironmentTest.gltf b/Models/EnvironmentTest/glTF-IBL/EnvironmentTest.gltf index 1f13aec6..f42cad88 100644 --- a/Models/EnvironmentTest/glTF-IBL/EnvironmentTest.gltf +++ b/Models/EnvironmentTest/glTF-IBL/EnvironmentTest.gltf @@ -739,4 +739,4 @@ "extensionsUsed": [ "EXT_lights_image_based" ] -} \ No newline at end of file +} diff --git a/Models/EnvironmentTest/glTF/EnvironmentTest.gltf b/Models/EnvironmentTest/glTF/EnvironmentTest.gltf index 0788514a..12c448c5 100644 --- a/Models/EnvironmentTest/glTF/EnvironmentTest.gltf +++ b/Models/EnvironmentTest/glTF/EnvironmentTest.gltf @@ -325,4 +325,4 @@ } ], "scene": 0 -} \ No newline at end of file +} diff --git a/Models/FlightHelmet/README.body.md b/Models/FlightHelmet/README.body.md index cb9ead86..bdeb2594 100644 --- a/Models/FlightHelmet/README.body.md +++ b/Models/FlightHelmet/README.body.md @@ -4,4 +4,4 @@ ## Description -USAAF A-11 Flying Helmet on a wooden stand with realistic high resolution textures. \ No newline at end of file +USAAF A-11 Flying Helmet on a wooden stand with realistic high resolution textures. diff --git a/Models/Fox/README.body.md b/Models/Fox/README.body.md index 339765df..b6216d3c 100644 --- a/Models/Fox/README.body.md +++ b/Models/Fox/README.body.md @@ -6,4 +6,4 @@ This model demonstrates animated rigging with three different animation cycles: Survey, Walk, and Run. These animations all drive the same joints, so for this model, only one animation should be active at any given time. glTF [specifies](https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations) that the client implementation may choose when to play any of the available animations. -glTF conversion [by @AsoboStudio and @scurest](https://github.com/KhronosGroup/glTF-Sample-Models/pull/150#issuecomment-406300118) \ No newline at end of file +glTF conversion [by @AsoboStudio and @scurest](https://github.com/KhronosGroup/glTF-Sample-Models/pull/150#issuecomment-406300118) diff --git a/Models/GlamVelvetSofa/README.body.md b/Models/GlamVelvetSofa/README.body.md index 41dacda6..6d26f32c 100644 --- a/Models/GlamVelvetSofa/README.body.md +++ b/Models/GlamVelvetSofa/README.body.md @@ -6,11 +6,11 @@ Above: screenshot from the [Babylon.js Sandbox](https://sandbox.babylonjs.com/). ## Description -This model represents a real product, a velvet sofa bed being sold [on the Wayfair website](https://www.wayfair.com/furniture/pdp/mercer41-frankie-velvet-86-recessed-arm-sofa-bed-mcrf6337.html). +This model represents a real product, a velvet sofa bed being sold [on the Wayfair website](https://www.wayfair.com/furniture/pdp/mercer41-frankie-velvet-86-recessed-arm-sofa-bed-mcrf6337.html). The model is made of three parts, each with their own materials. Two 1024x1024 PNG textures are used for the whole model, an ambient occlusion map and a normal bump map. All UVs are arranged between 0 and 1, and `KHR_texture_transform` is used to repeat the normal map for the fabric. The model uses 4319 triangles and 3204 vertices. -The model uses several extensions: +The model uses several extensions: * [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) to provide a key light for better velvet illumination. Sheen seems to respond better to punctual lights than with image-based lighting alone. * [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen) for velvet sheen. * [KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) to colorize facing-angle reflections, which occurs with some fabrics (satins, silks, velvets, etc.). @@ -44,13 +44,13 @@ The model uses the extension [KHR_materials_variants](https://github.com/Khronos The extension [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen) is used for the main fabric color; it best represents how velvet microfibers interact with lighting at glancing angles. -[KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) is used to colorize reflections on dielectric (non-metal) surfaces. Velvet, satin, silk, and similar fabrics can colorize reflections which makes them difficult to replicate in a traditional PBR metal-rough material. +[KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) is used to colorize reflections on dielectric (non-metal) surfaces. Velvet, satin, silk, and similar fabrics can colorize reflections which makes them difficult to replicate in a traditional PBR metal-rough material. ![screenshots of how the various material layers combine together](screenshot/screenshot_layers.jpg) Top to bottom: base color alone, sheen color added, specular color added. -A normalTexture simulates the bending of velvet microfibers from human touches, by bending the surface normals to point at different areas of the image-based lighting. The texture is a combination of tiled "grunge" patterns. The red channel was rotated 90 degrees to create variation, the blue channel was filled with white, and a cotton-weave normal map was overlaid. Then the texture was re-normalized. +A normalTexture simulates the bending of velvet microfibers from human touches, by bending the surface normals to point at different areas of the image-based lighting. The texture is a combination of tiled "grunge" patterns. The red channel was rotated 90 degrees to create variation, the blue channel was filled with white, and a cotton-weave normal map was overlaid. Then the texture was re-normalized. ![the fabric normalTexture](screenshot/normalTexture.jpg) @@ -58,11 +58,11 @@ The normal map, enlarged and cropped to show detail. ## KHR_lights_punctual -The extension [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) is used to add a directional light to the model, with its Intensity set to 3. This provides better velvet illumination, as sheen responds better to punctual lights than to image-based lighting (IBL) alone. +The extension [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) is used to add a directional light to the model, with its Intensity set to 3. This provides better velvet illumination, as sheen responds better to punctual lights than to image-based lighting (IBL) alone. -This is highly dependent on the exposure range in each IBL, however most IBLs do not capture strong exposure values for the lights unless the sun or a suitably bright light source are present. In these examples, the "studio" IBL from Babylon.js was used, which uses +2.40 stops for each light. +This is highly dependent on the exposure range in each IBL, however most IBLs do not capture strong exposure values for the lights unless the sun or a suitably bright light source are present. In these examples, the "studio" IBL from Babylon.js was used, which uses +2.40 stops for each light. -Augmented reality IBLs typically contain a low value range, as they're often created by transforming the view from the mobile device's front camera. It is hoped the addition of a punctual light can restore the benefits of strong key light to improve the sheen response. +Augmented reality IBLs typically contain a low value range, as they're often created by transforming the view from the mobile device's front camera. It is hoped the addition of a punctual light can restore the benefits of strong key light to improve the sheen response. ![screenshots with punctual enabled and disabled](screenshot/screenshot_punctual.jpg) @@ -70,4 +70,4 @@ Top: Punctual light improves sheen. Bottom: Disabling the punctual light. ## Authoring Details ## -The model was created with [3ds Max](https://www.autodesk.com/products/3ds-max/) and exported to glTF via the [Max2Babylon](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. The glTF file was then edited manually in [Visual Studio Code](https://code.visualstudio.com) with the [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode) extension to add KHR extensions and fine-tune material values. \ No newline at end of file +The model was created with [3ds Max](https://www.autodesk.com/products/3ds-max/) and exported to glTF via the [Max2Babylon](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. The glTF file was then edited manually in [Visual Studio Code](https://code.visualstudio.com) with the [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode) extension to add KHR extensions and fine-tune material values. diff --git a/Models/GlamVelvetSofa/glTF/GlamVelvetSofa.gltf b/Models/GlamVelvetSofa/glTF/GlamVelvetSofa.gltf index d73e8e35..670e5e36 100644 --- a/Models/GlamVelvetSofa/glTF/GlamVelvetSofa.gltf +++ b/Models/GlamVelvetSofa/glTF/GlamVelvetSofa.gltf @@ -618,4 +618,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/GlassBrokenWindow/README.body.md b/Models/GlassBrokenWindow/README.body.md index 6b474383..4164a9e4 100644 --- a/Models/GlassBrokenWindow/README.body.md +++ b/Models/GlassBrokenWindow/README.body.md @@ -6,10 +6,10 @@ Screenshot from the [glTF Sample Viewer](https://github.khronos.org/glTF-Sample- ## Description -This asset demonstrates the combination of two transparency methods in glTF: [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#readme) for glass and [alphaMode:"MASK"](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_alphamode) for holes in the broken glass. +This asset demonstrates the combination of two transparency methods in glTF: [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#readme) for glass and [alphaMode:"MASK"](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_alphamode) for holes in the broken glass. `alphaMode:"MASK"` is designed to represent the visibility of a glTF material which works well for the missing pieces of glass and the cracks between the shards. -`KHR_materials_transmission` is the recommended method for reproducing refractive materials such as glass or water. This extension allows light to transmit through a surface in a physically-plausible manner. +`KHR_materials_transmission` is the recommended method for reproducing refractive materials such as glass or water. This extension allows light to transmit through a surface in a physically-plausible manner. -The material uses a Metallic texture to simulate the strong refractions usually seen along the edges of broken window glass. While this is not physically accurate it does help compensate for the lack of true geometry. Colored edges in the baseColorTexture also help to colorize the broken edges. \ No newline at end of file +The material uses a Metallic texture to simulate the strong refractions usually seen along the edges of broken window glass. While this is not physically accurate it does help compensate for the lack of true geometry. Colored edges in the baseColorTexture also help to colorize the broken edges. diff --git a/Models/GlassBrokenWindow/glTF/GlassBrokenWindow.gltf b/Models/GlassBrokenWindow/glTF/GlassBrokenWindow.gltf index 3965da72..c4f383a8 100644 --- a/Models/GlassBrokenWindow/glTF/GlassBrokenWindow.gltf +++ b/Models/GlassBrokenWindow/glTF/GlassBrokenWindow.gltf @@ -341,4 +341,4 @@ "extensionsUsed": [ "KHR_materials_transmission" ] -} \ No newline at end of file +} diff --git a/Models/GlassHurricaneCandleHolder/README.body.md b/Models/GlassHurricaneCandleHolder/README.body.md index 6df7696b..ccfa6f90 100644 --- a/Models/GlassHurricaneCandleHolder/README.body.md +++ b/Models/GlassHurricaneCandleHolder/README.body.md @@ -6,11 +6,11 @@ ## Description -This model is a hurricane lamp candle holder using the glTF extensions [`KHR_materials_transmission`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [`KHR_materials_volume`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) to create colored glass. +This model is a hurricane lamp candle holder using the glTF extensions [`KHR_materials_transmission`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [`KHR_materials_volume`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) to create colored glass. The color of the glass comes from the `attenuationColor` and `attenuationDistance` properties in `KHR_materials_volume`, along with the `thicknessTexture` which can be used by non-raytraced renderers to simulate surfaces with varying thickness. Pathtracers can ignore this texture and instead use the geometric thickness from the model for more accurate results. -An earlier version of this model was used in the glTF tutorial [Adding Material Extensions to glTF Models](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/AddingMaterialExtensions/README.md#adding-material-extensions-to-gltf-models). The current version has been improved to demonstrate transmission affected by the colors in `baseColorTexture` and roughness in `metallicRoughnessTexture`. +An earlier version of this model was used in the glTF tutorial [Adding Material Extensions to glTF Models](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/AddingMaterialExtensions/README.md#adding-material-extensions-to-gltf-models). The current version has been improved to demonstrate transmission affected by the colors in `baseColorTexture` and roughness in `metallicRoughnessTexture`. ![screenshot](screenshot/compare-renderers.jpg) diff --git a/Models/GlassHurricaneCandleHolder/glTF/GlassHurricaneCandleHolder.gltf b/Models/GlassHurricaneCandleHolder/glTF/GlassHurricaneCandleHolder.gltf index eca74834..5d1bb7ba 100644 --- a/Models/GlassHurricaneCandleHolder/glTF/GlassHurricaneCandleHolder.gltf +++ b/Models/GlassHurricaneCandleHolder/glTF/GlassHurricaneCandleHolder.gltf @@ -257,4 +257,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/GlassVaseFlowers/README.body.md b/Models/GlassVaseFlowers/README.body.md index 50ffea8a..a6836a0e 100644 --- a/Models/GlassVaseFlowers/README.body.md +++ b/Models/GlassVaseFlowers/README.body.md @@ -6,14 +6,14 @@ Screenshot from the [glTF Sample Viewer](https://github.khronos.org/glTF-Sample- ## Description -This model compares transparency methods for representing glass in glTF: [alphaMode:"BLEND"](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_alphamode) (left) versus the extensions [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#readme) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_volume#readme) (right). +This model compares transparency methods for representing glass in glTF: [alphaMode:"BLEND"](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_alphamode) (left) versus the extensions [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#readme) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_volume#readme) (right). ## Comparing Alpha Blending with Transmission -Before these extensions became available, alpha blending with a low alpha value in the `baseColorFactor` was often used to represent refractive materials such as water or glass. +Before these extensions became available, alpha blending with a low alpha value in the `baseColorFactor` was often used to represent refractive materials such as water or glass. However, alpha blending is designed to represent the visibility of a material not refraction. Alpha with a texture is a good choice to reproduce the visibility of surfaces with small gaps (burlap or gauze) or complex edges (foliage) which can't reasonably be represented with triangles alone. These materials often work best with alphaMode:Mask since this avoids depth-sorting issues, and a texture with predominantly pure white or black values and gray used only for anti-aliasing. When alpha blending is used with partial values the surface shows more of what is behind, but in turn specular reflections are reduced. Alpha blending does not simulate refraction, fresnel reflections, diffusion, nor attenuation. Alpha blending can also cause depth-sorting errors in real-time renderers, with further surfaces rendered incorrectly in front of nearer surfaces. Because of these limitations it is not recommended to use alpha blending for refractive materials. -Transmission and Volume are the recommended methods for reproducing refractive materials such as glass or water. These extensions allow light to transmit through a surface in a physically-plausible manner, reproducing effects like the bending of light through thick glass, fresnel reflections on oblique surfaces, colored transmission as in stained glass, color attenuation that can occur where surfaces become thicker, and the dispersion or blurring that can occur with roughened surfaces. \ No newline at end of file +Transmission and Volume are the recommended methods for reproducing refractive materials such as glass or water. These extensions allow light to transmit through a surface in a physically-plausible manner, reproducing effects like the bending of light through thick glass, fresnel reflections on oblique surfaces, colored transmission as in stained glass, color attenuation that can occur where surfaces become thicker, and the dispersion or blurring that can occur with roughened surfaces. diff --git a/Models/GlassVaseFlowers/glTF/GlassVaseFlowers.gltf b/Models/GlassVaseFlowers/glTF/GlassVaseFlowers.gltf index e29b86e4..0fa23bf4 100644 --- a/Models/GlassVaseFlowers/glTF/GlassVaseFlowers.gltf +++ b/Models/GlassVaseFlowers/glTF/GlassVaseFlowers.gltf @@ -320,4 +320,4 @@ "KHR_materials_transmission", "KHR_materials_volume" ] -} \ No newline at end of file +} diff --git a/Models/IORTestGrid/README.body.md b/Models/IORTestGrid/README.body.md index ea8e862b..b41678e1 100644 --- a/Models/IORTestGrid/README.body.md +++ b/Models/IORTestGrid/README.body.md @@ -5,4 +5,4 @@ ## Description -This model tests interactions between [KHR_materials_ior](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_ior) and the related extensions [KHR_materials_specular](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_specular), [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission), and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_volume). \ No newline at end of file +This model tests interactions between [KHR_materials_ior](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_ior) and the related extensions [KHR_materials_specular](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_specular), [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission), and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_volume). diff --git a/Models/IORTestGrid/glTF/IORTestGrid.gltf b/Models/IORTestGrid/glTF/IORTestGrid.gltf index 38e17776..7376bd78 100644 --- a/Models/IORTestGrid/glTF/IORTestGrid.gltf +++ b/Models/IORTestGrid/glTF/IORTestGrid.gltf @@ -2548,4 +2548,4 @@ "source": 0 } ] -} \ No newline at end of file +} diff --git a/Models/InterpolationTest/README.body.md b/Models/InterpolationTest/README.body.md index 2097f441..015b90f4 100644 --- a/Models/InterpolationTest/README.body.md +++ b/Models/InterpolationTest/README.body.md @@ -4,4 +4,4 @@ ## Description -A sample with three different animation interpolations. \ No newline at end of file +A sample with three different animation interpolations. diff --git a/Models/InterpolationTest/glTF/InterpolationTest.gltf b/Models/InterpolationTest/glTF/InterpolationTest.gltf index 195f1ce9..ce4500ac 100644 --- a/Models/InterpolationTest/glTF/InterpolationTest.gltf +++ b/Models/InterpolationTest/glTF/InterpolationTest.gltf @@ -531,4 +531,4 @@ } ], "scene": 0 -} \ No newline at end of file +} diff --git a/Models/IridescenceAbalone/README.body.md b/Models/IridescenceAbalone/README.body.md index 0dd84863..d9a59afa 100644 --- a/Models/IridescenceAbalone/README.body.md +++ b/Models/IridescenceAbalone/README.body.md @@ -10,12 +10,12 @@ This model is a photogrammetry scan of an abalone shell, with material and textu ## Material -The material uses four textures: baseColorTexture, Occlusion/Roughness/Metallic, normalTexture, and iridescenceTexture/iridescenceThicknessTexture. The BaseColor, Occlusion, and Normal textures were baked from the high-resolution source model. The Roughness and Thickness were created via quick edits of the BaseColor texture. +The material uses four textures: baseColorTexture, Occlusion/Roughness/Metallic, normalTexture, and iridescenceTexture/iridescenceThicknessTexture. The BaseColor, Occlusion, and Normal textures were baked from the high-resolution source model. The Roughness and Thickness were created via quick edits of the BaseColor texture. -The iridescenceTexture and iridescenceThicknessTexture were packed into the red and green channels of a single bitmap to reduce texture fetches, since the extension uses these two channels by default. The Occlusion, Roughness, and metallic were also packed into a single bitmap. +The iridescenceTexture and iridescenceThicknessTexture were packed into the red and green channels of a single bitmap to reduce texture fetches, since the extension uses these two channels by default. The Occlusion, Roughness, and metallic were also packed into a single bitmap. The interior of the shell uses partial metalness to increase the iridescent effect. This is not strictly accurate since shells are not made of metal, but the iridescent effect is more pronounced on metallic surfaces. -While the textures are powers-of-two they are not square; a resolution of 2048 by 1024 is a better aspect ratio for the shape of the model. +While the textures are powers-of-two they are not square; a resolution of 2048 by 1024 is a better aspect ratio for the shape of the model. -![screenshot](screenshot/textures.jpg) \ No newline at end of file +![screenshot](screenshot/textures.jpg) diff --git a/Models/IridescenceAbalone/glTF/IridescenceAbalone.gltf b/Models/IridescenceAbalone/glTF/IridescenceAbalone.gltf index 7388362d..b49ac14a 100644 --- a/Models/IridescenceAbalone/glTF/IridescenceAbalone.gltf +++ b/Models/IridescenceAbalone/glTF/IridescenceAbalone.gltf @@ -189,4 +189,4 @@ "extensionsUsed": [ "KHR_materials_iridescence" ] -} \ No newline at end of file +} diff --git a/Models/IridescenceDielectricSpheres/README.body.md b/Models/IridescenceDielectricSpheres/README.body.md index ee397397..61145874 100644 --- a/Models/IridescenceDielectricSpheres/README.body.md +++ b/Models/IridescenceDielectricSpheres/README.body.md @@ -8,4 +8,4 @@ Scene to show the parametrization of the `KHR_materials_iridescence` extension w * Material IOR: index of refraction of the dielectric base material * Thin Film Thickness: the thickness of the thin-film layer in nm -* Thin Film IOR: index of refraction of the thin-film layer \ No newline at end of file +* Thin Film IOR: index of refraction of the thin-film layer diff --git a/Models/IridescenceDielectricSpheres/glTF/IridescenceDielectricSpheres.gltf b/Models/IridescenceDielectricSpheres/glTF/IridescenceDielectricSpheres.gltf index 635bc9d0..533cc215 100644 --- a/Models/IridescenceDielectricSpheres/glTF/IridescenceDielectricSpheres.gltf +++ b/Models/IridescenceDielectricSpheres/glTF/IridescenceDielectricSpheres.gltf @@ -15992,4 +15992,4 @@ "KHR_materials_ior", "KHR_materials_iridescence" ] -} \ No newline at end of file +} diff --git a/Models/IridescenceLamp/README.body.md b/Models/IridescenceLamp/README.body.md index fd3cc2ae..7caf3499 100644 --- a/Models/IridescenceLamp/README.body.md +++ b/Models/IridescenceLamp/README.body.md @@ -6,7 +6,7 @@ ## Description -This model represents the real Wayfair product [Bonsell 19" Table Lamp](https://www.wayfair.com/lighting/pdp/wrought-studio-bonsell-19-table-lamp-w002337865.html) which has iridescent finishes. +This model represents the real Wayfair product [Bonsell 19" Table Lamp](https://www.wayfair.com/lighting/pdp/wrought-studio-bonsell-19-table-lamp-w002337865.html) which has iridescent finishes. The use of real-world photographic reference is meant to help glTF developers with calibrating material features and renderer behavior, to more accurately represent e-commerce products. Additional photo reference is available on the Wayfair website. @@ -17,7 +17,7 @@ The use of real-world photographic reference is meant to help glTF developers wi ## Materials -The glass material uses [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) for transmission and refraction, along with [KHR_materials_iridescence](https://github.com/KhronosGroup/glTF/pull/2027) for iridescence. +The glass material uses [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) for transmission and refraction, along with [KHR_materials_iridescence](https://github.com/KhronosGroup/glTF/pull/2027) for iridescence. The colors are caused by a type of glaze called [carnival glass](http://www.ddoty.com/newcomers.html). On the real product the glaze is applied to the inside of the glass cover rather than the outside. However because most rasterizers render only a single layer of transmission, the iridescent colors were applied to both inside and outside of the cover rather than only on the inside. @@ -25,7 +25,7 @@ The glass uses partial Metalness to improve the iridescent response, because the The iridescence on the glass uses a thickness range from 395 to 405 nanometers and a thickness texture for surface variation, which seems to match the iridescent colors in the reference photography. -The inner surface of the lamp shade uses a fully-metallic material with iridescence. On the real product this surface is a partially-transmissive metal foil; however to optimize the rendering in glTF this material has been simplified to not utilize transmission. +The inner surface of the lamp shade uses a fully-metallic material with iridescence. On the real product this surface is a partially-transmissive metal foil; however to optimize the rendering in glTF this material has been simplified to not utilize transmission. The iridescence on the lamp shade uses a thickness range from 485 to 515 nanometers and a thickness texture for surface variation, which seems to match the iridescent colors in the reference photography. diff --git a/Models/IridescenceLamp/glTF/IridescenceLamp.gltf b/Models/IridescenceLamp/glTF/IridescenceLamp.gltf index 4bae6bb4..89436c0b 100644 --- a/Models/IridescenceLamp/glTF/IridescenceLamp.gltf +++ b/Models/IridescenceLamp/glTF/IridescenceLamp.gltf @@ -342,4 +342,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/IridescenceMetallicSpheres/README.body.md b/Models/IridescenceMetallicSpheres/README.body.md index 72753fe0..d12c10aa 100644 --- a/Models/IridescenceMetallicSpheres/README.body.md +++ b/Models/IridescenceMetallicSpheres/README.body.md @@ -8,4 +8,4 @@ Scene to show the parametrization of the `KHR_materials_iridescence` extension w * Material Color: base color of the metallic base material * Thin Film Thickness: the thickness of the thin-film layer in nm -* Thin Film IOR: index of refraction of the thin-film layer \ No newline at end of file +* Thin Film IOR: index of refraction of the thin-film layer diff --git a/Models/IridescenceMetallicSpheres/glTF/IridescenceMetallicSpheres.gltf b/Models/IridescenceMetallicSpheres/glTF/IridescenceMetallicSpheres.gltf index 85c72337..ef5f85c0 100644 --- a/Models/IridescenceMetallicSpheres/glTF/IridescenceMetallicSpheres.gltf +++ b/Models/IridescenceMetallicSpheres/glTF/IridescenceMetallicSpheres.gltf @@ -14326,4 +14326,4 @@ "KHR_materials_ior", "KHR_materials_iridescence" ] -} \ No newline at end of file +} diff --git a/Models/IridescenceSuzanne/README.body.md b/Models/IridescenceSuzanne/README.body.md index edf23099..30b1e48a 100644 --- a/Models/IridescenceSuzanne/README.body.md +++ b/Models/IridescenceSuzanne/README.body.md @@ -8,4 +8,4 @@ A scene with three copies of Suzanne to showcase how the `KHR_materials_iridesce * Left: Dielectric base material with thin-film layer of constant thickness. * Center: Metallic base material with thin-film layer of constant thickness. -* Right: Transmissive base material with thin-film layer of varying thickness. \ No newline at end of file +* Right: Transmissive base material with thin-film layer of varying thickness. diff --git a/Models/IridescentDishWithOlives/README.body.md b/Models/IridescentDishWithOlives/README.body.md index b8ca0938..89730e05 100644 --- a/Models/IridescentDishWithOlives/README.body.md +++ b/Models/IridescentDishWithOlives/README.body.md @@ -10,7 +10,7 @@ ## Description -This model represents a real Wayfair product, an [Olive 21 fl oz. Covered Dish](https://www.wayfair.com/kitchen-tabletop/pdp/bloomsbury-market-olive-21-fl-oz-covered-dish-w001802862.html?piid=1661795386) which has a glass cover with an iridescent glaze, and a glass dish with the same glaze and gold leaf applied to the underside. +This model represents a real Wayfair product, an [Olive 21 fl oz. Covered Dish](https://www.wayfair.com/kitchen-tabletop/pdp/bloomsbury-market-olive-21-fl-oz-covered-dish-w001802862.html?piid=1661795386) which has a glass cover with an iridescent glaze, and a glass dish with the same glaze and gold leaf applied to the underside. The use of real-world photographic reference is meant to help glTF developers with calibrating material features and renderer behavior to more accurately represent e-commerce products. Additional photo reference is available [on the Wayfair website](https://www.wayfair.com/kitchen-tabletop/pdp/bloomsbury-market-olive-21-fl-oz-covered-dish-w001802862.html?piid=1661795386). @@ -26,7 +26,7 @@ The glassCover has an animation to rotate downward and back up, revealing the ol ## glassCover Material -The glassCover material uses [KHR_materials_iridescence](https://github.com/KhronosGroup/glTF/pull/2027) to reproduce the colored reflections from the glaze, and [KHR_materials_ior](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior) and [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) for refraction. +The glassCover material uses [KHR_materials_iridescence](https://github.com/KhronosGroup/glTF/pull/2027) to reproduce the colored reflections from the glaze, and [KHR_materials_ior](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior) and [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission) and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume) for refraction. The colors are caused by a type of glaze called [carnival glass](http://www.ddoty.com/newcomers.html). On the real product the glaze is applied to the inside of the glass cover rather than the outside. However because most rasterizers render only a single layer of transmission, the iridescent colors were applied to both inside and outside of the cover rather than only on the inside. @@ -36,7 +36,7 @@ Refraction is simulated using a `thicknessTexture` that guides rasterizers to re (above) Ingredients for the glassCover material. Top row: final render, normalTexture, thicknessTexture. Bottom row: iridescenceTexture, iridescenceThicknessTexture, and the iridescence effect isolated. -To improve the overall dispersion in pathtracers, the inside surface of the glassCover has been assigned a separate roughness from the outside. On the outside the roughnessFactor is 0.1 while on the inside it is 0.0. This helps renderers to avoid over-roughening the glass, because pathtracers can calculate the roughness on each boundary between glass and air, while rasterizers typically only calculate the roughness for whatever surface is nearest to the camera. +To improve the overall dispersion in pathtracers, the inside surface of the glassCover has been assigned a separate roughness from the outside. On the outside the roughnessFactor is 0.1 while on the inside it is 0.0. This helps renderers to avoid over-roughening the glass, because pathtracers can calculate the roughness on each boundary between glass and air, while rasterizers typically only calculate the roughness for whatever surface is nearest to the camera. ## Iridescence vs. Specular @@ -51,11 +51,11 @@ Previously this asset used [KHR_materials_specular](https://github.com/KhronosGr The glass dish uses a glass material with `KHR_materials_iridescence` for the colored glaze, and the bottom of the dish has gold leaf applied. Both surfaces use explicit geometry for front and back faces because the back side of each surface is visible behind the other material: from above the gold leaf is visible under the glass, and from below the glass can be seen through cracks in the gold leaf. -The gold leaf uses `"alphaMode":"MASK"` for the cracks instead of `KHR_materials_transmission` because most rasterizers render only a single layer of transmission. If transmission was used, the gold leaf would be invisible under the glass when viewed from above. +The gold leaf uses `"alphaMode":"MASK"` for the cracks instead of `KHR_materials_transmission` because most rasterizers render only a single layer of transmission. If transmission was used, the gold leaf would be invisible under the glass when viewed from above. ## Olives -Olives have been added to assist in judging refraction and occlusion. +Olives have been added to assist in judging refraction and occlusion. The upper surfaces of the glassDish and goldLeaf use a texture for precomputed ambient occlusion which simulates how the olives occlude lighting on the surfaces below them. Rasterizers may use this texture to occlude the IBL, while pathtracers will ignore the texture and calculate the occlusion themselves. diff --git a/Models/IridescentDishWithOlives/glTF/IridescentDishWithOlives.gltf b/Models/IridescentDishWithOlives/glTF/IridescentDishWithOlives.gltf index f138bc5c..d44f3594 100644 --- a/Models/IridescentDishWithOlives/glTF/IridescentDishWithOlives.gltf +++ b/Models/IridescentDishWithOlives/glTF/IridescentDishWithOlives.gltf @@ -674,4 +674,4 @@ "name": "glassCover rotation" } ] -} \ No newline at end of file +} diff --git a/Models/Lantern/README.body.md b/Models/Lantern/README.body.md index 6b48d6e4..e7c405a4 100644 --- a/Models/Lantern/README.body.md +++ b/Models/Lantern/README.body.md @@ -4,4 +4,4 @@ ## Description -Old wooden street light. \ No newline at end of file +Old wooden street light. diff --git a/Models/Lantern/glTF-Quantized/Lantern.gltf b/Models/Lantern/glTF-Quantized/Lantern.gltf index dcada2c6..61b79b2e 100644 --- a/Models/Lantern/glTF-Quantized/Lantern.gltf +++ b/Models/Lantern/glTF-Quantized/Lantern.gltf @@ -245,4 +245,4 @@ } ], "scene":0 -} \ No newline at end of file +} diff --git a/Models/Lantern/glTF/Lantern.gltf b/Models/Lantern/glTF/Lantern.gltf index 85fd5427..5b78025b 100644 --- a/Models/Lantern/glTF/Lantern.gltf +++ b/Models/Lantern/glTF/Lantern.gltf @@ -357,4 +357,4 @@ "source": 3 } ] -} \ No newline at end of file +} diff --git a/Models/LightsPunctualLamp/README.body.md b/Models/LightsPunctualLamp/README.body.md index a75951b4..101d9033 100644 --- a/Models/LightsPunctualLamp/README.body.md +++ b/Models/LightsPunctualLamp/README.body.md @@ -17,4 +17,4 @@ The addition of lights into the scene through the KHR_lights_punctual extension ## Creation Details -Model created using [Blender](https://www.blender.org/) and [Gestaltor](https://gestaltor.io/) by [Teresa González Viegas](https://www.artstation.com/teresagviegas). Optimized with [RapidCompact](https://rapidcompact.com/). \ No newline at end of file +Model created using [Blender](https://www.blender.org/) and [Gestaltor](https://gestaltor.io/) by [Teresa González Viegas](https://www.artstation.com/teresagviegas). Optimized with [RapidCompact](https://rapidcompact.com/). diff --git a/Models/MandarinOrange/README.body.md b/Models/MandarinOrange/README.body.md index 5a31e8d6..6072d811 100644 --- a/Models/MandarinOrange/README.body.md +++ b/Models/MandarinOrange/README.body.md @@ -5,7 +5,7 @@ _Screenshot from the development version of the [glTF Sample Viewer](https://glt ## Description -This asset is a test of the glTF extension [`KHR_materials_diffuse_transmission`](https://github.com/KhronosGroup/glTF/pull/1825) to demonstrate the scattering of light through the fruit of the orange. +This asset is a test of the glTF extension [`KHR_materials_diffuse_transmission`](https://github.com/KhronosGroup/glTF/pull/1825) to demonstrate the scattering of light through the fruit of the orange. ![screenshot](screenshot/with-without.jpg) _Two screenshots, with KHR_materials_diffuse_transmission (left) versus without._ @@ -14,4 +14,3 @@ _Two screenshots, with KHR_materials_diffuse_transmission (left) versus without. _The textures. Top row from left: base color, occlusion, roughness. Bottom row from left: normal, diffuse transmission factor, diffuse transmission color._ The [original model](https://sketchfab.com/3d-models/orange-774bc66d11c24855bf722e35249fddf7) on Sketchfab from zandreamer is a photogrammetry asset which only contains a base color texture. All the additional textures were created by processing the base color through a series of filters in various art tools. - diff --git a/Models/MaterialsVariantsShoe/README.body.md b/Models/MaterialsVariantsShoe/README.body.md index ab0674a9..d5c53adf 100644 --- a/Models/MaterialsVariantsShoe/README.body.md +++ b/Models/MaterialsVariantsShoe/README.body.md @@ -7,4 +7,3 @@ This model uses the KHR_materials_variants extension. It is a shoe with 3 color variants in it: "Beach", "Midnight", and "Street". If each variant was a separate model, they would be 5.4 MB each. Combined they make up a single model that is 7.8MB since they share geometry and all textures except the base color texture. - diff --git a/Models/MetalRoughSpheres/README.body.md b/Models/MetalRoughSpheres/README.body.md index 3082d194..e3a5ad82 100644 --- a/Models/MetalRoughSpheres/README.body.md +++ b/Models/MetalRoughSpheres/README.body.md @@ -4,4 +4,4 @@ ## Description -Tests various metal and roughness values (texture mapped). \ No newline at end of file +Tests various metal and roughness values (texture mapped). diff --git a/Models/MetalRoughSpheresNoTextures/glTF/MetalRoughSpheresNoTextures.gltf b/Models/MetalRoughSpheresNoTextures/glTF/MetalRoughSpheresNoTextures.gltf index 835baaab..1d44756c 100644 --- a/Models/MetalRoughSpheresNoTextures/glTF/MetalRoughSpheresNoTextures.gltf +++ b/Models/MetalRoughSpheresNoTextures/glTF/MetalRoughSpheresNoTextures.gltf @@ -4957,4 +4957,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Models/MorphPrimitivesTest/README.body.md b/Models/MorphPrimitivesTest/README.body.md index 984ccd1d..18caff47 100644 --- a/Models/MorphPrimitivesTest/README.body.md +++ b/Models/MorphPrimitivesTest/README.body.md @@ -17,5 +17,3 @@ If the red area or green area is missing, particularly in the Draco-compressed v ## Author Model by [@ft-lab](https://github.com/ft-lab). - - diff --git a/Models/MorphStressTest/README.body.md b/Models/MorphStressTest/README.body.md index 704ebd1e..d5250469 100644 --- a/Models/MorphStressTest/README.body.md +++ b/Models/MorphStressTest/README.body.md @@ -59,4 +59,3 @@ and the remainder will be frozen the entire time. BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE). - diff --git a/Models/MosquitoInAmber/README.body.md b/Models/MosquitoInAmber/README.body.md index c38da92b..cb77e2d6 100644 --- a/Models/MosquitoInAmber/README.body.md +++ b/Models/MosquitoInAmber/README.body.md @@ -17,4 +17,3 @@ Model by Loïc Norgeot and mosquito scan by Geoffrey Marchal for Sketchfab licen - License: [CC-BY-4.0](http://creativecommons.org/licenses/by/4.0/) - Source: [real-time-refraction-demo-mosquito-in-amber-37233d6ed84844fea1ebe88069ea58d1](https://sketchfab.com/3d-models/real-time-refraction-demo-mosquito-in-amber-37233d6ed84844fea1ebe88069ea58d1) - Generator: "Sketchfab-7.51.0, hand-edited to add additional PBR glTF extensions." - diff --git a/Models/MultiUVTest/glTF-Embedded/MultiUVTest.gltf b/Models/MultiUVTest/glTF-Embedded/MultiUVTest.gltf index e968a2c9..4649db03 100644 --- a/Models/MultiUVTest/glTF-Embedded/MultiUVTest.gltf +++ b/Models/MultiUVTest/glTF-Embedded/MultiUVTest.gltf @@ -1,255 +1,255 @@ { "accessors" : [ { - "bufferView" : 0, - "componentType" : 5121, - "count" : 36, + "bufferView" : 0, + "componentType" : 5121, + "count" : 36, "max" : [ 23 - ], + ], "min" : [ 0 - ], + ], "type" : "SCALAR" - }, + }, { - "bufferView" : 1, - "componentType" : 5126, - "count" : 24, + "bufferView" : 1, + "componentType" : 5126, + "count" : 24, "max" : [ - 1.0000004768371582, - 1.0, + 1.0000004768371582, + 1.0, 1.0000005960464478 - ], + ], "min" : [ - -1.0000003576278687, - -1.0, + -1.0000003576278687, + -1.0, -1.0000003576278687 - ], + ], "type" : "VEC3" - }, + }, { - "bufferView" : 2, - "componentType" : 5126, - "count" : 24, + "bufferView" : 2, + "componentType" : 5126, + "count" : 24, "max" : [ - 1.0, - 1.0, + 1.0, + 1.0, 1.0 - ], + ], "min" : [ - -1.0, - -1.0, + -1.0, + -1.0, -1.0 - ], + ], "type" : "VEC3" - }, + }, { - "bufferView" : 3, - "componentType" : 5126, - "count" : 24, + "bufferView" : 3, + "componentType" : 5126, + "count" : 24, "max" : [ - 1.0, - 6.661325971652322e-16, - 1.0, + 1.0, + 6.661325971652322e-16, + 1.0, 1.0 - ], + ], "min" : [ - -1.0, - -2.9802322387695312e-08, - -1.0, + -1.0, + -2.9802322387695312e-08, + -1.0, 1.0 - ], + ], "type" : "VEC4" - }, + }, { - "bufferView" : 4, - "componentType" : 5126, - "count" : 24, + "bufferView" : 4, + "componentType" : 5126, + "count" : 24, "max" : [ - 0.7499566674232483, + 0.7499566674232483, 0.9999134124518605 - ], + ], "min" : [ - 8.658754813950509e-05, + 8.658754813950509e-05, 8.660554885864258e-05 - ], + ], "type" : "VEC2" - }, + }, { - "bufferView" : 5, - "componentType" : 5126, - "count" : 24, + "bufferView" : 5, + "componentType" : 5126, + "count" : 24, "max" : [ - 0.25, + 0.25, 0.25 - ], + ], "min" : [ - 0.0, + 0.0, 0.0 - ], + ], "type" : "VEC2" } - ], + ], "asset" : { - "copyright" : "hiloteam", - "generator" : "Khronos Blender glTF 2.0 exporter", + "copyright" : "hiloteam", + "generator" : "Khronos Blender glTF 2.0 exporter", "version" : "2.0" - }, + }, "bufferViews" : [ { - "buffer" : 0, - "byteLength" : 36, - "byteOffset" : 0, + "buffer" : 0, + "byteLength" : 36, + "byteOffset" : 0, "target" : 34963 - }, + }, { - "buffer" : 0, - "byteLength" : 288, - "byteOffset" : 36, + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 36, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 288, - "byteOffset" : 324, + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 324, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 384, - "byteOffset" : 612, + "buffer" : 0, + "byteLength" : 384, + "byteOffset" : 612, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 192, - "byteOffset" : 996, + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 996, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 192, - "byteOffset" : 1188, + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 1188, "target" : 34962 } - ], + ], "buffers" : [ { - "byteLength" : 1380, + "byteLength" : 1380, "uri" : "data:application/octet-stream;base64,AAECAwEABAUGBAcFCAkKCAsJDA0ODA8NEBESEBMRFBUWFBcVAACAPwAAgL///3+/AQCAvwAAgL/9/38/+v9/vwAAgL8DAIC/AACAPwAAgL8AAIA/AwCAvwAAgD/6/38/BACAPwAAgD/3/3+///9/vwAAgD8AAIC/9f9/PwAAgD8FAIA/BACAPwAAgD/3/3+/AACAPwAAgL8AAIA/AACAPwAAgL///3+/9f9/PwAAgD8FAIA/9f9/PwAAgD8FAIA/AQCAvwAAgL/9/38/AACAPwAAgL8AAIA/AwCAvwAAgD/6/38/AwCAvwAAgD/6/38/+v9/vwAAgL8DAIC/AQCAvwAAgL/9/38///9/vwAAgD8AAIC///9/vwAAgD8AAIC/AACAPwAAgL///3+/+v9/vwAAgL8DAIC/BACAPwAAgD/3/3+/AAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAP+z/PzMAAJg0AACAP+z/PzMAAJg0AACAP+z/PzMAAJg0AACAP+z/PzMAAJg0AACYtAkA4LMAAIA/AACYtAkA4LMAAIA/AACYtAkA4LMAAIA/AACYtAkA4LMAAIA/AACAv///D7QCAHC0AACAv///D7QCAHC0AACAv///D7QCAHC0AACAv///D7QCAHC0AACANAAAYDQAAIC/AACANAAAYDQAAIC/AACANAAAYDQAAIC/AACANAAAYDQAAIC/AACAPwAAAAACADA0AACAPwAAgD8AAAAAAgAwNAAAgD8AAIA/AAAAAAIAMDQAAIA/AACAPwAAAAACADA0AACAPwAAgD8AAACzAAC4NAAAgD8AAIA/AAAAswAAuDQAAIA/AACAPwAAALMAALg0AACAPwAAgD8AAACzAAC4NAAAgD8AAKA06f8/JgAAgL8AAIA/AACgNOn/PyYAAIC/AACAPwAAoDTp/z8mAACAvwAAgD8AAKA06f8/JgAAgL8AAIA/AACAP8F8EZ0BAJg0AACAPwAAgD/BfBGdAQCYNAAAgD8AAIA/wXwRnQEAmDQAAIA/AACAP8F8EZ0BAJg0AACAPwAAgLT2/w+nAACAPwAAgD8AAIC09v8PpwAAgD8AAIA/AACAtPb/D6cAAIA/AACAPwAAgLT2/w+nAACAPwAAgD8AAIC/AAAAnAAAgLQAAIA/AACAvwAAAJwAAIC0AACAPwAAgL8AAACcAACAtAAAgD8AAIC/AAAAnAAAgLQAAIA/AAAAPwIAAD+sBYA+rgWAPq8FgD4BAAA/AAAAP7AFgD6sBYA+Ufp/PwAAAD8q/T8/rQWAPir9Pz/6//8+U/p/PwAAAD8q/T8/KP0/PwMAAD8AAAA/AgAAPyn9Pz8s/T8/AAAAPwDgtTisBYA+rgWAPgAAAD+wBYA+rgWAPgCgtThWlrU4Kf0/P68FgD4BAAA/Vba1OAAAAD+tBYA+Kv0/P60FgD4q/T8/AAAAPwIAAD+vBYA+AQAAPwAAAD8q/T8/AACAPgAAgD4AAAAAAAAAAAAAAAAAAIA+AACAPgAAAAAAAAAAAACAPgAAgD4AAAAAAAAAAAAAAAAAAIA+AACAPgAAgD4AAAAAAAAAAAAAgD4AAIA+AACAPgAAAAAAAAAAAACAPgAAAAAAAAAAAACAPgAAgD4AAIA+AAAAAAAAAAAAAIA+AAAAAAAAAAAAAIA+AACAPgAAgD4AAAAAAAAAAAAAgD4AAAAAAAAAAAAAgD4AAIA+AACAPgAAAAAAAAAA" } - ], + ], "cameras" : [ { - "name" : "Camera", + "name" : "Camera", "perspective" : { - "aspectRatio" : 1.7777777777777777, - "yfov" : 0.5033799372418416, - "zfar" : 100.0, + "aspectRatio" : 1.7777777777777777, + "yfov" : 0.5033799372418416, + "zfar" : 100.0, "znear" : 0.10000000149011612 - }, + }, "type" : "perspective" } - ], + ], "images" : [ { "uri" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAA69UlEQVR42uzdQa4tyVW24Ro5bZiBXTUEs69HAj3TYBRugCzROUDD4nJqZ8ZakRG5M1Y8j/RK2C7bP+b6l+LbmZG/fAH7+tsfJe0aALCdX/xHAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQBwAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAACHIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABAHAIkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACS/P9/AGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAMAA4BAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQBAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYAyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUAyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAABT/Ne//JOkTQMADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGADAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYAyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUAyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAYADwHwEYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwCFIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAAHIIkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgAwADgESQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJ/j9AADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAGAAcAiSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAABjB4Af//br15Ve3/7nd3871V/+GP/rNK1//ssfHvmvn/nn/e9fO/t/j9X7h3/9D0mb9o9/+ndJmwYYAJ4zAEQGAQe3Rx7uzw7cV/49HeQNAJIMAJIMAMAHB4DXyYF/2ADw8+H/+/+sxw0HrQHg7J8f+dc2ChgAJBkAJBkAgBsHgFfj8D/8UX+H/o/88t9zuD46lI84rP/8zx958J/xxIIBQJIBQJIBADAAXH0aQI8dFr4XPWS3ngqIjAc9A4MnCAwAkgHAIUgyAAAGgOB7/rcc/r1//6h/n3cH/cij+T2P/mf+/uhQMOJ/ZwOAJAOAJAMAUHYAeCXe/R9yyd/3Q4onAG47uLYes28d/s8O5D2/0F+5E8Av/AYASQYASQYA4MIA8PpkDmupw3v0sB4ZDc7+tVt/Te8hPzo09I4UKzzFYQCQZACQZAAAag4ArUsB/Zp/aQy48tRA5F+vNUBE7wPIvC7QMwBEh5BPXkxoAJBkAJBkAAA+dgfA8AHg6NH+6N/nBv/04/HRx/TP3uvv+dcZ+Wt85rWCOwYATwBIMgBIMgAAJQeA16gvAEQ+/+eR/tQn9nqfFsi8N996KiD7dYCe1wQyo0LPmOEOAEkGAEkGAGD7VwBeI58MiAwARoDw++6j34HvPcxnDu/R9/zPniTovYjwSQf/J/y/xSFIMgBIMgAABoDDrwBceiXg+2P90VcDPN4/7L6Ansfis4/5R3/xzx7ks08sXLlQcJcnBByCJAOAJAMAsOkA8Ap87u/SfQBnA4D3/Yf9Ot9zkM9+yi86AGTHgZ5/LHKJYetJg8hI0nPp39OHBIcgyQAgyQAAeALg8BA//LH/4hf+XXlHf/Qj/yMP4yOGgKv/GtnXBXqepMjee+AJAEkGAEkGAGDJVwB84u++QSB7O33vr9GjmvGv+aQBYMTnGA0AkgwAkgwAwLIDwNRL/zZ//H/25+lWPODf+f/OzOP/BgBJBgBJBgCg3ABw9CWAqU8GeNf/0mcAW4fYEe/gV6r3ngADgCQDgCQDAFB2ABh68N/08r/od+9bB9DoxXytQ3y1Q37P/z6Z/4wqDgIOQZIBQJIBADAAvP313/v/cz/xd3bIvHLbffVf8Wf975v93OCIrwYYACQZACQZAIBH3AFw+fB/9Mj/xo//9/zKHLlIcJdD/+hh4GxwqXhhoEOQZACQZAAANh4AXrMHgLNRwLv+ly4I9DTA2AEg+jrAjKdBDACSDACSDADAlAFgygV/rcf8F38V4Mqj/aP+vTKHW08G9H1esDUGuANAkgFAkgEAWP4VgKE3/7cO/379Dz867jB//xcAIn9d5HLHuwYnA4AkA4AkAwDQdQdA9wBwdOj3yH/zc33Zf77GvxqQuXwxc1h/2tMDDkGSAUCSAQDY8BWA15VLAM9u+i/yyP+sS/8yl82dXf6nNS4ONABIMgBIMgAAHxsAXqNv/o8OBJs/yt87AGid4aD1pQYDgCQDgCQDALDOAPDucf7WUwGbPd4fvVTu7N1y1bhI0CWAkgwAkgwAwNpPABz9ul/04D/iMrfI4+MGgDq//o8cAEYPCQ5BkgFAkgEA2OwOgOGP/xsAup8OMACs+5nAzJ+RpzwR4BAkGQAkGQAAA8D1T/4ZAE4P+L0Xzum5A0Dkr/UKgCQDgCQDALDuANB6BWCTG/0zn/nzzv/eg8GTngpwCJIMAJIMAMBmA8BrdhuNANHP+BkA6h/2M3cE9HxFwgAgyQAgyQAAdD0BMOW9/7MvBGyex//3GwAiTwVEPx9pAJBkAJBkAADuHwC+Hyoi/5gBwACw6dcBsgf82XcKOARJBgBJBgBgowHAY//zLwTMXhyn+gNA5EmA7HBgAJBkAJBkAACaA8DwzwBu/Nj/0aHPJ/72PugfvR7QMy6NHAMcgiQDgCQDAGAA6H/3v/hnADMjQOuXW4dmA8CnPxnoECQZACQZAACvAIy7DLDoY/6RX2h7vx0v9wLc8f6/AUAyAEgyAAAGgHEDQLH3/Hu/6Z75lVh7fy0gc/gfMQo4BEkGAEkGAMAA4CLAi08KOOyr9ct/9CA/8/UAhyDJACDJAAAYAPof+d/88O/Xfo0eAGaOAA5BkgFAkgEAMADkH/Xf8ODvYj/NugfgbDAwAEgyAEgyAACfHQCMAAYADftqwJVLKA0AkgwAkgwAwJgB4N1hf6OLAFuXtDnYatRXAFoDwIivAzgESQYASQYAwACQf+e/8ABwdgBz8NfV9/8zB/nRrwU4BEkGAEkGAMAAkBsAvv99Hv2Xwp/+i3zyzwAgyQAgyQAAfOYOgLOnALz/L4VHgOwj/0d/2wAgyQAgyQAAzBsANv/839kvtg66yr4KcOen/wwAkgwAkgEAMAD0ve+/0QAQfXfb3QCafTngqJHAIUgyAEgyAAAGgK9LTwZs8gRAdiiQrowBZ68EGAAkGQAkGQCAuQPAu08CbvjLvy8CaPZ9AZlPAGYuFXQIkgwAkgwAgAGg7x6Awod+7/jraUOAOwAkGQAkGQCAOQPAu1/6N3z33xCgSkOAQ5BkAJBkAAAMALH3+wsOAK1b/SOfZpNmfyow+0UBA4AkA4AkAwBw/Q6AxQeA1kHq6B9r3dwuzfylv3UHgAFAkgFAkgEAGD8AbPCYf/TXWOmTj/33PAXgECQZACQZAAADQO4VgOLv/0e/1y598mkAA4AkA4AkAwCQGwC+v9v//YBf6PH/zMHfr/56yl0AmXsqDACSDACSDABA7gmAo1Gg+ADgM4B6wgAQufDPEwCSDACSDADA+DsANvvUnwO/njgGZH7xPxsQHIIkA4AkAwBgAHj/q3/kFYGFH/WPHp6kpwwAV78Y4BAkGQAkGQAAA8A2TwVE3/M3AGilewK8AiDJACDJAADkB4B3FwAufPDPHuod/FXpU4EGAEkGAEmAAaDvF/6FhoDIO/4e/VfV1wAMAJIMAJIMAMAvlx7zX2QAaB3+M5enSU/7KkDv+/8GAMkAIMkAABgA8k8BFPoSQOvza9LTPwuYeSrAIUgyAEgyAAAGgOOb/wu+AtD6tdThU0+//K/3VQCHIMkAIMkAABgAcpcCFnkCoHUfgPTEpwHcASDJACDJAADMHwAK5nCpKrf/R/4ahyDJACDJAAAYAN5/9q/4AODzf6r6FMDRaOAQJBkAJBkAAANAuScAou9RGwBU6WkAXwGQZACQZAAA8gPAQgf9nsehIzerS0/8GkDkz/bRn3OHIMkAIMkAABgA3h/6i74GkPklVXry5wDP/ix7BUCSAUCSAQAMALkb/4sMAJH3qR02teoFgK2nXv7+jzkESQYASQYAwABwfhlgkQHAL/2qMgBE/z5PAEgyAEgCDABbDQCZw5LDplZ6CiD7dQCHIMkAIMkAABgAlh4Aoo9I9349QHrqENAaAL7/fQ5BkgFAkgEAMAD8/rBf9Nf/1q+p0mpPAGS+CuAQJBkAJBkAAAPA8VMARd/9NwBo5a8BGAAkGQAkGQCAcQPAhjlkasURIPppSwOAZACQZAAADABlDv/RR/t9AlAVB4DIf0ccgiQDgCQDALDjAPDzwaDQEHD1U2rGAFV4LcAAIMkAIMkAAPxyett/4dcAMu9QO1jqqYf83ssCDQCSHIIkAwBgAFj64B858EQHAGmVz/61BgIDgCQDgCQDAPB/A8DZo/9FLwHMfE/dMKCVngIwAEgyAEgyAADvB4DW4b/oEBD5nroBQKtfBnj2Z9kAIBkAJBkAgF1fATg68L8bABYZBCKX+jnkq+orAZEnARyCJAOAJAMAYAA4//W/0JcBok8FOGhqtdcBIn+uHYIkA4AkAwBgACj9CkDPzekOmlrpSYDo0zAOQZIBQJIBADAAfJ1+HaDYJwCligNA5IsYDkGSAUCSAQAwAHydfh2g+NcApB1+/TcASAYASQYAYNcB4Pu7/Uf/c5Ff/t34LwOAAUAyAEgyAACeACh06O8ZBhwoVX0UMABIcgiSDADA7gPAu1v+iw8BDora+QsBDkGSAUCSAQDYeQAo9AWA1q+hrUOSVOGwf/bfAYcgyQAgyQAAGABK//KfPThJqw0APgMoyQAgyQAAxO4AOBsFij72bwRQ9ff/vQIgyQAgyQAABoDYp/+KDQBHf9vhUVUv/3v3jzkESQYASQYAYPcBoPglgJlb/w0DWu19/8xdGA5BkgFAkgEA2G0AOPrV/91XARY84Ecu/4v8z9IqF/4d/TUGAEkGAEmAJwDOH/cveiFg6wI1B01V/gSgAUAyAEgyAAAGgOMDf7EhwCFROz0RYACQZACQZAAAA8BX6EsAxQYAh0bt9mv/u/8OOARJBgBJBgDAAFB+CGj9MupQqQpjQOu/Bw5BkgFAkgEAMAAsPwBkvoXeujldWumX/8x/HxyCJAOAJAMAYACI3Qmw6JcAoo9HS08/+Ge/bPH9r3cIkgwAkgwAgAGgxCP/kUegjQDa5Z1/TwBIMgBIMgCAAaDMr/6j7gUwAKjaEwIGAEkGAEkGACA2ABQZA94d7v3qr50uAPz+1zgESQYASQYAwABQcgDIDANSpUP/0dMBDkGSAUCSAQDYfQD4fugvNABELgeUqn72zysAkgwAkgADQPvyvw3uBHCY1G6jgEOQZACQZAAAdhwA3h3yiw0A0U//GQS00iV/Vy4GdAiSDACSDACAOwBKfgkgcku6AUCr3vLf8xSAQ5BkAJBkAAAMAOcjwMLDQPQzaQ6ZWm0EyH4C0AAgGQAkGQAAA8D7R/+LvA5w9uuoX/9VfQD4/q/hECQZACQZAAADwPGv/ou/FnDlHWpphbsAMk+3OARJBgBJBgBg9wHg7BJAA4C01K3/7gCQZACQZAAAzgeAgpcARr4McPWmdenTA0DmHgCHIMkAIMkAAOw8ALTe+y82CBgAVOnAH7n9/+e/3yFIMgBIMgAA7gDY4rOAkQOTw6ZWGAAin7g0AEgyAEgyAIABoH3QLzoARN+flp5+8//Z4d8dAJIMAJIMAMCWTwBED1UGAK1y2V9kADj6xxyCJAOAJAMAYAAo/QrAu/f7W/cAOHxqhacAon/mDQCSHIIkAwBgAPj9pX/vXgPYYADwKoCqv/9vAJAMAJIMAIAB4HwAOPrbCw8ArfekPQmgVZ8OMABIMgBIMgAA7VcAfj44nP19BS8GNABo1V/7M2OAAUAyAEgyAAAGgPdPAhwd8gt+GtCj/1r5cX8DgCQDgCQDANAeAN79sl/8gN8zBBgJ9IQRIPskiwFAkgFAkgEADADxW/8XGwPOLvfr+Wa6CwL1xAEgcqeFrwBIMgBIMgAAfQNAwScCMr+sSk8cBjwBIMkAIMkAAFwfAIq9EhA9HEXer3YQ1afvAsh+1cIAIMkAIBkAAAPAV+XXAUa+OmAA0BMGgMjrLK2nWhyCJAOAJAMAYADY4kmAnqcEMr/KSrMHgczTKgYASQYASQYAMADEvgLgywDNpwKkJw0AXgGQZACQZAAAtr8DwKFfld77770A0AAgGQAkGQAAA8D2A0Dk8X/pkwPA1Uf/DQCSHIIkAwBgAPDu/8nhyWWAesJn/rwCIMkAIMkAAMwbAH4+NLy7L6DQVwF637F2YNWMd/tbg9TZUGAAkGQAkGQAAK4NAO/GgI3uBvDLv+4eAHpeVzEASDIASDIAAGMGgKKvBpxdpubgr9Vv/DcASDIASDIAgAEg995/4bsBzg5bmcewjQSacfmfAUCSAUCSAQC4bwB4d9D3ZQCfCtTHB4DekcAhSDIASDIAAAaA/KWAhQaAd4eps8OZA7/ufPQ/e1mgAUCSAUCSAQC49gRA0V/8ozerX/mGu3R1ADgaqQwAkgwAkgwAwJwBYIPH/8+eBogc3BxkNeu1gBFfBHAIkgwAkgwAgAEgfulfkQGg5/AU/Ya71Pu+/+wvATgESQYASQYAwABgALj4z3W4VXYAaF0kOeq9fwOAJAOAZAAADAD9A0DRR/17BgB3AOiuAcATAJIMAJIMAIA7AG5+QsAlgJp14d/sHIIkA4AkAwBgAOgbAAq/DnD2i63PAmrGADDqoj8DgCQDgCQDADBuAPj7gWKDLwK4B0B3DgCt1wWuDgMOQZIBQJIBADAAGAEuHrQcajXisf/olwEMAJIMAJIMAMBnXgEo9BTAqK8DOPCq533/yK//V/4MOwRJBgBJBgDAALD1HQDZASBysHPwVc/n/GZfEOgQJBkAJBkAAAOA2/87DmOZEcAwoMifndkXAToESQYASQYAwADg4r8JdwYYANR6CqDnFQEDgCQDgCQDADBvAPj5EGEc6Ho9wCF4v8P+ldcAZr0K4BAkGQAkGQCAjQaAH6PuANjgQsDew3/0M2/a+9K/7GcmDQCSDACSDABAegCYMgJsNAC0DnoGAM2+zM8AIMkAIMkAAMwZAI4e/TcAeA1Ap68A9DzWP3M8cAiSDACSDADAhgPAz0379b/wINDzhQCH4z1/9X/SEwEOQZIBQJIBADAAXP8qwLuDvgHAwX+ji/6e+ti/AUCSAUAyAABeARjzS/+GrwBkXxEwBux5078BQJIBQJIBAKgxALgLoOvR7+wvylpzADgbgAwAkgwAkgwAwMdeAfgx+sC/4ZMAkYNdzyPlWus9/94LIg0AkgwAkgwAwFoDgMf/u54acKiu8Xm/FV4HcAiSDACSDADAxgOAR/8//6TA2QHTgXu9T/0ZACQZACQZAIDHDgDT7wXw+H/qlQADwDq//p8NOiP/vIwaFRyCJAOAJAMAsOkA8OodAM5u/y8yAMz8FXfUJ+f0jMf+V/pz7RAkGQAkGQAArwDM/fV/o1cDIpfERV8BMAB89lb/yP9Nshf7+QqAJAOAJAMA8LEB4JbH/ze7GyD6qHjkM3FGgPt/4Y8MA6v+2XQIkgwAkgwAgAHg3vf/iwwCVw6CrcNnZAAwCsz/pN9TPt9nAJBkAJBkAACGDABTLwIsPABcGQxarwNE7g3wlMC4G/yr//JvAJDkECQZAAADwNgBoNAlgLMv/4v8ddkLBA0A1973731FwwAgyQAgyQAALDUADP2135MAw78SEP213ycE/xD+zzHztIYBQJIBQJIBAHAHwJVXAgwA4fsFIofcq58bNADUzyFIMgBIMgAABoD7RgC/7IcOn2e/NLcOtDu+EpC9Z6H3M34GAEkGAEkGAKDEADB0CNj4PoCrXwfo/ddpvdM+6lf0VX71zz5dkf3Pecb//Q0AkgwAkgwAwC2vALwbAIZfDrjZr/1XDoWRX68zTxlE7g6I/KL+1M/4Rf7zzn7er+fpAAOAJAOAJAMAsMQTAK+DAeCHVwCG/6Kf/dX56giQGQBGPQ0wYkjIPOHQ8znFyABQ5VOADkGSAUCSAQAwAPzukD/8E4G+BnDrEwbRx+NnP4o/cgC48hh/5P+NI58CMABIMgBIMgAAjx4Ahv7qn/kkoEsCh18s2Pr7o792XzmgRw79mX//3kf5o68NuARQkgFAkgEA2HYAuPVLAMUHgJF3AGReAcg8Rt/7dEDm1/boANDzn2H232/HLwI4BEkGAEkGAMAAMOfyP/cCDB8JRt5YH7k9P3uA7v3aQOQ/g8x/PpFf+qPjhQFAkgFAkgEAKHkHwJRPAhoApj7uf/WJgasDwNVPCWZHiZmHdQOAJAOAJAMAsN0A8PpkDvvDv1nfc/N99NOCowaA7Dv6Mw7/7gCQZACQZAAAtnsF4GOvAxgCwrfaXxkQMhf4ZW/yH/kZvcx7/607CAxKBgDJACDJAAAYAN4MAbc+HeCLAI8bGKJPFMx8pP7KZ/qqX+ZnAJBkAJBkAACG3wFw6+sBZ18EMApM/8LAjH/+HQfxngsFDQCSDACSDACAAeDkKYDprwWcPQVgAJg+GmTvFoj8z9FH8a88sm8AMABIMgBIMgAAg54AOLoT4MedrwIYAG4dBUYcnjOf+8tc/jfy6wcGAEkGAEkGAMAA8KlXAdwF8JGb60ccmLOH+BkH9CsXDhoAJBkAJBkAAAPApz8V6OA2/dA8+umBTx7A77rfwAAgyQAgyQAAlHwFIHo3gAHAFwUqjiQGAEkGAEkGAMAAMPNSQAOAZACQZACQZAAA7n8F4BUcCNKHewOAywRlAJBkAJBkAACefQfALa8CfD/I+ELAox+bf3cfgMf9DQCSDACSDACAAeD6OGAAmHqQvnLInjUsyAAgyQAgyQAATH4F4HXnu/89nw10yHvUkwPZQ7tDvgFAkgFAkgEAeMgTAK8nfR7QfQFeRZABQJIBQJIBAJj/CsDUVwHe/ap/9Lcd/CUDgCQDgCQDAHDvAOCXfskAIMkAIMkAAHgCYM4AYBSQDACSDACSDADAvAHg1bgb4DXr6YCjzwIaBKTTz2Y6BEkGAEkGAMAA8DXryYBbXg/4fh+AAUAyAEgyAEgyAIAB4N7D//RDfuYSQWnzEcAhSDIASDIAAAaANUYAA4DP/Kn9CszBr/8GAMkAIMkAABgA6g4B7w5IRgEDQMFH+5t/3g0AkgHAIUgyAAAGgNlfBHjckwEGAFX95b/1FIwBQDIASDIAAAaAbZ4I8KUA7fREwJs/9w5BkgFAkgEAMADsMwR8Pyg5OGqDd/+9AiDJIUgyAAAGgP1GAL/+q/orAD4DKMkAIMkAAHxiAHgFB4BbBoGzi9OkSo/8ewJAkgFAkgEADABP/eV/+gDQujk9+mi1tODB3wAgySFIMgAABoCPDgAfeSUg8/60w6ZWGgAC44BDkGQAkGQAAAwAX08dBqa993/2ZIBDpp58sV/ks38GAEkGAEkGADAAPPmwbwCQAeDkz2nrqRYDgCQDgCQDAPCkAeDV8ddNeQXg6LAUuSfAUKBPPhHgDgBJBgBJBgCgwisA0weAxOPSBgA98n1/XwGQZACQZAAAVh0AXndfBNg6RDns62m//hsAJBkAJBkAgCpPALQOLtPGgdZB6+weAemOT/tl7gNo/DUOQZIBQJIBADAAPG4AiFwWeOtrAZG7AaTez0r2Pq2S/HPsECQZACQZAAADwNeTLwec/iTAle+sO+Bq5AAQfQ3AJYCSDACSDADASgNA5lf/W14H6Pll1asBmvEKQPbvNwBIMgBIMgAAqzwBMOPegOkXCB5dzib1PAkQGZ0MAJIMAJIMAEB8APhtiUP9oweAyMHMgVetASA6LPV+vtIAIMkAIMkAAAYATwBM+HqAAUCRX/Zbj/1P/nPrECQZACQZAACvACxz2I8c/j8yEBgAHPKP/u/ec+GkAUCSAUCSAQDYYQB4BV8LeNQAEP3CgPb4lT/7aL8BQJIBQJIBAPAEwPm9AK8Vyj4ZYDxY/ymAh/5ZdAiSDACSDADAlgPAb18r3QfwajwJ0POqwC1fBmj9ImwAqP0aQOR1EQOAJAOAJAMAMGcA+O3r//frV7VPA055QuDqpW3RW99bh0Y9/13/Bz3ybwCQZACQBBgAyh38z54GuO1TgJlLAjNfFPClgTUHgA/c8t+6E8MhSDIASDIAANsNAN8PzmuOAq+nfiJw1EWBBoD5B/jo/w2iFwB++BH/V+N1GYcgyQAgyQAAGACWfi3gFbwz4LZf+7P/vNavxw7uY2/pbw0AR/936X2q48Zf+A0AkgwAkgwAwJsB4N1hv8brAa/AOHDLHQGZQ3/v3QEa++j+zEP8pFEg8mfZACDJIUgyAABb3wFwVI3L/1pPAizxqkD2zgD1PQ2QHWgedrlf5NUXA4AkhyDJAAAYAA4GgHoXBT7uEH/HUwE73B/QM4xEPtMY/dsPGAMy/z1wCJIMAJIMAIBXALYaAJa8KHDGAND7r7HKr/k9lwFmfvH/wGV/Z3+eDQCSDACSDABA8gmAWhcCnh2UXhXqOSBnLsY7+vfJ/v133ugf+aRi5jLABz7u3/s0gEOQZACQZAAADAAlBoDsL6Kv1Z8MyBzIeweA7KV6IwaA1gDx0Mv4njQGGAAkGQAkGQCA7Z4AWO7OgOz7/61PBmYeWc/8c7NjQGYwyLz2kP3P7srh/4anAyLj1JU/+w5BkgFAkgEAMAB8e/f/t9KfCYx+PnCJiwOvHOIz/9xRh+HWMDDz4r3I+/4ffnLAACDJACDJAAB88AmAOp8KvHKAKnWJYOY1gMy9A5HPFWYvHRx9AF/g8f/Wn8nXhSdfHIIkA4AkAwBgACh/8O/9UkDZAeDKY/I99wy0BoArj+o/+NK+3l/6R7/SYgCQ5BAkGQAAA4DDf9WvA8w6/Ecf/8/cGTD6SwiLDgBXL7WMDAYOQZIBQJIBADAAJA7/9QeBUof4Ow/F0X+fBQ/sdx78f0x8IsAhSDIASDIAAAaAxBDgqYDXyUHttdPrAr2P4be+FLDRAHD3n2OHIMkAIMkAABgAkk8C7DkARL8e8LivCtz5y36hy/juvOzvx02DgEOQZACQZAAADAAdTwDse+DPPh2gxqG/8Bhw5c/XywAgyQAgyQAAfG4AaN0LsN/rASNufpdH/O8aARyCJAOAJAMAYAC4eBeArwZkHu/263/ir3ng0wEjf8V/uQNAkgFAkgEAeN4A8KtPBiaGgN4nBzwlUG8AaN32bwCQZACQZAAApgwAf/6fA/qfh70GcDQM/Lp9mXfADQBrfbYv8vd7AkCSAUCSAQD4+ADgPwLY11//9p+SNg0AMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJAMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAAAYASQYAAMAAABgAJBkAAAADAGAAkGQAAAAMAIABQJIBAAAwAAAGAEkGAADAAAAYACQZAAAAAwBgAJBkAAAADACAAUCSAQAAMAAABgDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAgAHAfwRgAJBkAAAADACAAUCSAQAAMAAABgBJBgAAwAAAGAAkGQAAAAMAYACQZAAAAAwAgAFAkgEAADAAAAYASQYAAMAAABgAJBkAAAADAGAAkAwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAIcgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAEgyAAAABgDAACDJAAAABgDAACDJAAAAGAAAA4AkAwAAYAAADACSDAAAgAEAMABIMgAAAAYAwAAgyQAAABgAAAOAJAMAAGAAAAwAkgwAAIABADAASDIAAIABADAASDIAAAAGAMAAIMkAAAAYAAADgCQDAABgAAAMAJIMAACAAQAwAOi/27GDEgAAGIhh/l3XRJ8JnIXBaiYAAAACACAAmJkAAAAIAIAAYGYCAAAgAAACgJkJAACAAAB4gswEAABAAAAEADMTAAAAAQAQAMxMAAAABABAADAzAQAAEAAAAcDMBAAAQAAABAAzEwAAAAEAEADMTAAAAAQAQAAwMwEAABAAAAHAzAQAABAAAAHAzAQAAEAAAAQAMxMAAAABABAAzEwAAAAEAEAAMDMBAAAQAAABwMwEAABAAAAEADMTAAAAAQAQAMxMAAAABABAADAzAQAABABAADAzAQAAEAAAAcDMBAAAQAAABAAzEwAAAAEAEADMTAAAAAQAQAAwMwEAABAAAAHAzAQAAEAAAAQAMxMAAAABABAAzEwAAAAEABAAPEFmAgAAIAAAAoCZCQAAgAAACABmJgAAAAIAIACYmQAAAAgAgABgZgIAACAAAAKAmQkAAIAAAAgAZiYAAAACACAAmJkAAAAIAIAAYGYOIAAIAIAAYGYCAAAgAAACgJkJAACAAAAIAGYmAAAAAgAgAJiZAAAACACAAGBmAgAAIAAAAoCZCQAAgAAACABmJgAAAAIAIACYmQAAAAIAIACYmQAAAAgAgABgZgIAACAAAAKAmQkAAIAAAAgAZiYAAAACACAAmJkAAAAIAIAAYGYCAAAgAAACgJkJAACAAAAIAGYmAAAAAgAIAJ4gMwEAABAAAAHAzAQAAEAAAAQAMxMAAAABABAAzEwAAAAEAEAAMDMBAAAQAAABwMwEAABgFTJAKgGvxMJFAAAAAElFTkSuQmCC" - }, + }, { "uri" : "data:image/png;base64,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" } - ], + ], "materials" : [ { "emissiveFactor" : [ - 1.0, - 1.0, + 1.0, + 1.0, 1.0 - ], + ], "emissiveTexture" : { - "index" : 1, + "index" : 1, "texCoord" : 1 - }, - "name" : "Material", + }, + "name" : "Material", "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 0 } } } - ], + ], "meshes" : [ { - "name" : "Cube", + "name" : "Cube", "primitives" : [ { "attributes" : { - "NORMAL" : 2, - "POSITION" : 1, - "TANGENT" : 3, - "TEXCOORD_0" : 4, + "NORMAL" : 2, + "POSITION" : 1, + "TANGENT" : 3, + "TEXCOORD_0" : 4, "TEXCOORD_1" : 5 - }, - "indices" : 0, + }, + "indices" : 0, "material" : 0 } ] } - ], + ], "nodes" : [ { - "camera" : 0, - "name" : "Correction_Camera", + "camera" : 0, + "name" : "Correction_Camera", "rotation" : [ - -0.7071067690849304, - -0.0, - 0.0, + -0.7071067690849304, + -0.0, + 0.0, 0.7071067690849304 ] - }, + }, { "children" : [ 0 - ], - "name" : "Camera", + ], + "name" : "Camera", "rotation" : [ - 0.483536034822464, - 0.33687159419059753, - -0.20870360732078552, + 0.483536034822464, + 0.33687159419059753, + -0.20870360732078552, 0.7804827094078064 - ], + ], "translation" : [ - 7.481131553649902, - 5.34366512298584, + 7.481131553649902, + 5.34366512298584, 6.5076398849487305 ] - }, + }, { - "mesh" : 0, + "mesh" : 0, "name" : "Cube" } - ], + ], "samplers" : [ {} - ], - "scene" : 0, + ], + "scene" : 0, "scenes" : [ { - "name" : "Scene", + "name" : "Scene", "nodes" : [ - 2, + 2, 1 ] } - ], + ], "textures" : [ { - "sampler" : 0, + "sampler" : 0, "source" : 0 - }, + }, { - "sampler" : 0, + "sampler" : 0, "source" : 1 } ] diff --git a/Models/MultiUVTest/glTF/MultiUVTest.gltf b/Models/MultiUVTest/glTF/MultiUVTest.gltf index 890f617c..b8957ae5 100644 --- a/Models/MultiUVTest/glTF/MultiUVTest.gltf +++ b/Models/MultiUVTest/glTF/MultiUVTest.gltf @@ -1,255 +1,255 @@ { "accessors" : [ { - "bufferView" : 0, - "componentType" : 5121, - "count" : 36, + "bufferView" : 0, + "componentType" : 5121, + "count" : 36, "max" : [ 23 - ], + ], "min" : [ 0 - ], + ], "type" : "SCALAR" - }, + }, { - "bufferView" : 1, - "componentType" : 5126, - "count" : 24, + "bufferView" : 1, + "componentType" : 5126, + "count" : 24, "max" : [ - 1.0000004768371582, - 1.0, + 1.0000004768371582, + 1.0, 1.0000005960464478 - ], + ], "min" : [ - -1.0000003576278687, - -1.0, + -1.0000003576278687, + -1.0, -1.0000003576278687 - ], + ], "type" : "VEC3" - }, + }, { - "bufferView" : 2, - "componentType" : 5126, - "count" : 24, + "bufferView" : 2, + "componentType" : 5126, + "count" : 24, "max" : [ - 1.0, - 1.0, + 1.0, + 1.0, 1.0 - ], + ], "min" : [ - -1.0, - -1.0, + -1.0, + -1.0, -1.0 - ], + ], "type" : "VEC3" - }, + }, { - "bufferView" : 3, - "componentType" : 5126, - "count" : 24, + "bufferView" : 3, + "componentType" : 5126, + "count" : 24, "max" : [ - 1.0, - 6.661325971652322e-16, - 1.0, + 1.0, + 6.661325971652322e-16, + 1.0, 1.0 - ], + ], "min" : [ - -1.0, - -2.9802322387695312e-08, - -1.0, + -1.0, + -2.9802322387695312e-08, + -1.0, 1.0 - ], + ], "type" : "VEC4" - }, + }, { - "bufferView" : 4, - "componentType" : 5126, - "count" : 24, + "bufferView" : 4, + "componentType" : 5126, + "count" : 24, "max" : [ - 0.7499566674232483, + 0.7499566674232483, 0.9999134124518605 - ], + ], "min" : [ - 8.658754813950509e-05, + 8.658754813950509e-05, 8.660554885864258e-05 - ], + ], "type" : "VEC2" - }, + }, { - "bufferView" : 5, - "componentType" : 5126, - "count" : 24, + "bufferView" : 5, + "componentType" : 5126, + "count" : 24, "max" : [ - 0.25, + 0.25, 0.25 - ], + ], "min" : [ - 0.0, + 0.0, 0.0 - ], + ], "type" : "VEC2" } - ], + ], "asset" : { - "copyright" : "hiloteam", - "generator" : "Khronos Blender glTF 2.0 exporter", + "copyright" : "hiloteam", + "generator" : "Khronos Blender glTF 2.0 exporter", "version" : "2.0" - }, + }, "bufferViews" : [ { - "buffer" : 0, - "byteLength" : 36, - "byteOffset" : 0, + "buffer" : 0, + "byteLength" : 36, + "byteOffset" : 0, "target" : 34963 - }, + }, { - "buffer" : 0, - "byteLength" : 288, - "byteOffset" : 36, + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 36, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 288, - "byteOffset" : 324, + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 324, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 384, - "byteOffset" : 612, + "buffer" : 0, + "byteLength" : 384, + "byteOffset" : 612, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 192, - "byteOffset" : 996, + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 996, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 192, - "byteOffset" : 1188, + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 1188, "target" : 34962 } - ], + ], "buffers" : [ { - "byteLength" : 1380, + "byteLength" : 1380, "uri" : "MultiUVTest.bin" } - ], + ], "cameras" : [ { - "name" : "Camera", + "name" : "Camera", "perspective" : { - "aspectRatio" : 1.7777777777777777, - "yfov" : 0.5033799372418416, - "zfar" : 100.0, + "aspectRatio" : 1.7777777777777777, + "yfov" : 0.5033799372418416, + "zfar" : 100.0, "znear" : 0.10000000149011612 - }, + }, "type" : "perspective" } - ], + ], "images" : [ { "uri" : "uv0.png" - }, + }, { "uri" : "uv1.png" } - ], + ], "materials" : [ { "emissiveFactor" : [ - 1.0, - 1.0, + 1.0, + 1.0, 1.0 - ], + ], "emissiveTexture" : { - "index" : 1, + "index" : 1, "texCoord" : 1 - }, - "name" : "Material", + }, + "name" : "Material", "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 0 } } } - ], + ], "meshes" : [ { - "name" : "Cube", + "name" : "Cube", "primitives" : [ { "attributes" : { - "NORMAL" : 2, - "POSITION" : 1, - "TANGENT" : 3, - "TEXCOORD_0" : 4, + "NORMAL" : 2, + "POSITION" : 1, + "TANGENT" : 3, + "TEXCOORD_0" : 4, "TEXCOORD_1" : 5 - }, - "indices" : 0, + }, + "indices" : 0, "material" : 0 } ] } - ], + ], "nodes" : [ { - "camera" : 0, - "name" : "Correction_Camera", + "camera" : 0, + "name" : "Correction_Camera", "rotation" : [ - -0.7071067690849304, - -0.0, - 0.0, + -0.7071067690849304, + -0.0, + 0.0, 0.7071067690849304 ] - }, + }, { "children" : [ 0 - ], - "name" : "Camera", + ], + "name" : "Camera", "rotation" : [ - 0.483536034822464, - 0.33687159419059753, - -0.20870360732078552, + 0.483536034822464, + 0.33687159419059753, + -0.20870360732078552, 0.7804827094078064 - ], + ], "translation" : [ - 7.481131553649902, - 5.34366512298584, + 7.481131553649902, + 5.34366512298584, 6.5076398849487305 ] - }, + }, { - "mesh" : 0, + "mesh" : 0, "name" : "Cube" } - ], + ], "samplers" : [ {} - ], - "scene" : 0, + ], + "scene" : 0, "scenes" : [ { - "name" : "Scene", + "name" : "Scene", "nodes" : [ - 2, + 2, 1 ] } - ], + ], "textures" : [ { - "sampler" : 0, + "sampler" : 0, "source" : 0 - }, + }, { - "sampler" : 0, + "sampler" : 0, "source" : 1 } ] diff --git a/Models/MultipleScenes/README.body.md b/Models/MultipleScenes/README.body.md index 1c551583..20e26752 100644 --- a/Models/MultipleScenes/README.body.md +++ b/Models/MultipleScenes/README.body.md @@ -5,8 +5,6 @@ ## Description A simple glTF asset with two scenes. Each scene consists of one node with -one mesh. For the first scene, the mesh is a triangle. For the second -scene, the mesh is a square. The default scene is set to `1` by the `scene` -property, so viewers should initially show the scene containing the square. - - +one mesh. For the first scene, the mesh is a triangle. For the second +scene, the mesh is a square. The default scene is set to `1` by the `scene` +property, so viewers should initially show the scene containing the square. diff --git a/Models/MultipleScenes/glTF-Embedded/MultipleScenes.gltf b/Models/MultipleScenes/glTF-Embedded/MultipleScenes.gltf index 61dcc3cc..6016d732 100644 --- a/Models/MultipleScenes/glTF-Embedded/MultipleScenes.gltf +++ b/Models/MultipleScenes/glTF-Embedded/MultipleScenes.gltf @@ -8,7 +8,7 @@ "nodes" : [ 1 ] } ], - + "nodes" : [ { "mesh" : 0 @@ -17,7 +17,7 @@ "mesh" : 1 } ], - + "meshes" : [ { "primitives" : [ { @@ -111,7 +111,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/MultipleScenes/glTF/MultipleScenes.gltf b/Models/MultipleScenes/glTF/MultipleScenes.gltf index a61070ad..0b875eb4 100644 --- a/Models/MultipleScenes/glTF/MultipleScenes.gltf +++ b/Models/MultipleScenes/glTF/MultipleScenes.gltf @@ -8,7 +8,7 @@ "nodes" : [ 1 ] } ], - + "nodes" : [ { "mesh" : 0 @@ -17,7 +17,7 @@ "mesh" : 1 } ], - + "meshes" : [ { "primitives" : [ { @@ -111,7 +111,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/MultipleScenes/metadata.json b/Models/MultipleScenes/metadata.json index 582c78f7..705353df 100644 --- a/Models/MultipleScenes/metadata.json +++ b/Models/MultipleScenes/metadata.json @@ -20,6 +20,6 @@ "screenshot": "screenshot/screenshot.png", "name": "Multiple Scenes", "path": "./Models/MultipleScenes", - "summary": "A simple glTF asset with two scenes. Each scene consists of one node with one mesh. ", + "summary": "A simple glTF asset with two scenes. Each scene consists of one node with one mesh.", "createReadme": true } diff --git a/Models/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf b/Models/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf index ed026393..890a62aa 100644 --- a/Models/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf +++ b/Models/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf @@ -1,202 +1,202 @@ { "accessors" : [ { - "bufferView" : 0, - "componentType" : 5123, - "count" : 15720, + "bufferView" : 0, + "componentType" : 5123, + "count" : 15720, "max" : [ 2769 - ], + ], "min" : [ 0 - ], + ], "type" : "SCALAR" - }, + }, { - "bufferView" : 1, - "componentType" : 5126, - "count" : 2770, + "bufferView" : 1, + "componentType" : 5126, + "count" : 2770, "max" : [ - 1.4138822555541992, - 1.0467524528503418, + 1.4138822555541992, + 1.0467524528503418, 0.08050008118152618 - ], + ], "min" : [ - -1.4246257543563843, - -1.2000000476837158, + -1.4246257543563843, + -1.2000000476837158, -0.009999947622418404 - ], + ], "type" : "VEC3" - }, + }, { - "bufferView" : 2, - "componentType" : 5126, - "count" : 2770, + "bufferView" : 2, + "componentType" : 5126, + "count" : 2770, "max" : [ - 0.9247413277626038, - 0.9247413277626038, + 0.9247413277626038, + 0.9247413277626038, 1.0 - ], + ], "min" : [ - -0.9247413277626038, - -0.9247413277626038, + -0.9247413277626038, + -0.9247413277626038, -1.0 - ], + ], "type" : "VEC3" - }, + }, { - "bufferView" : 3, - "componentType" : 5126, - "count" : 2770, + "bufferView" : 3, + "componentType" : 5126, + "count" : 2770, "max" : [ - 1.0, - 0.8718903064727783, - 0.9247627258300781, + 1.0, + 0.8718903064727783, + 0.9247627258300781, 1.0 - ], + ], "min" : [ - -1.0, - -0.8827678561210632, - -0.9247735142707825, + -1.0, + -0.8827678561210632, + -0.9247735142707825, -1.0 - ], + ], "type" : "VEC4" - }, + }, { - "bufferView" : 4, - "componentType" : 5126, - "count" : 2770, + "bufferView" : 4, + "componentType" : 5126, + "count" : 2770, "max" : [ - 0.9821357727050781, + 0.9821357727050781, 0.9877346605062485 - ], + ], "min" : [ - 0.1472877860069275, + 0.1472877860069275, 0.03816509246826172 - ], + ], "type" : "VEC2" } - ], + ], "asset" : { - "copyright" : "Copyright 2017-2018 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey.", - "generator" : "Khronos Blender glTF 2.0 exporter", + "copyright" : "Copyright 2017-2018 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey.", + "generator" : "Khronos Blender glTF 2.0 exporter", "version" : "2.0" - }, + }, "bufferViews" : [ { - "buffer" : 0, - "byteLength" : 31440, - "byteOffset" : 0, + "buffer" : 0, + "byteLength" : 31440, + "byteOffset" : 0, "target" : 34963 - }, + }, { - "buffer" : 0, - "byteLength" : 33240, - "byteOffset" : 31440, + "buffer" : 0, + "byteLength" : 33240, + "byteOffset" : 31440, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 33240, - "byteOffset" : 64680, + "buffer" : 0, + "byteLength" : 33240, + "byteOffset" : 64680, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 44320, - "byteOffset" : 97920, + "buffer" : 0, + "byteLength" : 44320, + "byteOffset" : 97920, "target" : 34962 - }, + }, { - "buffer" : 0, - "byteLength" : 22160, - "byteOffset" : 142240, + "buffer" : 0, + "byteLength" : 22160, + "byteOffset" : 142240, "target" : 34962 } - ], + ], "buffers" : [ { - "byteLength" : 164400, + "byteLength" : 164400, "uri" : "NormalTangentMirrorTest.bin" } - ], + ], "images" : [ { "uri" : "NormalTangentMirrorTest_OcclusionRoughnessMetallic.png" - }, + }, { "uri" : "NormalTangentMirrorTest_Normal.png" - }, + }, { "uri" : "NormalTangentMirrorTest_BaseColor.png" } - ], + ], "materials" : [ { - "doubleSided" : true, - "name" : "Material", + "doubleSided" : true, + "name" : "Material", "normalTexture" : { "index" : 1 - }, + }, "occlusionTexture" : { "index" : 0 - }, + }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 2 - }, + }, "metallicRoughnessTexture" : { "index" : 0 } } } - ], + ], "meshes" : [ { - "name" : "NormalTangentTest_low", + "name" : "NormalTangentTest_low", "primitives" : [ { "attributes" : { - "NORMAL" : 2, - "POSITION" : 1, - "TANGENT" : 3, + "NORMAL" : 2, + "POSITION" : 1, + "TANGENT" : 3, "TEXCOORD_0" : 4 - }, - "indices" : 0, + }, + "indices" : 0, "material" : 0 } ] } - ], + ], "nodes" : [ { - "mesh" : 0, + "mesh" : 0, "name" : "NormalTangentTest_low" } - ], + ], "samplers" : [ {} - ], - "scene" : 0, + ], + "scene" : 0, "scenes" : [ { - "name" : "Scene", + "name" : "Scene", "nodes" : [ 0 ] } - ], + ], "textures" : [ { - "sampler" : 0, + "sampler" : 0, "source" : 0 - }, + }, { - "sampler" : 0, + "sampler" : 0, "source" : 1 - }, + }, { - "sampler" : 0, + "sampler" : 0, "source" : 2 } ] diff --git a/Models/NormalTangentTest/README.body.md b/Models/NormalTangentTest/README.body.md index a5574904..08c49d6b 100644 --- a/Models/NormalTangentTest/README.body.md +++ b/Models/NormalTangentTest/README.body.md @@ -27,4 +27,3 @@ The back of the model shows concave geometry and normal maps, like looking into In the above image, note the test cells on the right half of each pair. A red border has been added for emphasis on the incorrect results. Here, the real geometry reflects level horizon lines, but the normal-mapped geometry appears to reflect several different orientations. This is a common problem, that often indicates the rendering engine has mis-interpreted the direction of the normal Y vector, supplied by the green channel of the normal map. Some systems intentionally use or expect left-handed normal maps, however, glTF [specifies](https://github.com/KhronosGroup/glTF/tree/065a01206014cd5f198085de6b4ce6f565ae79c6/specification/2.0#materialnormaltexture) that its own normal maps should use the OpenGL convention with right-handed coordinates. This issue can often be fixed by flipping the normal Y vector, or inverting the intensity of the green channel of the normal map. Fixes should be applied such that glTF models contain only the specified OpenGL normal convention, and rendering engines automatically adapt this to their own internal convention as needed. - diff --git a/Models/OrientationTest/README.body.md b/Models/OrientationTest/README.body.md index 29b1dca4..46a698f9 100644 --- a/Models/OrientationTest/README.body.md +++ b/Models/OrientationTest/README.body.md @@ -17,4 +17,3 @@ Thus, if each colored arrow points directly at a target of the same color, the t This failed render shows what happens if the rotation quaternions are converted to transposed rotations (in this case, converted to a 3x3 rotation matrix that was transposed). This same effect is caused if there is confusion between row-major and column-major matrix ordering. This image shows the red, green, and blue arrows, which all use rotation quaternions on the three axes. On the opposite sides of the cube, the cyan, magenta, and yellow arrows perform the same kinds of tests (with slightly different angles) using node orientation matrices in the glTF directly. Thus, it's possible that only one set or the other set of arrows will fail the test. - diff --git a/Models/PotOfCoals/README.body.md b/Models/PotOfCoals/README.body.md index f800b06b..2a84680c 100644 --- a/Models/PotOfCoals/README.body.md +++ b/Models/PotOfCoals/README.body.md @@ -8,6 +8,6 @@ ## Description -This asset represents a copper pot using emissive for glowing hot coals, coated with a clearcoat layer on the exterior, and including the glTF and Khronos Group and DGG logos. +This asset represents a copper pot using emissive for glowing hot coals, coated with a clearcoat layer on the exterior, and including the glTF and Khronos Group and DGG logos. The textures are compressed with JPEG to reduce file size, but the normal bump texture for the copper pot has been kept in PNG format to preserve the emboss details around the logos. diff --git a/Models/PotOfCoals/glTF/PotOfCoals.gltf b/Models/PotOfCoals/glTF/PotOfCoals.gltf index 06ca6257..a961fad4 100644 --- a/Models/PotOfCoals/glTF/PotOfCoals.gltf +++ b/Models/PotOfCoals/glTF/PotOfCoals.gltf @@ -377,4 +377,4 @@ "source": 7 } ] -} \ No newline at end of file +} diff --git a/Models/PotOfCoalsAnimationPointer/README.body.md b/Models/PotOfCoalsAnimationPointer/README.body.md index d70773be..973f38b9 100644 --- a/Models/PotOfCoalsAnimationPointer/README.body.md +++ b/Models/PotOfCoalsAnimationPointer/README.body.md @@ -22,4 +22,4 @@ A mesh was placed above the coals and assigned a refractive material with [KHR_m ![Disabling the Specular extension](screenshot/specular_disabled.jpg)
_The specular extension was used to remove reflections._ -The extension [KHR_materials_specular](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_specular#khr_materials_specular) was added to the refraction mesh to disable all reflections. This prevents the mesh from looking like reflective glass or water, but more like non-reflective air being refracted by heat. \ No newline at end of file +The extension [KHR_materials_specular](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_specular#khr_materials_specular) was added to the refraction mesh to disable all reflections. This prevents the mesh from looking like reflective glass or water, but more like non-reflective air being refracted by heat. diff --git a/Models/PrimitiveModeNormalsTest/README.body.md b/Models/PrimitiveModeNormalsTest/README.body.md index c4a6a5fb..3b8a492f 100644 --- a/Models/PrimitiveModeNormalsTest/README.body.md +++ b/Models/PrimitiveModeNormalsTest/README.body.md @@ -11,4 +11,3 @@ This asset tests rendering of point, line, and triangle primitive modes with and - The third column, triangles without normals, should be rendered with flat shading and full PBR material model. - The remaining columns, all three modes with normals, should be rendered with smooth shading and full PBR material model. - diff --git a/Models/PrimitiveModeNormalsTest/glTF/PrimitiveModeNormalsTest.gltf b/Models/PrimitiveModeNormalsTest/glTF/PrimitiveModeNormalsTest.gltf index 2112512d..2c2dc089 100644 --- a/Models/PrimitiveModeNormalsTest/glTF/PrimitiveModeNormalsTest.gltf +++ b/Models/PrimitiveModeNormalsTest/glTF/PrimitiveModeNormalsTest.gltf @@ -790,4 +790,4 @@ "wrapT": 33071 } ] -} \ No newline at end of file +} diff --git a/Models/RecursiveSkeletons/glTF/RecursiveSkeletons.gltf b/Models/RecursiveSkeletons/glTF/RecursiveSkeletons.gltf index 0f5e4c04..d2463a64 100644 --- a/Models/RecursiveSkeletons/glTF/RecursiveSkeletons.gltf +++ b/Models/RecursiveSkeletons/glTF/RecursiveSkeletons.gltf @@ -59033,4 +59033,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Models/SheenChair/README.body.md b/Models/SheenChair/README.body.md index c82c418c..a403ac9a 100644 --- a/Models/SheenChair/README.body.md +++ b/Models/SheenChair/README.body.md @@ -6,11 +6,11 @@ ## Description -This model is a wood-framed chair with a fabric seat, tufted with fabric buttons and metal hardware. It uses three extensions: `KHR_materials_sheen` for velvet fabrics, `KHR_texture_transform` to tile the textures for fabric and wood, and `KHR_materials_variants` to create two versions of the chair: "Mango Velvet", and "Peacock Velvet". +This model is a wood-framed chair with a fabric seat, tufted with fabric buttons and metal hardware. It uses three extensions: `KHR_materials_sheen` for velvet fabrics, `KHR_texture_transform` to tile the textures for fabric and wood, and `KHR_materials_variants` to create two versions of the chair: "Mango Velvet", and "Peacock Velvet". The model is made of four parts using subdivision surface modeling, with four materials for fabric, wood, metal, and the label. The ambient occlusion texture is shared by all materials and uses a 2nd UV with all UVs arranged between 0 and 1. All the other textures use the 1st UV which is not so constrained; it has overlaps and the UVs extend outside the 0-1 UV space. -The textures were created uniquely, edited from public domain imagery (https://www.publicdomainpictures.net/), or edited from personal photos. This model does not represent a real product, however the fabrics were modeled to match real fabrics, represented [here on the Wayfair website](https://www.wayfair.com/furniture/pdp/bungalow-rose-griner-slipper-chair-bgrs8778.html). The use of real-world reference is meant to help glTF developers with calibrating material features and renderer handling, so we can more accurately represent e-commerce products. +The textures were created uniquely, edited from public domain imagery (https://www.publicdomainpictures.net/), or edited from personal photos. This model does not represent a real product, however the fabrics were modeled to match real fabrics, represented [here on the Wayfair website](https://www.wayfair.com/furniture/pdp/bungalow-rose-griner-slipper-chair-bgrs8778.html). The use of real-world reference is meant to help glTF developers with calibrating material features and renderer handling, so we can more accurately represent e-commerce products. ## KHR_materials_sheen @@ -32,5 +32,5 @@ The Peacock Velvet material uses 1.0 metalness. While not being physically accur ## Authoring Software -The model was created in Autodesk 3ds Max 2020 and exported using the [`Max2Babylon`](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. To add `KHR_materials_sheen` and `KHR_materials_variants` the glTF file was edited manually. +The model was created in Autodesk 3ds Max 2020 and exported using the [`Max2Babylon`](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. To add `KHR_materials_sheen` and `KHR_materials_variants` the glTF file was edited manually. diff --git a/Models/SheenCloth/glTF/SheenCloth.gltf b/Models/SheenCloth/glTF/SheenCloth.gltf index 3305846b..f2e1972d 100644 --- a/Models/SheenCloth/glTF/SheenCloth.gltf +++ b/Models/SheenCloth/glTF/SheenCloth.gltf @@ -232,7 +232,7 @@ "sampler": 0, "source": 4, "name": "SheenCloth_AO.jpg" - } + } ], "images": [ { diff --git a/Models/SheenTestGrid/README.body.md b/Models/SheenTestGrid/README.body.md index a556f7e7..7cff8a9b 100644 --- a/Models/SheenTestGrid/README.body.md +++ b/Models/SheenTestGrid/README.body.md @@ -5,9 +5,9 @@ ## Description -This model tests sheenColorFactor versus sheenRoughnessFactor using the extension [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen). +This model tests sheenColorFactor versus sheenRoughnessFactor using the extension [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen). -The baseColorFactor for all spheres is 0.5 blue, and the sheenColorFactor varies from 0 black to 0,1,1 cyan. +The baseColorFactor for all spheres is 0.5 blue, and the sheenColorFactor varies from 0 black to 0,1,1 cyan. The sheen extension has been explicitly added to each of the sixteen materials, even when the sheenColorFactor is set to black and therefore the extension would usually be omitted. @@ -15,4 +15,4 @@ The sheen extension has been explicitly added to each of the sixteen materials,
_Screenshots from [glTF Sample Viewer](https://github.khronos.org/glTF-Sample-Viewer-Release/) using the Environment "Studio Neutral" and showing debug views Sheen, Sheen Color, and Sheen Roughness._ ![Screenshot from glTF Sample Viewer](screenshot/screenshot_Punctual.jpg) -
_Screenshot from [glTF Sample Viewer](https://github.khronos.org/glTF-Sample-Viewer-Release/) with the Punctual Lighting option, which uses two directional lights from opposing angles._ \ No newline at end of file +
_Screenshot from [glTF Sample Viewer](https://github.khronos.org/glTF-Sample-Viewer-Release/) with the Punctual Lighting option, which uses two directional lights from opposing angles._ diff --git a/Models/SheenWoodLeatherSofa/README.body.md b/Models/SheenWoodLeatherSofa/README.body.md index 5244ee50..a1552b4c 100644 --- a/Models/SheenWoodLeatherSofa/README.body.md +++ b/Models/SheenWoodLeatherSofa/README.body.md @@ -5,11 +5,11 @@ ## Description -This asset demonstrates the use of three different UV methods for textured assets, plus [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_sheen/README.md) and [KHR_materials_specular](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_specular/README.md) for fabrics. +This asset demonstrates the use of three different UV methods for textured assets, plus [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_sheen/README.md) and [KHR_materials_specular](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_specular/README.md) for fabrics. -The original is available from [Polyhaven](https://polyhaven.com/a/sofa_03). The model was edited with 3ds Max to improve geometry, and to recreate UVs and materials. +The original is available from [Polyhaven](https://polyhaven.com/a/sofa_03). The model was edited with 3ds Max to improve geometry, and to recreate UVs and materials. -![Screenshots from three.js Editor](screenshot/screenshot_BeforeAfter.jpg) +![Screenshots from three.js Editor](screenshot/screenshot_BeforeAfter.jpg)
_Before and after, screenshots from [three.js Editor](https://threejs.org/editor/)_ Three UV methods were used: @@ -19,6 +19,6 @@ Three UV methods were used: The fabric materials use the glTF extensions KHR_materials_sheen and KHR_materials_specular for more realistic fabric shading. Specular was reduced to avoid a plastic-like specular response, and sheen emulates backscattering from fine threads sticking up from the surface. -Alpha sorting errors for the pillow fringe have been fixed by manually re-arranging the vertex order. The geometry strips were detached from each other, backfaces were duplicated manually, and front-facing strips were re-attached in order from back to front... end pillows, then mid pillows, then center pillow, attaching them by alpha draw order to force the vertices to be drawn back to front. This was repeated for the back-facing strips... center pillow first, then mid pillows, then end pillows last. +Alpha sorting errors for the pillow fringe have been fixed by manually re-arranging the vertex order. The geometry strips were detached from each other, backfaces were duplicated manually, and front-facing strips were re-attached in order from back to front... end pillows, then mid pillows, then center pillow, attaching them by alpha draw order to force the vertices to be drawn back to front. This was repeated for the back-facing strips... center pillow first, then mid pillows, then end pillows last. -To keep the asset at a reasonable file size (under 10mb) the textures were compressed with WEBP format, and use the glTF extension [EXT_texture_webp](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_texture_webp/README.md). The normal map for the wood and leather frame was compressed with lossless WEBP, because it was baked from geometry and is thus more susceptible to major shading errors. \ No newline at end of file +To keep the asset at a reasonable file size (under 10mb) the textures were compressed with WEBP format, and use the glTF extension [EXT_texture_webp](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_texture_webp/README.md). The normal map for the wood and leather frame was compressed with lossless WEBP, because it was baked from geometry and is thus more susceptible to major shading errors. diff --git a/Models/SheenWoodLeatherSofa/glTF/SheenWoodLeatherSofa.gltf b/Models/SheenWoodLeatherSofa/glTF/SheenWoodLeatherSofa.gltf index d6f38080..51bfdad9 100644 --- a/Models/SheenWoodLeatherSofa/glTF/SheenWoodLeatherSofa.gltf +++ b/Models/SheenWoodLeatherSofa/glTF/SheenWoodLeatherSofa.gltf @@ -1230,4 +1230,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Models/SimpleInstancing/README.body.md b/Models/SimpleInstancing/README.body.md index 6bc757c8..56ed5453 100644 --- a/Models/SimpleInstancing/README.body.md +++ b/Models/SimpleInstancing/README.body.md @@ -22,5 +22,4 @@ The object refers to three accessors: One for the `TRANSLATION`, one for the `RO - The rotation ranges from 0.0 to 90.0 degrees along each axis - The scale ranges from 1.0 to 2.0 along each axis -This means that the first instance that is rendered is the unmodified unit cube, and the last instance is a cube at (10.,10.0,10.0) that is rotated around the axis (1.0,1.0,1.0) by 90.0 degrees, and scaled by (2.0, 2.0, 2.0). - +This means that the first instance that is rendered is the unmodified unit cube, and the last instance is a cube at (10.0, 10.0, 10.0) that is rotated around the axis (1.0, 1.0, 1.0) by 90.0 degrees, and scaled by (2.0, 2.0, 2.0). diff --git a/Models/SimpleInstancing/glTF/SimpleInstancing.gltf b/Models/SimpleInstancing/glTF/SimpleInstancing.gltf index 3dd368be..5bc2b5a1 100644 --- a/Models/SimpleInstancing/glTF/SimpleInstancing.gltf +++ b/Models/SimpleInstancing/glTF/SimpleInstancing.gltf @@ -191,4 +191,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Models/SimpleMeshes/README.body.md b/Models/SimpleMeshes/README.body.md index 5a2a3e47..5f0d31de 100644 --- a/Models/SimpleMeshes/README.body.md +++ b/Models/SimpleMeshes/README.body.md @@ -4,10 +4,10 @@ ## Notes -This is an example showing how the same mesh may be appended to -several nodes, to be rendered multiple times. It also shows -how additional vertex attributes are defined in a `mesh.primitive` - -namely, attributes for the vertex normals. +This is an example showing how the same mesh may be appended to +several nodes, to be rendered multiple times. It also shows +how additional vertex attributes are defined in a `mesh.primitive` - +namely, attributes for the vertex normals. **Note:** The additional vertex normal attribute in this example is not yet used. This may cause a warning to be printed during the validation. The normal attribute will be used in diff --git a/Models/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf b/Models/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf index cedd751a..aca24b5e 100644 --- a/Models/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf +++ b/Models/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf @@ -14,7 +14,7 @@ "translation" : [ 1.0, 0.0, 0.0 ] } ], - + "meshes" : [ { "primitives" : [ { @@ -77,9 +77,8 @@ "min" : [ 0.0, 0.0, 1.0 ] } ], - + "asset" : { "version" : "2.0" } } - diff --git a/Models/SimpleMeshes/glTF/SimpleMeshes.gltf b/Models/SimpleMeshes/glTF/SimpleMeshes.gltf index c3f3d44c..77236bff 100644 --- a/Models/SimpleMeshes/glTF/SimpleMeshes.gltf +++ b/Models/SimpleMeshes/glTF/SimpleMeshes.gltf @@ -14,7 +14,7 @@ "translation" : [ 1.0, 0.0, 0.0 ] } ], - + "meshes" : [ { "primitives" : [ { @@ -77,7 +77,7 @@ "min" : [ 0.0, 0.0, 1.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/SimpleMorph/README.body.md b/Models/SimpleMorph/README.body.md index 02bb773b..49419eb7 100644 --- a/Models/SimpleMorph/README.body.md +++ b/Models/SimpleMorph/README.body.md @@ -13,5 +13,3 @@ section of the glTF tutorial. The following image shows the data layout of this sample: ![simpleMorphStructure](screenshot/simpleMorphStructure.png) - - diff --git a/Models/SimpleMorph/glTF-Embedded/SimpleMorph.gltf b/Models/SimpleMorph/glTF-Embedded/SimpleMorph.gltf index 3b6efd8d..a46fbda0 100644 --- a/Models/SimpleMorph/glTF-Embedded/SimpleMorph.gltf +++ b/Models/SimpleMorph/glTF-Embedded/SimpleMorph.gltf @@ -36,7 +36,7 @@ ] } ], - + "animations":[ { "samplers":[ @@ -57,7 +57,7 @@ ] } ], - + "buffers":[ { "uri":"data:application/gltf-buffer;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC/AACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AACAPwAAAAA=", @@ -185,8 +185,8 @@ ] } ], - + "asset":{ "version":"2.0" } -} \ No newline at end of file +} diff --git a/Models/SimpleSkin/README.body.md b/Models/SimpleSkin/README.body.md index 00cd41ec..e2efc75f 100644 --- a/Models/SimpleSkin/README.body.md +++ b/Models/SimpleSkin/README.body.md @@ -15,4 +15,3 @@ The following images show the data layout of this sample: ![skinAnimation](screenshot/skinAnimation.png) ![inverseBindMatrices](screenshot/inverseBindMatrices.png) ![skinningData](screenshot/skinningData.png) - diff --git a/Models/SimpleSkin/glTF-Embedded/SimpleSkin.gltf b/Models/SimpleSkin/glTF-Embedded/SimpleSkin.gltf index e9f4e4d8..7db625f5 100644 --- a/Models/SimpleSkin/glTF-Embedded/SimpleSkin.gltf +++ b/Models/SimpleSkin/glTF-Embedded/SimpleSkin.gltf @@ -3,7 +3,7 @@ "scenes" : [ { "nodes" : [ 0, 1 ] } ], - + "nodes" : [ { "skin" : 0, "mesh" : 0 @@ -13,7 +13,7 @@ "translation" : [ 0.0, 1.0, 0.0 ], "rotation" : [ 0.0, 0.0, 0.0, 1.0 ] } ], - + "meshes" : [ { "primitives" : [ { "attributes" : { @@ -29,7 +29,7 @@ "inverseBindMatrices" : 4, "joints" : [ 1, 2 ] } ], - + "animations" : [ { "channels" : [ { "sampler" : 0, @@ -44,7 +44,7 @@ "output" : 6 } ] } ], - + "buffers" : [ { "uri" : "data:application/gltf-buffer;base64,AAABAAMAAAADAAIAAgADAAUAAgAFAAQABAAFAAcABAAHAAYABgAHAAkABgAJAAgAAAAAvwAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAvwAAAD8AAAAAAAAAPwAAAD8AAAAAAAAAvwAAgD8AAAAAAAAAPwAAgD8AAAAAAAAAvwAAwD8AAAAAAAAAPwAAwD8AAAAAAAAAvwAAAEAAAAAAAAAAPwAAAEAAAAAA", "byteLength" : 168 @@ -58,7 +58,7 @@ "uri" : "data:application/gltf-buffer;base64,AAAAAAAAAD8AAIA/AADAPwAAAEAAACBAAABAQAAAYEAAAIBAAACQQAAAoEAAALBAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAPT9ND/0/TQ/AAAAAAAAAAD0/TQ/9P00PwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAPT9NL/0/TQ/AAAAAAAAAAD0/TS/9P00PwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAAAAAAAAAIA/", "byteLength" : 240 } ], - + "bufferViews" : [ { "buffer" : 0, "byteLength" : 48, @@ -124,8 +124,8 @@ "max" : [ 0.0, 0.0, 0.707, 1.0 ], "min" : [ 0.0, 0.0, -0.707, 0.707 ] } ], - + "asset" : { "version" : "2.0" } -} \ No newline at end of file +} diff --git a/Models/SimpleSparseAccessor/README.body.md b/Models/SimpleSparseAccessor/README.body.md index ed75c408..87a64439 100644 --- a/Models/SimpleSparseAccessor/README.body.md +++ b/Models/SimpleSparseAccessor/README.body.md @@ -19,4 +19,3 @@ The following image shows the substitution of the values that takes place for th ## License Information Public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)) - diff --git a/Models/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf b/Models/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf index ca69e2fa..07e7e357 100644 --- a/Models/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf +++ b/Models/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf @@ -3,11 +3,11 @@ "scenes" : [ { "nodes" : [ 0 ] } ], - + "nodes" : [ { "mesh" : 0 } ], - + "meshes" : [ { "primitives" : [ { "attributes" : { @@ -16,12 +16,12 @@ "indices" : 0 } ] } ], - + "buffers" : [ { "uri" : "data:application/gltf-buffer;base64,AAAIAAcAAAABAAgAAQAJAAgAAQACAAkAAgAKAAkAAgADAAoAAwALAAoAAwAEAAsABAAMAAsABAAFAAwABQANAAwABQAGAA0AAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAQAAAAAAAAAAAAABAQAAAAAAAAAAAAACAQAAAAAAAAAAAAACgQAAAAAAAAAAAAADAQAAAAAAAAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAAAAQAAAgD8AAAAAAABAQAAAgD8AAAAAAACAQAAAgD8AAAAAAACgQAAAgD8AAAAAAADAQAAAgD8AAAAACAAKAAwAAAAAAIA/AAAAQAAAAAAAAEBAAABAQAAAAAAAAKBAAACAQAAAAAA=", "byteLength" : 284 } ], - + "bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, @@ -40,7 +40,7 @@ "byteOffset" : 248, "byteLength" : 36 } ], - + "accessors" : [ { "bufferView" : 0, "byteOffset" : 0, @@ -70,8 +70,8 @@ } } } ], - + "asset" : { "version" : "2.0" } -} \ No newline at end of file +} diff --git a/Models/SimpleTexture/README.body.md b/Models/SimpleTexture/README.body.md index 24b8abf1..f8500f94 100644 --- a/Models/SimpleTexture/README.body.md +++ b/Models/SimpleTexture/README.body.md @@ -7,4 +7,3 @@ An example of a simple glTF asset with a texture, as described in the [Simple Texture](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_013_SimpleTexture.md) section of the glTF tutorial. - diff --git a/Models/SimpleTexture/glTF-Embedded/SimpleTexture.gltf b/Models/SimpleTexture/glTF-Embedded/SimpleTexture.gltf index dba3d53f..455fec54 100644 --- a/Models/SimpleTexture/glTF-Embedded/SimpleTexture.gltf +++ b/Models/SimpleTexture/glTF-Embedded/SimpleTexture.gltf @@ -86,4 +86,4 @@ "asset" : { "version" : "2.0" } -} \ No newline at end of file +} diff --git a/Models/SimpleTexture/glTF/SimpleTexture.gltf b/Models/SimpleTexture/glTF/SimpleTexture.gltf index 2bc5eab3..58959045 100644 --- a/Models/SimpleTexture/glTF/SimpleTexture.gltf +++ b/Models/SimpleTexture/glTF/SimpleTexture.gltf @@ -86,4 +86,4 @@ "asset" : { "version" : "2.0" } -} \ No newline at end of file +} diff --git a/Models/SpecularSilkPouf/README.body.md b/Models/SpecularSilkPouf/README.body.md index 5c93d6ef..119313da 100644 --- a/Models/SpecularSilkPouf/README.body.md +++ b/Models/SpecularSilkPouf/README.body.md @@ -5,9 +5,9 @@ ## Description -This asset demonstrates the use of KHR_materials_specular and KHR_materials_sheen to represent shot-silk fabric on a pouf pillow. +This asset demonstrates the use of KHR_materials_specular and KHR_materials_sheen to represent shot-silk fabric on a pouf pillow. -The material is based on photo reference of real silk fabric, an Italian 15th century gown in shot silk. +The material is based on photo reference of real silk fabric, an Italian 15th century gown in shot silk. The fabric creates an iridescent-like effect by weaving two or more colors in opposing directions with warp and weft silk yarns. @@ -16,4 +16,4 @@ The fabric creates an iridescent-like effect by weaving two or more colors in op ## Creation Details -The asset was created using [3ds Max](https://www.autodesk.com/products/3ds-max), exported to glTF using the [Real-Time Exporter](https://help.autodesk.com/view/3DSMAX/2024/ENU/?guid=GUID-5B4C8EC2-2230-4F9F-B3C6-48D9E347E37D), and materials were edited in [Visual Studio Code](https://code.visualstudio.com/) with [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode#gltf-tools-extension-for-visual-studio-code). \ No newline at end of file +The asset was created using [3ds Max](https://www.autodesk.com/products/3ds-max), exported to glTF using the [Real-Time Exporter](https://help.autodesk.com/view/3DSMAX/2024/ENU/?guid=GUID-5B4C8EC2-2230-4F9F-B3C6-48D9E347E37D), and materials were edited in [Visual Studio Code](https://code.visualstudio.com/) with [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode#gltf-tools-extension-for-visual-studio-code). diff --git a/Models/SpecularSilkPouf/glTF/SpecularSilkPouf.gltf b/Models/SpecularSilkPouf/glTF/SpecularSilkPouf.gltf index e71f8456..2106b266 100644 --- a/Models/SpecularSilkPouf/glTF/SpecularSilkPouf.gltf +++ b/Models/SpecularSilkPouf/glTF/SpecularSilkPouf.gltf @@ -210,4 +210,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Models/SpecularTest/README.body.md b/Models/SpecularTest/README.body.md index 43ac8675..5899004f 100644 --- a/Models/SpecularTest/README.body.md +++ b/Models/SpecularTest/README.body.md @@ -23,4 +23,3 @@ The final row tests what happens when `specularColorFactor` is allowed to be gre ![screenshot](screenshot/purple.jpg) If you see purple coloring in the second row, it indicates a problem. An older version of this specification (before ratification) did not separate `specularColorTexture` into its own field, and some older versions of available engines may still be using this draft interpretation. The purple color is present in this model's `specularTexture` input on the RGB channels, which should not be used given the final specification (where color is permitted to be stored in a separate texture). - diff --git a/Models/StainedGlassLamp/README.body.md b/Models/StainedGlassLamp/README.body.md index 99a2c06f..d8e7ee71 100644 --- a/Models/StainedGlassLamp/README.body.md +++ b/Models/StainedGlassLamp/README.body.md @@ -6,11 +6,11 @@ Above: screenshot from [Babylon.js](https://sandbox.babylonjs.com/). ## Description -This model represents a real product, a Tiffany-style stained glass table lamp sold on [the Wayfair website](https://www.wayfair.com/). +This model represents a real product, a Tiffany-style stained glass table lamp sold on [the Wayfair website](https://www.wayfair.com/). The model is made of eight parts, each with their own materials and using PNG textures, mostly 2048x2048. All UVs are arranged between 0 and 1, except for a few overlapping parts which have been offset 1 UV unit to avoid texture baking errors. The model uses 55,428 triangles and 51,174 vertices. -The model demonstrates the following extensions: +The model demonstrates the following extensions: * [KHR_materials_clearcoat](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md) * [KHR_materials_ior](https://github.com/KhronosGroup/glTF/pull/1718) * [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_transmission/README.md) @@ -20,7 +20,7 @@ The model demonstrates the following extensions: ## Reference Photos -The use of real-world photographic reference is meant to help glTF developers with calibrating material features and renderer behavior, to more accurately represent e-commerce products. +The use of real-world photographic reference is meant to help glTF developers with calibrating material features and renderer behavior, to more accurately represent e-commerce products. ![photo reference next to screenshot](screenshot/photo_and_screenshot.jpg) @@ -32,7 +32,7 @@ Below: additional reference photos of the real product. ## glTF-JPG-PNG -The model in `\glTF-JPG-PNG` uses no extensions for the widest compatibility. Base color textures with alpha were kept in PNG format, while the rest were converted into JPG. The textures were downsized from 2048x2048 to various sizes, based on importance and their size on the model. +The model in `\glTF-JPG-PNG` uses no extensions for the widest compatibility. Base color textures with alpha were kept in PNG format, while the rest were converted into JPG. The textures were downsized from 2048x2048 to various sizes, based on importance and their size on the model. The red embedded glass gems and the amber hanging plastic beads were set to Alpha Coverage in Blend mode, at 0.75. This approximates a transparent surface without requiring extensions. Real-world transparent surfaces often both reflect and transmit light, and completely clear glass transmits light from behind it but it is also very reflective. Alpha Coverage does not represent this behavior correctly, it simply controls the visibility of the surface; Alpha Coverage dims all surface characteristics at once. Partial alpha allows the Base Color and reflections to be partially seen, for a rough approximation of clear surfaces. This is better than no transparency at all but is not physically correct. @@ -42,7 +42,7 @@ Above: screenshot from [Babylon.js](https://sandbox.babylonjs.com/) of model wit ## KHR_materials_variants -The models in `\glTF` and `\glTF-KTX-BasisU` use the extension [KHR_materials_variants](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md) to add a variant with the emissive textures disabled to simulate the lights being turned off. +The models in `\glTF` and `\glTF-KTX-BasisU` use the extension [KHR_materials_variants](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md) to add a variant with the emissive textures disabled to simulate the lights being turned off. ![animated screenshot of variants](screenshot/screenshot_variants_on-off.gif) @@ -60,13 +60,13 @@ The stained glass material uses roughness to simulate the microfacet scattering ![animated screenshot of transmission](screenshot/screenshot_transmission_rotation.gif) -The stained glass material uses alpha-as-coverge in MASK mode to cut out holes where the red beads are present. This is meant to prevent the stained glass geometry from interfering with the transmission of the red beads. +The stained glass material uses alpha-as-coverge in MASK mode to cut out holes where the red beads are present. This is meant to prevent the stained glass geometry from interfering with the transmission of the red beads. ## KHR_materials_clearcoat The models in `\glTF` and `\glTF-KTX-BasisU` use the extension [KHR_texture_clearcoat](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md) on the multicolored stained glass to add smooth reflections on top of the glass. The glass material must be rough for `KHR_materials_transmission` to create microsurface refractions, so clearcoat restores shiny surface reflections to the smooth outer surfaces of the stained glass. -The two textures for transmissionTexture and clearcoatTexture have been packed together into a single bitmap `StainedGlassLamp_glass_transmission-clearcoat` using the red and green channels to optimize memory use. +The two textures for transmissionTexture and clearcoatTexture have been packed together into a single bitmap `StainedGlassLamp_glass_transmission-clearcoat` using the red and green channels to optimize memory use. ![animated screenshot of clearcoat](screenshot/screenshot_clearcoat_on-off.gif) @@ -82,11 +82,11 @@ Above: animated GIF showing volume enabled and disabled, in [Babylon.js](https:/ ## KHR_textures_basisu -The model in `\glTF-KTX-BasisU` uses [Basis Universal](https://github.com/KhronosGroup/KTX-Software) texture compression and the extension [KHR_texture_basisu](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu/). +The model in `\glTF-KTX-BasisU` uses [Basis Universal](https://github.com/KhronosGroup/KTX-Software) texture compression and the extension [KHR_texture_basisu](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu/). -The aim was to achieve the same visual quality as the original JPG/PNG textures, while compressing both file size and GPU memory size. +The aim was to achieve the same visual quality as the original JPG/PNG textures, while compressing both file size and GPU memory size. -The textures were compressed from PNG source into KTX2 using [toktx](https://github.com/KhronosGroup/KTX-Software) via a combination of compression settings that favored high quality. UASTC was used for ORM and Normal textures and ETCS1 for Base Color and Emissive textures, however exceptions were made based on analyzing results... the `glass_basecolor-alpha` and `glass_emissive` textures were changed from ETC1S to UASTC since these were prominently displayed on the model and contained a lot of color variation. +The textures were compressed from PNG source into KTX2 using [toktx](https://github.com/KhronosGroup/KTX-Software) via a combination of compression settings that favored high quality. UASTC was used for ORM and Normal textures and ETCS1 for Base Color and Emissive textures, however exceptions were made based on analyzing results... the `glass_basecolor-alpha` and `glass_emissive` textures were changed from ETC1S to UASTC since these were prominently displayed on the model and contained a lot of color variation. toktx compression settings: ``` @@ -123,7 +123,7 @@ Above: screenshots from [Babylon.js](https://sandbox.babylonjs.com/): JPG and PN ## Path Traced Render Examples ## -This model has been tested in a few other non-rasterized renderers, which often require a few adjustments. E.g. emissive textures that simulate light bounce should be removed, allowing the path tracing to create more accurate bounce lighting. +This model has been tested in a few other non-rasterized renderers, which often require a few adjustments. E.g. emissive textures that simulate light bounce should be removed, allowing the path tracing to create more accurate bounce lighting. ![model rendered in OSPRay Studio](screenshot/render_ospray.jpg) @@ -135,7 +135,7 @@ Below: path-traced render in Dassault Systèmes [Enterprise PBR Sample Renderer] ## Authoring Details ## -The model was created with [3ds Max](https://www.autodesk.com/products/3ds-max/) and exported to glTF via the [Max2Babylon](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. The glTF file was then edited manually in [Visual Studio Code](https://code.visualstudio.com) with the [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode) extension to add KHR extensions. [KTX Software](https://gltf-transform.donmccurdy.com/cli.html) was used to compress textures into KTX2 format. +The model was created with [3ds Max](https://www.autodesk.com/products/3ds-max/) and exported to glTF via the [Max2Babylon](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. The glTF file was then edited manually in [Visual Studio Code](https://code.visualstudio.com) with the [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode) extension to add KHR extensions. [KTX Software](https://gltf-transform.donmccurdy.com/cli.html) was used to compress textures into KTX2 format. The textures were created from photo reference, augmented with procedural textures and hand-painted detail. The emissive textures were pre-rendered in 3ds Max using the V-Ray renderer and sphere lights, and the textures were hand-tuned to work with baseColor and transmission. diff --git a/Models/StainedGlassLamp/glTF-JPG-PNG/StainedGlassLamp.gltf b/Models/StainedGlassLamp/glTF-JPG-PNG/StainedGlassLamp.gltf index d0847139..861f80d6 100644 --- a/Models/StainedGlassLamp/glTF-JPG-PNG/StainedGlassLamp.gltf +++ b/Models/StainedGlassLamp/glTF-JPG-PNG/StainedGlassLamp.gltf @@ -853,4 +853,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/StainedGlassLamp/glTF-KTX-BasisU/StainedGlassLamp.gltf b/Models/StainedGlassLamp/glTF-KTX-BasisU/StainedGlassLamp.gltf index e86db83a..25680bf8 100644 --- a/Models/StainedGlassLamp/glTF-KTX-BasisU/StainedGlassLamp.gltf +++ b/Models/StainedGlassLamp/glTF-KTX-BasisU/StainedGlassLamp.gltf @@ -1186,4 +1186,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/StainedGlassLamp/glTF/StainedGlassLamp.gltf b/Models/StainedGlassLamp/glTF/StainedGlassLamp.gltf index eb0225e0..4ab59e2e 100644 --- a/Models/StainedGlassLamp/glTF/StainedGlassLamp.gltf +++ b/Models/StainedGlassLamp/glTF/StainedGlassLamp.gltf @@ -1106,4 +1106,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/SunglassesKhronos/README.body.md b/Models/SunglassesKhronos/README.body.md index 889755ac..6060826f 100644 --- a/Models/SunglassesKhronos/README.body.md +++ b/Models/SunglassesKhronos/README.body.md @@ -6,9 +6,9 @@ ## Description -This asset represents a pair of sunglasses with iridescent coated lenses, including the 3D Commerce and Khronos Group logos. +This asset represents a pair of sunglasses with iridescent coated lenses, including the 3D Commerce and Khronos Group logos. -The asset was created to demonstrate a high quality asset for e-commerce use, and to provide instructions on how to create similar assets using current industry-accepted 3D content creation techniques. +The asset was created to demonstrate a high quality asset for e-commerce use, and to provide instructions on how to create similar assets using current industry-accepted 3D content creation techniques. ## Preparation @@ -18,14 +18,14 @@ To begin creating a 3D asset it helps to gather reference photography. If possib ![Photograph of real sunglasses](screenshot/sunglasses_photo.jpg)
_A photograph of real sunglasses, a physical sample being used as reference._ -The glTF asset was designed to be similar to a pair of inexpensive sunglasses in the author's possession. Usually e-commerce 3D assets are used to sell a real product, so matching the real object is crucial. However in this case, the 3D model is being released in the glTF Sample Assets repository with a permissive license, therefore key design elements were altered to avoid infringing on third-party designs and trademarks. +The glTF asset was designed to be similar to a pair of inexpensive sunglasses in the author's possession. Usually e-commerce 3D assets are used to sell a real product, so matching the real object is crucial. However in this case, the 3D model is being released in the glTF Sample Assets repository with a permissive license, therefore key design elements were altered to avoid infringing on third-party designs and trademarks. On the real sunglasses, the insides of the lenses are coated with a subtle iridescent layer. However for the 3D asset, an iridescent glaze was added on the outside for a stronger visual impact. ## Dimensions and Units -For e-commerce assets (and for most 3D assets in general) it is best to model using real-world dimensions. The [official glTF Specification](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#coordinate-system-and-units) indicates models are to use a scale of 1 unit = 1 meter. The real sunglasses measure 14.5 cm across, so the glTF asset was createdat a similar size, about 15 cm across. +For e-commerce assets (and for most 3D assets in general) it is best to model using real-world dimensions. The [official glTF Specification](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#coordinate-system-and-units) indicates models are to use a scale of 1 unit = 1 meter. The real sunglasses measure 14.5 cm across, so the glTF asset was createdat a similar size, about 15 cm across. Accurate dimensions allow the 3D asset to be used properly in real spaces via augmented reality, or alongside other 3D models in other contexts like in web 3D viewers or in virtual reality. @@ -47,9 +47,9 @@ From top to bottom: the low-resolution control mesh, the mesh subdivided once, t ## Modeling with Face-Weighted Normals -Face-weighted normals are a good choice for flat surfaces with curved bevels along the edges. The articulated "temples" on the sides of the sunglasses use this technique to create the illusion of rounded bevels but using very few vertices. +Face-weighted normals are a good choice for flat surfaces with curved bevels along the edges. The articulated "temples" on the sides of the sunglasses use this technique to create the illusion of rounded bevels but using very few vertices. -For fast real-time rendering and quick downloading of e-commerce 3D models, it is best to use as few vertices as possible while maintaining the necessary details. +For fast real-time rendering and quick downloading of e-commerce 3D models, it is best to use as few vertices as possible while maintaining the necessary details. ![Closeup of a metal temple on the sunglasses](screenshot/temple_bevels.jpg)
_Flat surfaces with smooth bevels._ @@ -61,16 +61,16 @@ Each vertex of a 3D surface has one or more "vertex normals" which contribute to Left to right in the image above: 1. Simple geometry with face-aligned vertex normals (flat shading). -2. Vertex normals averaged across neighboring faces (smooth shading). +2. Vertex normals averaged across neighboring faces (smooth shading). 3. Bevels added. -4. Vertex normals weighted to align with the largest faces. +4. Vertex normals weighted to align with the largest faces. With this technique, the transitions in smooth shading are confined to the beveled faces of the model, resulting in clean well-ordered shading with a minimal number of vertices. ## Pivots for Articulation -Eyeglasses often have hinges at the temples, allowing the earhooks to be rotated inwards. To allow for manipulation and animation of the 3D model, the pivots of the metal temples have been set to the same location and orientation as the cylindrical hinges. +Eyeglasses often have hinges at the temples, allowing the earhooks to be rotated inwards. To allow for manipulation and animation of the 3D model, the pivots of the metal temples have been set to the same location and orientation as the cylindrical hinges. ![Pivots for the temples](screenshot/sunglasses_pivots.jpg)
_Pivots for the temples were adjusted to match the 3D hinges. From left: front view, side view, top view._ @@ -80,9 +80,9 @@ These aligned pivots allow the earhooks to be rotated without disconnecting them ## Materials & Textures -The materials are set to use mostly numerical values; this keeps the file small and efficient. +The materials are set to use mostly numerical values; this keeps the file small and efficient. -Textures often incur the most file size and memory storage for an asset, so minimizing their use whenever possible allows the file to be efficient. +Textures often incur the most file size and memory storage for an asset, so minimizing their use whenever possible allows the file to be efficient. This asset uses only one texture, for the Khronos Group logos on the black earhooks. The image is 1024 x 128 pixels, which is the closest resolution using powers-of-two dimensions which can contain both logos comfortably without causing blurriness when shown on the model. It is best to use powers-of-two dimensions for textures to support mip-mapping, which improves rendering performance and reduces aliasing artifacts. @@ -107,13 +107,13 @@ A partial metallic value could be used, but this is not advisable because partia For the iridescence on the lenses there are seven material controls to be adjusted: 1. `baseColorFactor`: this can use a dark color for stronger iridescence, but it cannot be completely black or else transmission will disappear. 1. `metallicFactor`: this should be zero to keep transmission active, and to be physically accurate. -1. `ior`: this is for the glass material, setting it to 1.0 creates a stronger iridescence but also disables refraction, which is OK since the glass is very thin. +1. `ior`: this is for the glass material, setting it to 1.0 creates a stronger iridescence but also disables refraction, which is OK since the glass is very thin. 1. `iridescenceFactor`: this is the strength of the iridescence. 1. `iridescenceIor`: this is the IOR for the iridescent film, and has a strong influence on the iridescent colors. 1. `iridescenceThicknessMaximum`: this is the thickness of the iridescent film, and also has a strong influence on which iridescent colors will appear. 1. `transmissionFactor`: this controls the amount of refraction for the glass lens underneath the iridescent film. It can be set to full strength and the baseColorFactor can then be darkened to reduce the transmission amount as much as desired. -In the glTF Sample Assets repository there is a helpful asset called [iridescenceDielectricSpheres.gltf](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/iridescenceDielectricSpheres#screenshot) which can be used interactively to arrive at the desired look and derive the corresponding values to be used. +In the glTF Sample Assets repository there is a helpful asset called [iridescenceDielectricSpheres.gltf](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/iridescenceDielectricSpheres#screenshot) which can be used interactively to arrive at the desired look and derive the corresponding values to be used. ![screenshot of iridescenceDielectricSpheres.gltf](screenshot/babylonjs-iridescence-editing.jpg)
_Adjusting material values in the [Babylon.js Sandbox](https://sandbox.babylonjs.com/)._ @@ -125,7 +125,7 @@ To figure out which values to use, the sample asset can be opened in a glTF edit * `baseColorFactor`: 0.1 * `metallicFactor`: 0.0 -* `ior`: 1.0 +* `ior`: 1.0 * `iridescenceFactor`: 1.0 * `iridescenceIor`: 2.0 * `iridescenceThicknessMaximum`: 300 @@ -136,12 +136,12 @@ These values can then be input into the asset's material to achieve the desired ## Texture Coordinates -Only the earhooks use a texture, to place the Khronos Group logos there. The logos have been packed into a single texture, because this reduces the number of materials needed which improves performance. +Only the earhooks use a texture, to place the Khronos Group logos there. The logos have been packed into a single texture, because this reduces the number of materials needed which improves performance. ![screenshot of texture coordinates](screenshot/texcoords.jpg)
_Texture coordinates in 3ds Max._ -Homogeneous texture coordinates are only assigned to the polygons where the logos are displayed. All the other polygons (marked here in red) are collapsed to a single coordinate point (upper left corner in the editor) to reduce texture coordinate data for the unmapped vertices... they only need a solid color, so an unused corner of the texture works fine. +Homogeneous texture coordinates are only assigned to the polygons where the logos are displayed. All the other polygons (marked here in red) are collapsed to a single coordinate point (upper left corner in the editor) to reduce texture coordinate data for the unmapped vertices... they only need a solid color, so an unused corner of the texture works fine. Only the earhook meshes need texture coordinates. Because unused data increases the file size, it is best to remove unused texture coordinates from meshes that don't need them. All the meshes except the earhooks have had their texcoord data removed. @@ -162,6 +162,6 @@ Materials were created using [Autodesk 3ds Max](https://www.autodesk.com/product Copyright metadata was added using [Microsoft Visual Studio Code](https://code.visualstudio.com) with the [Cesium glTF Tools Extension](https://marketplace.visualstudio.com/items?itemName=cesium.gltf-vscode). -After conversion, the resulting glTF was then optimized with [RapidPipeline 3D Processor](https://docs.rapidpipeline.com/docs/componentDocs/3dProcessor/3d-processor-overview) to compact the data by removing unneeded information. In this case no decimation was required since the model uses only 13,396 triangles. +After conversion, the resulting glTF was then optimized with [RapidPipeline 3D Processor](https://docs.rapidpipeline.com/docs/componentDocs/3dProcessor/3d-processor-overview) to compact the data by removing unneeded information. In this case no decimation was required since the model uses only 13,396 triangles. -A variant with lossy compression was created with another run of RapidPipeline 3D Processor, applying Draco geometry compression and WebP texture compression. This compressed the glTF from 371,212 bytes down to 63,146 bytes, a 83% reduction in size. \ No newline at end of file +A variant with lossy compression was created with another run of RapidPipeline 3D Processor, applying Draco geometry compression and WebP texture compression. This compressed the glTF from 371,212 bytes down to 63,146 bytes, a 83% reduction in size. diff --git a/Models/SunglassesKhronos/glTF/SunglassesKhronos.gltf b/Models/SunglassesKhronos/glTF/SunglassesKhronos.gltf index 4a1f56bf..6b9464a1 100644 --- a/Models/SunglassesKhronos/glTF/SunglassesKhronos.gltf +++ b/Models/SunglassesKhronos/glTF/SunglassesKhronos.gltf @@ -1030,4 +1030,4 @@ "source": 0 } ] -} \ No newline at end of file +} diff --git a/Models/Suzanne/README.body.md b/Models/Suzanne/README.body.md index 27755618..94ac9d7f 100644 --- a/Models/Suzanne/README.body.md +++ b/Models/Suzanne/README.body.md @@ -5,4 +5,3 @@ ## Description _None provided._ - diff --git a/Models/TextureCoordinateTest/README.body.md b/Models/TextureCoordinateTest/README.body.md index 3e9c02c7..249745c8 100644 --- a/Models/TextureCoordinateTest/README.body.md +++ b/Models/TextureCoordinateTest/README.body.md @@ -23,4 +23,3 @@ This model demonstrates the orientation of texture coordinates. The materials a "type" : "VEC2" }, ``` - diff --git a/Models/TextureEncodingTest/README.body.md b/Models/TextureEncodingTest/README.body.md index 203885b6..d638f74b 100644 --- a/Models/TextureEncodingTest/README.body.md +++ b/Models/TextureEncodingTest/README.body.md @@ -17,4 +17,3 @@ For each of three material slots, four sample models are provided that use diffe * Models from the third and fourth columns represent the same materials using 1x1 textures with custom gamma values and custom ICC profiles respectively. Stored 8-bit pixel values are the same as for the second column. An example of incorrect handling of these cases is presented on the following screenshot. ![non-ignored_metadata](screenshot/non-ignored_metadata.png) - diff --git a/Models/TextureEncodingTest/glTF/TextureEncodingTest.gltf b/Models/TextureEncodingTest/glTF/TextureEncodingTest.gltf index 1bad8b15..3c02b2ca 100644 --- a/Models/TextureEncodingTest/glTF/TextureEncodingTest.gltf +++ b/Models/TextureEncodingTest/glTF/TextureEncodingTest.gltf @@ -675,4 +675,4 @@ "wrapT": 33071 } ] -} \ No newline at end of file +} diff --git a/Models/TextureLinearInterpolationTest/README.body.md b/Models/TextureLinearInterpolationTest/README.body.md index 8cf2265a..76723aba 100644 --- a/Models/TextureLinearInterpolationTest/README.body.md +++ b/Models/TextureLinearInterpolationTest/README.body.md @@ -13,4 +13,3 @@ This asset tests that linear texture interpolation is performed on linear values ![incorrect](screenshot/incorrect.png) > ⚠️ _**WARNING**: For technical and historical reasons, some engines — particularly those using WebGL 1.0 — apply sRGB decoding in the fragment shader. Such engines will "fail" this test, which is designed specifically to highlight a difference that is generally quite subtle. Modern APIs like WebGL 2.0 and WebGPU provide effective ways to avoid this issue._ - diff --git a/Models/TextureLinearInterpolationTest/glTF/TextureLinearInterpolationTest.gltf b/Models/TextureLinearInterpolationTest/glTF/TextureLinearInterpolationTest.gltf index 95e533da..aa8fd470 100644 --- a/Models/TextureLinearInterpolationTest/glTF/TextureLinearInterpolationTest.gltf +++ b/Models/TextureLinearInterpolationTest/glTF/TextureLinearInterpolationTest.gltf @@ -268,4 +268,4 @@ "magFilter": 9729 } ] -} \ No newline at end of file +} diff --git a/Models/TextureSettingsTest/README.body.md b/Models/TextureSettingsTest/README.body.md index 426335ab..c91578db 100644 --- a/Models/TextureSettingsTest/README.body.md +++ b/Models/TextureSettingsTest/README.body.md @@ -15,4 +15,3 @@ The texture repeat test uses the repetition to produce the green checkmark. If The texture mirror test uses mirroring to find the green checkmark. A non-mirrored repeat will result in a red "X", and texture clamping will result in a solid red block. All of the failure conditions are a different shape from the corresponding success condition, as well as being red in color. Specifically, the only tests that expect a solid-green successful result do not offer a solid-red fail condition, they only offer X's. This is so that people who are red/green colorblind can still easily compare the "Test" and "Sample" columns and easily spot any differences by shape. - diff --git a/Models/TextureTransformMultiTest/README.body.md b/Models/TextureTransformMultiTest/README.body.md index de31f9e3..a6ac23aa 100644 --- a/Models/TextureTransformMultiTest/README.body.md +++ b/Models/TextureTransformMultiTest/README.body.md @@ -55,4 +55,3 @@ But an additional limitation is revealed here: In the "Occlusion" "UV 0" test i The Clearcoat tests can be dark and low-contrast, an unfortunate consequence of the subtle nature of the clear coating. Use a bright reflection environment, or possibly post-process the resulting image in a paint program to bring out more contrast, as shown here. Two of the rows have curved test boxes, to help reflect more of the surrounding environment. The "UV 1" boxes shown here are blank due to a known limitation in this rendering engine, described above. But the "UV 0" boxes are showing the crossed-out circle. This indicates that KHR_texture_transform has not been applied to any of the Clearcoat inputs. - diff --git a/Models/TextureTransformMultiTest/glTF/TextureTransformMultiTest.gltf b/Models/TextureTransformMultiTest/glTF/TextureTransformMultiTest.gltf index 68cc380a..9d382484 100644 --- a/Models/TextureTransformMultiTest/glTF/TextureTransformMultiTest.gltf +++ b/Models/TextureTransformMultiTest/glTF/TextureTransformMultiTest.gltf @@ -1966,4 +1966,4 @@ "extensionsRequired": [ "KHR_texture_transform" ] -} \ No newline at end of file +} diff --git a/Models/TextureTransformTest/README.body.md b/Models/TextureTransformTest/README.body.md index cfb67567..67d5f1f6 100644 --- a/Models/TextureTransformTest/README.body.md +++ b/Models/TextureTransformTest/README.body.md @@ -29,4 +29,3 @@ The bottom middle quad tests the scale parameter with UV coordinates of `(0.0, 0 ### All The bottom right quad tests offset, rotation, and scale at the same time. If everything is supported correctly, the arrow should point to the green marker. - diff --git a/Models/TextureTransformTest/glTF/TextureTransformTest.gltf b/Models/TextureTransformTest/glTF/TextureTransformTest.gltf index 6dde51d9..7580382a 100644 --- a/Models/TextureTransformTest/glTF/TextureTransformTest.gltf +++ b/Models/TextureTransformTest/glTF/TextureTransformTest.gltf @@ -537,4 +537,4 @@ "minFilter": 9729 } ] -} \ No newline at end of file +} diff --git a/Models/ToyCar/README.body.md b/Models/ToyCar/README.body.md index f7990148..670df6b5 100644 --- a/Models/ToyCar/README.body.md +++ b/Models/ToyCar/README.body.md @@ -9,4 +9,3 @@ Above: Screenshot using Camera002 in [Babylon.js Sandbox](https://sandbox.babylo This model demonstrates the usage of [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen/README.md), [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_transmission/README.md) and [KHR_materials_clearcoat](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md). This model also includes eight sample cameras, featuring different angles on the car and its materials. In software packages that represent camera locations with 3D markers, it may be beneficial to reduce the size of these markers, as marker size is not specified in glTF. - diff --git a/Models/ToyCar/glTF/ToyCar.gltf b/Models/ToyCar/glTF/ToyCar.gltf index b8fe4708..3104f9bd 100644 --- a/Models/ToyCar/glTF/ToyCar.gltf +++ b/Models/ToyCar/glTF/ToyCar.gltf @@ -710,4 +710,4 @@ "minFilter": 9987 } ] -} \ No newline at end of file +} diff --git a/Models/TransmissionRoughnessTest/README.body.md b/Models/TransmissionRoughnessTest/README.body.md index e0e20cc1..ce1e909d 100644 --- a/Models/TransmissionRoughnessTest/README.body.md +++ b/Models/TransmissionRoughnessTest/README.body.md @@ -35,4 +35,3 @@ In the screenshots presented here, the second transmissive column most clearly s ![detail screenshot](screenshot/left-column-detail.jpg) This render is from Blender's Cycles path-tracing engine, using the same IBL as above. - diff --git a/Models/TransmissionTest/README.body.md b/Models/TransmissionTest/README.body.md index eb9488ec..ce34dde8 100644 --- a/Models/TransmissionTest/README.body.md +++ b/Models/TransmissionTest/README.body.md @@ -5,4 +5,3 @@ ## Description This model demonstrates the usage of the `KHR_materials_transmission`. The grid of spheres demonstrate different combinations of uniform transmission and textured transmission and how they should render in conjunction with opacity (`baseColor.a`) and surface roughness/metalicity. - diff --git a/Models/TransmissionTest/glTF/TransmissionTest.gltf b/Models/TransmissionTest/glTF/TransmissionTest.gltf index 25701527..790e2a0e 100644 --- a/Models/TransmissionTest/glTF/TransmissionTest.gltf +++ b/Models/TransmissionTest/glTF/TransmissionTest.gltf @@ -1625,4 +1625,4 @@ "KHR_materials_transmission", "KHR_xmp" ] -} \ No newline at end of file +} diff --git a/Models/TransmissionThinwallTestGrid/README.body.md b/Models/TransmissionThinwallTestGrid/README.body.md index 5eb405a5..a49b6461 100644 --- a/Models/TransmissionThinwallTestGrid/README.body.md +++ b/Models/TransmissionThinwallTestGrid/README.body.md @@ -7,4 +7,4 @@ This asset tests the differences in index of refraction between thin-wall and volumetric transmission, using extensions [KHR_materials_ior](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_ior), [KHR_materials_transmission](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission), and [KHR_materials_volume](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_volume). The top row of spheres omits the volume extension to cause thin-wall behavior. -The spheres in the bottom row are 2m in diameter with a volume `thicknessFactor` of 1m, to approximate an average thickness through each volume. \ No newline at end of file +The spheres in the bottom row are 2m in diameter with a volume `thicknessFactor` of 1m, to approximate an average thickness through each volume. diff --git a/Models/Triangle/glTF-Embedded/Triangle.gltf b/Models/Triangle/glTF-Embedded/Triangle.gltf index 40cab5a1..ad3ceb20 100644 --- a/Models/Triangle/glTF-Embedded/Triangle.gltf +++ b/Models/Triangle/glTF-Embedded/Triangle.gltf @@ -5,13 +5,13 @@ "nodes" : [ 0 ] } ], - + "nodes" : [ { "mesh" : 0 } ], - + "meshes" : [ { "primitives" : [ { @@ -63,7 +63,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/Triangle/glTF/Triangle.gltf b/Models/Triangle/glTF/Triangle.gltf index 0bb222c8..04040695 100644 --- a/Models/Triangle/glTF/Triangle.gltf +++ b/Models/Triangle/glTF/Triangle.gltf @@ -5,13 +5,13 @@ "nodes" : [ 0 ] } ], - + "nodes" : [ { "mesh" : 0 } ], - + "meshes" : [ { "primitives" : [ { @@ -63,7 +63,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git a/Models/TriangleWithoutIndices/README.body.md b/Models/TriangleWithoutIndices/README.body.md index 5ff1f202..97fb282a 100644 --- a/Models/TriangleWithoutIndices/README.body.md +++ b/Models/TriangleWithoutIndices/README.body.md @@ -12,4 +12,4 @@ section of the glTF tutorial, but without any index information. The following image shows the data layout of this sample: -![triangleWithoutIndices](screenshot/triangleWithoutIndices.png) \ No newline at end of file +![triangleWithoutIndices](screenshot/triangleWithoutIndices.png) diff --git a/Models/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf b/Models/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf index 1c0736ab..9fa2ef84 100644 --- a/Models/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf +++ b/Models/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf @@ -5,7 +5,7 @@ "nodes" : [ 0 ] } ], - + "nodes" : [ { "mesh" : 0 @@ -47,8 +47,8 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } -} \ No newline at end of file +} diff --git a/Models/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf b/Models/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf index b3acc558..57c338e8 100644 --- a/Models/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf +++ b/Models/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf @@ -5,7 +5,7 @@ "nodes" : [ 0 ] } ], - + "nodes" : [ { "mesh" : 0 @@ -47,7 +47,7 @@ "min" : [ 0.0, 0.0, 0.0 ] } ], - + "asset" : { "version" : "2.0" } diff --git "a/Models/Unicode\342\235\244\342\231\273Test/glTF/Unicode\342\235\244\342\231\273Test.gltf" "b/Models/Unicode\342\235\244\342\231\273Test/glTF/Unicode\342\235\244\342\231\273Test.gltf" index 3fe78f68..6f6c0bf4 100644 --- "a/Models/Unicode\342\235\244\342\231\273Test/glTF/Unicode\342\235\244\342\231\273Test.gltf" +++ "b/Models/Unicode\342\235\244\342\231\273Test/glTF/Unicode\342\235\244\342\231\273Test.gltf" @@ -128,4 +128,4 @@ "source": 0 } ] -} \ No newline at end of file +} diff --git a/Models/UnlitTest/README.body.md b/Models/UnlitTest/README.body.md index 30f12c5c..913a16ad 100644 --- a/Models/UnlitTest/README.body.md +++ b/Models/UnlitTest/README.body.md @@ -30,4 +30,3 @@ The first list includes all extensions used by the current model, so there's no For this reason, I decided to include `KHR_materials_unlit` in the `extensionsRequired` list in this case. A conforming glTF implementation that does not support the `KHR_materials_unlit` extension should find an unknown value in the `extensionsRequired` list, and report an error rather than loading or displaying the model without the unlit material. In your own models, if you consider using a lit material to be a reasonable fallback behavior for implementations that don't support this extension, you should omit `KHR_materials_unlit` from the `extensionsRequired` list. - diff --git a/Models/VertexColorTest/README.body.md b/Models/VertexColorTest/README.body.md index 31350c62..2f93d86d 100644 --- a/Models/VertexColorTest/README.body.md +++ b/Models/VertexColorTest/README.body.md @@ -7,4 +7,3 @@ This model tests the attribute semantic `COLOR_0`, as defined in the glTF [Metallic Roughness Material](https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material), to check if it has been multipled by `baseColor`. For engines that read the vertex colors and apply them, you should see two rows of checkmarks, as shown in the screenshot. The top row is the "Test" row, which has been multipled by red, green, and blue vertex colors to reveal checkmarks in the corresponding color channels. The bottom row is a "sample pass" row, where checkmarks of each color are multiplied by white and should appear the same as the screenshot regardless of the rendering engine's ability to process vertex colors. For engines that ignore vertex colors, the top row of checks will look noticably mangled. The red check has a cyan X, the green check has a magenta X, and the blue check has a yellow X, occupying the other two color channels of each test checkmark. If you see these "X" marks fighting with the checkmarks, then you are seeing color channels that are supposed to have been zeroed out by the applied vertex colors on the mesh, and it means your rendering engine has not applied the vertex colors. - diff --git a/Models/WaterBottle/glTF/WaterBottle.gltf b/Models/WaterBottle/glTF/WaterBottle.gltf index 9f23f3ad..960f4be0 100644 --- a/Models/WaterBottle/glTF/WaterBottle.gltf +++ b/Models/WaterBottle/glTF/WaterBottle.gltf @@ -169,4 +169,4 @@ "source": 3 } ] -} \ No newline at end of file +} diff --git a/Models/glTF_RGB_June16.svg b/Models/glTF_RGB_June16.svg index cda5f6e5..a9156c42 100644 --- a/Models/glTF_RGB_June16.svg +++ b/Models/glTF_RGB_June16.svg @@ -38,10 +38,10 @@ - - diff --git a/README.md b/README.md index 50f1c481..d8387fa2 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ## Introduction -This Repository is a curated collection of glTF models that illustrate one or more features or capabilities of glTF. +This Repository is a curated collection of glTF models that illustrate one or more features or capabilities of glTF. ## Lists diff --git a/SubmittingModels.md b/SubmittingModels.md index 5104d55b..09102f36 100644 --- a/SubmittingModels.md +++ b/SubmittingModels.md @@ -20,16 +20,16 @@ All models must pass the glTF-Validator. This is automatically run on submission The documentation accompanying a model must also be valid. Valid documentation includes the following 1. A correctly written README that describes the model and the features of the model that make it appropriate of this repo. This must be structured and formatted according to the description below. -1. Correct metadata in the file associated with the model. The metadata must include the correct and complete legal information (ownership, copyright, and license) +1. Correct metadata in the file associated with the model. The metadata must include the correct and complete legal information (ownership, copyright, and license) 1. A properly formatted screen capture of the model ### Model Approvals **Model Reviews:** We invite everyone to review a submission. The primary criteria is that the model does what is claimed in the README. Suitability of the model for the repo will be determined separately. -**Model Updates:** The PR needs to describe what has changed from the current version and why this was done. Model update PRs need to be approved by at least one person besides the original creator. +**Model Updates:** The PR needs to describe what has changed from the current version and why this was done. Model update PRs need to be approved by at least one person besides the original creator. -**New Models:** The PR needs at least one approval from active members of the repo community. New submissions should following the process described below. If the model is to support a new extension, then +**New Models:** The PR needs at least one approval from active members of the repo community. New submissions should following the process described below. If the model is to support a new extension, then * The README must clearly state that it is a Test model for the extension * At least one of the reviewers needs to be involved in the creation of the extension @@ -71,7 +71,7 @@ To contribute a model, open a pull request with a new subdirectory containing th 1. The description file must include the following items. 1. Second-level (`##`) tag for the model screenshot 1. Second-level (`##`) tag for the model description - 1. The description should also have a screen shot. + 1. The description should also have a screen shot. 1. This screen shot should have the horizontal dimension between 1000 to 2000 pixels 1. The vertical dimension should be between 500 to 1000 pixels 1. The model needs to retain the proper perspective. @@ -101,7 +101,7 @@ The system will attempt to list the copyrights with the oldest one first. Some m #### Displayed License & Credit Format -The system automatically generates a license and credit block in the format below. Do not include the license and credit block. You may include details that require explanation beyond that in the credit block. +The system automatically generates a license and credit block in the format below. Do not include the license and credit block. You may include details that require explanation beyond that in the credit block. The format of the automatically generated credit block is: @@ -112,7 +112,7 @@ The format of the automatically generated credit block is: ### Tags -All assets in the repository are assigned tags by the asset submitter and potentially by Repository managers. These tags allow others to easily find the asset and related assets. You may assign any tag you wish; however, only a limited number of tags are used to construct the summary displays. +All assets in the repository are assigned tags by the asset submitter and potentially by Repository managers. These tags allow others to easily find the asset and related assets. You may assign any tag you wish; however, only a limited number of tags are used to construct the summary displays. ### Example Metadata File @@ -152,7 +152,7 @@ The _legal_ structure contains information about each owner of the model. It com | | | | | |--|--|--|--| -| Abbreviation | License Name | License | Legal +| Abbreviation | License Name | License | Legal | CC BY | Attribution-ShareAlike | [Deed](https://creativecommons.org/licenses/by/4.0/) | [Code](https://creativecommons.org/licenses/by/4.0/legalcode) | CC BY-SA | Attribution-ShareAlike | [Deed](https://creativecommons.org/licenses/by-sa/4.0/) | [Code](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | CC BY-ND | Attribution-NoDerivatives | [Deed](https://creativecommons.org/licenses/by-nd/4.0/) | [Code](https://creativecommons.org/licenses/by-nd/4.0/legalcode) diff --git a/util/CreateJson.html b/util/CreateJson.html index 9762d1be..f79c2430 100644 --- a/util/CreateJson.html +++ b/util/CreateJson.html @@ -5,9 +5,9 @@ - + Sample Asset Metadata Generator - + @@ -30,13 +30,13 @@ .noshow {display:none; } - +

Metadata Generator for glTF Sample Assets

DRAFT - Testing & Development Only

Introduction

-

All submissions to the glTF Sample Asset repo must include a JSON file containing metadata. +

All submissions to the glTF Sample Asset repo must include a JSON file containing metadata. This page prompts the user for the required and optional information and generates the JSON for the user.

@@ -129,12 +129,12 @@

Legal / Copyright / License

- +
- + @@ -232,7 +232,7 @@

Legal / Copyright / License

for (key in scalars) { localMetadata[key] = scalars[key]; } - + // Deal with Arrays (just one) // Process child elements (check boxes) for TAGS ele = document.getElementById('itemTags'); @@ -245,7 +245,7 @@

Legal / Copyright / License

if (tags.length > 0) { localMetadata['tags'] = tags; } - + // Deal with Objects (Legal) for (ii=1; ii<(document.getElementById('LegalCount')).value; ii++) { ele = document.getElementById('legal_'+ii); @@ -257,11 +257,11 @@

Legal / Copyright / License

scalars["icon"] = ""; localMetadata['legal'][localMetadata['legal'].length] = scalars; } - - + + // Convert to JSON stringMetadata = JSON.stringify (localMetadata, null, 4); - + eOutput = document.getElementById ('JSON'); eOutput.value = stringMetadata; }); @@ -269,4 +269,4 @@

Legal / Copyright / License

- + diff --git a/util/run.bash b/util/run.bash index 324aea16..e3ac19a4 100644 --- a/util/run.bash +++ b/util/run.bash @@ -4,17 +4,17 @@ # # Copyright: 2023, The Khronos Group. # Author: Leonard Daly, Daly Realism -# +# # SPDX-FileCopyrightText: 2023, The Khronos Group -# +# # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.