feat: add pbr support
|
After Width: | Height: | Size: 3.1 MiB |
@@ -0,0 +1,712 @@
|
||||
{
|
||||
"asset": {
|
||||
"version": "2.0",
|
||||
"generator": "babylon.js glTF exporter for Maya 2018 v20200228.3 (with minor hand modifications)"
|
||||
},
|
||||
"extensionsUsed": [
|
||||
"KHR_materials_transmission"
|
||||
],
|
||||
"scene": 0,
|
||||
"scenes": [
|
||||
{
|
||||
"nodes": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5
|
||||
]
|
||||
}
|
||||
],
|
||||
"nodes": [
|
||||
{
|
||||
"mesh": 0,
|
||||
"name": "Hose_low"
|
||||
},
|
||||
{
|
||||
"mesh": 1,
|
||||
"name": "RubberWood_low"
|
||||
},
|
||||
{
|
||||
"mesh": 2,
|
||||
"name": "GlassPlastic_low"
|
||||
},
|
||||
{
|
||||
"mesh": 3,
|
||||
"name": "MetalParts_low"
|
||||
},
|
||||
{
|
||||
"mesh": 4,
|
||||
"name": "LeatherParts_low"
|
||||
},
|
||||
{
|
||||
"mesh": 5,
|
||||
"name": "Lenses_low"
|
||||
}
|
||||
],
|
||||
"meshes": [
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"attributes": {
|
||||
"POSITION": 1,
|
||||
"TANGENT": 2,
|
||||
"NORMAL": 3,
|
||||
"TEXCOORD_0": 4
|
||||
},
|
||||
"indices": 0,
|
||||
"material": 0
|
||||
}
|
||||
],
|
||||
"name": "Hose_low"
|
||||
},
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"attributes": {
|
||||
"POSITION": 6,
|
||||
"TANGENT": 7,
|
||||
"NORMAL": 8,
|
||||
"TEXCOORD_0": 9
|
||||
},
|
||||
"indices": 5,
|
||||
"material": 1
|
||||
}
|
||||
],
|
||||
"name": "RubberWood_low"
|
||||
},
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"attributes": {
|
||||
"POSITION": 11,
|
||||
"TANGENT": 12,
|
||||
"NORMAL": 13,
|
||||
"TEXCOORD_0": 14
|
||||
},
|
||||
"indices": 10,
|
||||
"material": 2
|
||||
}
|
||||
],
|
||||
"name": "GlassPlastic_low"
|
||||
},
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"attributes": {
|
||||
"POSITION": 16,
|
||||
"TANGENT": 17,
|
||||
"NORMAL": 18,
|
||||
"TEXCOORD_0": 19
|
||||
},
|
||||
"indices": 15,
|
||||
"material": 3
|
||||
}
|
||||
],
|
||||
"name": "MetalParts_low"
|
||||
},
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"attributes": {
|
||||
"POSITION": 21,
|
||||
"TANGENT": 22,
|
||||
"NORMAL": 23,
|
||||
"TEXCOORD_0": 24
|
||||
},
|
||||
"indices": 20,
|
||||
"material": 4
|
||||
}
|
||||
],
|
||||
"name": "LeatherParts_low"
|
||||
},
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"attributes": {
|
||||
"POSITION": 26,
|
||||
"TANGENT": 27,
|
||||
"NORMAL": 28,
|
||||
"TEXCOORD_0": 29
|
||||
},
|
||||
"indices": 25,
|
||||
"material": 5
|
||||
}
|
||||
],
|
||||
"name": "Lenses_low"
|
||||
}
|
||||
],
|
||||
"accessors": [
|
||||
{
|
||||
"bufferView": 0,
|
||||
"componentType": 5123,
|
||||
"count": 59040,
|
||||
"type": "SCALAR",
|
||||
"name": "accessorIndices"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"componentType": 5126,
|
||||
"count": 10472,
|
||||
"max": [
|
||||
0.10810829,
|
||||
0.356580257,
|
||||
0.190409869
|
||||
],
|
||||
"min": [
|
||||
-0.07221258,
|
||||
0.104120225,
|
||||
-0.088394776
|
||||
],
|
||||
"type": "VEC3",
|
||||
"name": "accessorPositions"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"componentType": 5126,
|
||||
"count": 10472,
|
||||
"type": "VEC4",
|
||||
"name": "accessorTangents"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 125664,
|
||||
"componentType": 5126,
|
||||
"count": 10472,
|
||||
"type": "VEC3",
|
||||
"name": "accessorNormals"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"componentType": 5126,
|
||||
"count": 10472,
|
||||
"type": "VEC2",
|
||||
"name": "accessorUVs"
|
||||
},
|
||||
{
|
||||
"bufferView": 0,
|
||||
"byteOffset": 118080,
|
||||
"componentType": 5123,
|
||||
"count": 72534,
|
||||
"type": "SCALAR",
|
||||
"name": "accessorIndices"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 251328,
|
||||
"componentType": 5126,
|
||||
"count": 13638,
|
||||
"max": [
|
||||
0.162940636,
|
||||
0.7025226,
|
||||
0.200029165
|
||||
],
|
||||
"min": [
|
||||
-0.158857465,
|
||||
-2.14242937E-05,
|
||||
-0.171545789
|
||||
],
|
||||
"type": "VEC3",
|
||||
"name": "accessorPositions"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"byteOffset": 167552,
|
||||
"componentType": 5126,
|
||||
"count": 13638,
|
||||
"type": "VEC4",
|
||||
"name": "accessorTangents"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 414984,
|
||||
"componentType": 5126,
|
||||
"count": 13638,
|
||||
"type": "VEC3",
|
||||
"name": "accessorNormals"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"byteOffset": 83776,
|
||||
"componentType": 5126,
|
||||
"count": 13638,
|
||||
"type": "VEC2",
|
||||
"name": "accessorUVs"
|
||||
},
|
||||
{
|
||||
"bufferView": 0,
|
||||
"byteOffset": 263148,
|
||||
"componentType": 5123,
|
||||
"count": 24408,
|
||||
"type": "SCALAR",
|
||||
"name": "accessorIndices"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 578640,
|
||||
"componentType": 5126,
|
||||
"count": 4676,
|
||||
"max": [
|
||||
0.140494063,
|
||||
0.61828655,
|
||||
0.147373646
|
||||
],
|
||||
"min": [
|
||||
-0.140846014,
|
||||
0.440957,
|
||||
-0.107818365
|
||||
],
|
||||
"type": "VEC3",
|
||||
"name": "accessorPositions"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"byteOffset": 385760,
|
||||
"componentType": 5126,
|
||||
"count": 4676,
|
||||
"type": "VEC4",
|
||||
"name": "accessorTangents"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 634752,
|
||||
"componentType": 5126,
|
||||
"count": 4676,
|
||||
"type": "VEC3",
|
||||
"name": "accessorNormals"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"byteOffset": 192880,
|
||||
"componentType": 5126,
|
||||
"count": 4676,
|
||||
"type": "VEC2",
|
||||
"name": "accessorUVs"
|
||||
},
|
||||
{
|
||||
"bufferView": 0,
|
||||
"byteOffset": 311964,
|
||||
"componentType": 5123,
|
||||
"count": 60288,
|
||||
"type": "SCALAR",
|
||||
"name": "accessorIndices"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 690864,
|
||||
"componentType": 5126,
|
||||
"count": 13636,
|
||||
"max": [
|
||||
0.132708371,
|
||||
0.6024364,
|
||||
0.199477077
|
||||
],
|
||||
"min": [
|
||||
-0.203642711,
|
||||
0.02116075,
|
||||
-0.147512689
|
||||
],
|
||||
"type": "VEC3",
|
||||
"name": "accessorPositions"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"byteOffset": 460576,
|
||||
"componentType": 5126,
|
||||
"count": 13636,
|
||||
"type": "VEC4",
|
||||
"name": "accessorTangents"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 854496,
|
||||
"componentType": 5126,
|
||||
"count": 13636,
|
||||
"type": "VEC3",
|
||||
"name": "accessorNormals"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"byteOffset": 230288,
|
||||
"componentType": 5126,
|
||||
"count": 13636,
|
||||
"type": "VEC2",
|
||||
"name": "accessorUVs"
|
||||
},
|
||||
{
|
||||
"bufferView": 0,
|
||||
"byteOffset": 432540,
|
||||
"componentType": 5123,
|
||||
"count": 65688,
|
||||
"type": "SCALAR",
|
||||
"name": "accessorIndices"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 1018128,
|
||||
"componentType": 5126,
|
||||
"count": 12534,
|
||||
"max": [
|
||||
0.124933377,
|
||||
0.716000438,
|
||||
0.129168555
|
||||
],
|
||||
"min": [
|
||||
-0.125863016,
|
||||
0.2958266,
|
||||
-0.1541516
|
||||
],
|
||||
"type": "VEC3",
|
||||
"name": "accessorPositions"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"byteOffset": 678752,
|
||||
"componentType": 5126,
|
||||
"count": 12534,
|
||||
"type": "VEC4",
|
||||
"name": "accessorTangents"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 1168536,
|
||||
"componentType": 5126,
|
||||
"count": 12534,
|
||||
"type": "VEC3",
|
||||
"name": "accessorNormals"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"byteOffset": 339376,
|
||||
"componentType": 5126,
|
||||
"count": 12534,
|
||||
"type": "VEC2",
|
||||
"name": "accessorUVs"
|
||||
},
|
||||
{
|
||||
"bufferView": 0,
|
||||
"byteOffset": 563916,
|
||||
"componentType": 5123,
|
||||
"count": 2208,
|
||||
"type": "SCALAR",
|
||||
"name": "accessorIndices"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 1318944,
|
||||
"componentType": 5126,
|
||||
"count": 436,
|
||||
"max": [
|
||||
0.101920746,
|
||||
0.5936986,
|
||||
0.152926728
|
||||
],
|
||||
"min": [
|
||||
-0.101920947,
|
||||
0.5300429,
|
||||
0.090174824
|
||||
],
|
||||
"type": "VEC3",
|
||||
"name": "accessorPositions"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"byteOffset": 879296,
|
||||
"componentType": 5126,
|
||||
"count": 436,
|
||||
"type": "VEC4",
|
||||
"name": "accessorTangents"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"byteOffset": 1324176,
|
||||
"componentType": 5126,
|
||||
"count": 436,
|
||||
"type": "VEC3",
|
||||
"name": "accessorNormals"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"byteOffset": 439648,
|
||||
"componentType": 5126,
|
||||
"count": 436,
|
||||
"type": "VEC2",
|
||||
"name": "accessorUVs"
|
||||
}
|
||||
],
|
||||
"bufferViews": [
|
||||
{
|
||||
"buffer": 0,
|
||||
"byteLength": 568332,
|
||||
"name": "bufferViewScalar"
|
||||
},
|
||||
{
|
||||
"buffer": 0,
|
||||
"byteOffset": 568332,
|
||||
"byteLength": 1329408,
|
||||
"byteStride": 12,
|
||||
"name": "bufferViewFloatVec3"
|
||||
},
|
||||
{
|
||||
"buffer": 0,
|
||||
"byteOffset": 1897740,
|
||||
"byteLength": 886272,
|
||||
"byteStride": 16,
|
||||
"name": "bufferViewFloatVec4"
|
||||
},
|
||||
{
|
||||
"buffer": 0,
|
||||
"byteOffset": 2784012,
|
||||
"byteLength": 443136,
|
||||
"byteStride": 8,
|
||||
"name": "bufferViewFloatVec2"
|
||||
}
|
||||
],
|
||||
"buffers": [
|
||||
{
|
||||
"uri": "FlightHelmet.bin",
|
||||
"byteLength": 3227148
|
||||
}
|
||||
],
|
||||
"materials": [
|
||||
{
|
||||
"pbrMetallicRoughness": {
|
||||
"baseColorTexture": {
|
||||
"index": 2
|
||||
},
|
||||
"metallicRoughnessTexture": {
|
||||
"index": 1
|
||||
}
|
||||
},
|
||||
"normalTexture": {
|
||||
"index": 0
|
||||
},
|
||||
"occlusionTexture": {
|
||||
"index": 1
|
||||
},
|
||||
"doubleSided": true,
|
||||
"name": "HoseMat"
|
||||
},
|
||||
{
|
||||
"pbrMetallicRoughness": {
|
||||
"baseColorTexture": {
|
||||
"index": 2
|
||||
},
|
||||
"metallicRoughnessTexture": {
|
||||
"index": 1
|
||||
}
|
||||
},
|
||||
"normalTexture": {
|
||||
"index": 0
|
||||
},
|
||||
"occlusionTexture": {
|
||||
"index": 1
|
||||
},
|
||||
"name": "RubberWoodMat"
|
||||
},
|
||||
{
|
||||
"pbrMetallicRoughness": {
|
||||
"baseColorTexture": {
|
||||
"index": 5
|
||||
},
|
||||
"metallicRoughnessTexture": {
|
||||
"index": 4
|
||||
}
|
||||
},
|
||||
"normalTexture": {
|
||||
"index": 3
|
||||
},
|
||||
"occlusionTexture": {
|
||||
"index": 4
|
||||
},
|
||||
"name": "GlassPlasticMat"
|
||||
},
|
||||
{
|
||||
"pbrMetallicRoughness": {
|
||||
"baseColorTexture": {
|
||||
"index": 8
|
||||
},
|
||||
"metallicRoughnessTexture": {
|
||||
"index": 7
|
||||
}
|
||||
},
|
||||
"normalTexture": {
|
||||
"index": 6
|
||||
},
|
||||
"occlusionTexture": {
|
||||
"index": 7
|
||||
},
|
||||
"name": "MetalPartsMat"
|
||||
},
|
||||
{
|
||||
"pbrMetallicRoughness": {
|
||||
"baseColorTexture": {
|
||||
"index": 11
|
||||
},
|
||||
"metallicRoughnessTexture": {
|
||||
"index": 10
|
||||
}
|
||||
},
|
||||
"normalTexture": {
|
||||
"index": 9
|
||||
},
|
||||
"occlusionTexture": {
|
||||
"index": 10
|
||||
},
|
||||
"name": "LeatherPartsMat"
|
||||
},
|
||||
{
|
||||
"extensions": {
|
||||
"KHR_materials_transmission": {
|
||||
"transmissionFactor": 1
|
||||
}
|
||||
},
|
||||
"pbrMetallicRoughness": {
|
||||
"baseColorTexture": {
|
||||
"index": 14
|
||||
},
|
||||
"metallicRoughnessTexture": {
|
||||
"index": 13
|
||||
}
|
||||
},
|
||||
"normalTexture": {
|
||||
"index": 12
|
||||
},
|
||||
"occlusionTexture": {
|
||||
"index": 13
|
||||
},
|
||||
"name": "LensesMat"
|
||||
}
|
||||
],
|
||||
"textures": [
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 0,
|
||||
"name": "FlightHelmet_Materials_RubberWoodMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 1,
|
||||
"name": "FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 2,
|
||||
"name": "FlightHelmet_Materials_RubberWoodMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 3,
|
||||
"name": "FlightHelmet_Materials_GlassPlasticMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 4,
|
||||
"name": "FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 5,
|
||||
"name": "FlightHelmet_Materials_GlassPlasticMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 6,
|
||||
"name": "FlightHelmet_Materials_MetalPartsMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 7,
|
||||
"name": "FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 8,
|
||||
"name": "FlightHelmet_Materials_MetalPartsMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 9,
|
||||
"name": "FlightHelmet_Materials_LeatherPartsMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 10,
|
||||
"name": "FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 11,
|
||||
"name": "FlightHelmet_Materials_LeatherPartsMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 12,
|
||||
"name": "FlightHelmet_Materials_LensesMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 13,
|
||||
"name": "FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"sampler": 0,
|
||||
"source": 14,
|
||||
"name": "FlightHelmet_Materials_LensesMat_BaseColor.png"
|
||||
}
|
||||
],
|
||||
"images": [
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_RubberWoodMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_RubberWoodMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_GlassPlasticMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_GlassPlasticMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_MetalPartsMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_MetalPartsMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_LeatherPartsMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_LeatherPartsMat_BaseColor.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_LensesMat_Normal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png"
|
||||
},
|
||||
{
|
||||
"uri": "FlightHelmet_Materials_LensesMat_BaseColor.png"
|
||||
}
|
||||
],
|
||||
"samplers": [
|
||||
{
|
||||
"magFilter": 9729,
|
||||
"minFilter": 9987
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 3.5 MiB |
|
After Width: | Height: | Size: 5.2 MiB |
|
After Width: | Height: | Size: 5.4 MiB |
|
After Width: | Height: | Size: 4.2 MiB |
|
After Width: | Height: | Size: 680 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 588 KiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 3.4 MiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
After Width: | Height: | Size: 3.6 MiB |
@@ -83,6 +83,18 @@ vec3 calculateLight(Light light, vec3 fragPos, vec3 n, vec3 v,
|
||||
return (diffuse + specular) * light.color * light.intensity * attenuation * NoL * occlusion;
|
||||
}
|
||||
|
||||
// Analytic approximation of the split sum environment BRDF (Karis, "Physically Based Shading on Mobile").
|
||||
// Used to light the flat ambient term with the same specular response as the lights.
|
||||
vec3 envBRDFApprox(vec3 f0, float roughness, float NoV)
|
||||
{
|
||||
const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
|
||||
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
|
||||
vec4 r = roughness * c0 + c1;
|
||||
float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;
|
||||
vec2 ab = vec2(-1.04, 1.04) * a004 + r.zw;
|
||||
return f0 * ab.x + ab.y;
|
||||
}
|
||||
|
||||
// blue -> green -> red, used to visualise how many lights a tile has
|
||||
vec3 lightHeatmapColor(uint lightCount)
|
||||
{
|
||||
|
||||
@@ -3,14 +3,19 @@
|
||||
|
||||
#extension GL_EXT_buffer_reference : require
|
||||
|
||||
// Must match MaterialData in Material.h
|
||||
struct MaterialData {
|
||||
vec4 baseColor;
|
||||
vec4 metallicRoughnessEmissive;
|
||||
vec4 emissiveColor;
|
||||
vec4 metallicRoughnessNormalOcclusion;
|
||||
uint textureFilteringMode;
|
||||
uint diffuseTex;
|
||||
uint normalTex;
|
||||
uint metallicRoughnessTex;
|
||||
uint metallicTex;
|
||||
uint roughnessTex;
|
||||
uint occlusionTex;
|
||||
uint emissiveTex;
|
||||
uint _pad0;
|
||||
};
|
||||
|
||||
layout (buffer_reference, std430) readonly buffer MaterialsBuffer {
|
||||
|
||||
@@ -12,14 +12,32 @@ layout (location = 0) in vec3 inPos;
|
||||
layout (location = 1) in vec2 inUV;
|
||||
layout (location = 2) in vec3 inNormal;
|
||||
layout (location = 3) in vec4 inTangent;
|
||||
layout (location = 4) in mat3 inTBN;
|
||||
|
||||
layout (location = 0) out vec4 outFragColor;
|
||||
|
||||
vec3 calculateNormal(MaterialData material, uint samplerID)
|
||||
{
|
||||
vec3 n = normalize(inNormal);
|
||||
|
||||
// Meshes without tangents can't use a normal map
|
||||
if (dot(inTangent.xyz, inTangent.xyz) < 1e-8) {
|
||||
return n;
|
||||
}
|
||||
|
||||
// Re-orthogonalize, the interpolated tangent isn't perpendicular to the normal anymore
|
||||
vec3 t = normalize(inTangent.xyz - n * dot(n, inTangent.xyz));
|
||||
vec3 b = cross(n, t) * inTangent.w;
|
||||
|
||||
vec3 tangentNormal = sampleTexture2D(material.normalTex, samplerID, inUV).rgb * 2.0 - 1.0;
|
||||
tangentNormal.xy *= material.metallicRoughnessNormalOcclusion.z;
|
||||
|
||||
return normalize(mat3(t, b, n) * tangentNormal);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
MaterialData material = pcs.sceneData.materials.data[pcs.materialID];
|
||||
uint samplerID = pcs.sceneData.materials.data[pcs.materialID].textureFilteringMode;
|
||||
uint samplerID = material.textureFilteringMode;
|
||||
|
||||
vec4 diffuse = sampleTexture2D(material.diffuseTex, samplerID, inUV) * material.baseColor;
|
||||
vec3 baseColor = diffuse.rgb;
|
||||
@@ -28,27 +46,18 @@ void main()
|
||||
// discard;
|
||||
// }
|
||||
|
||||
vec3 normal = normalize(inNormal);
|
||||
// if (inTangent != vec4(0.0)) {
|
||||
// // FIXME: sometimes Blender doesn't export tangents for some objects
|
||||
// // for some reason. When we will start computing tangents manually,
|
||||
// // this check can be removed
|
||||
// normal = sampleTexture2DLinear(material.normalTex, inUV).rgb;
|
||||
// // normal.y = 1 - normal.y; // flip to make OpenGL normal maps work
|
||||
// normal = inTBN * normalize(normal * 2.0 - 1.0);
|
||||
// normal = normalize(normal);
|
||||
// }
|
||||
vec3 n = calculateNormal(material, samplerID);
|
||||
|
||||
float metallicF = material.metallicRoughnessEmissive.r;
|
||||
float roughnessF = material.metallicRoughnessEmissive.g;
|
||||
float metallicF = material.metallicRoughnessNormalOcclusion.x;
|
||||
float roughnessF = material.metallicRoughnessNormalOcclusion.y;
|
||||
float occlusionStrength = material.metallicRoughnessNormalOcclusion.w;
|
||||
|
||||
vec4 metallicRoughness = sampleTexture2DLinear(material.metallicRoughnessTex, inUV);
|
||||
|
||||
float roughness = roughnessF * metallicRoughness.g;
|
||||
// roughness *= roughness; // from perceptual to linear
|
||||
float metallic = metallicF * sampleTexture2D(material.metallicTex, samplerID, inUV).b;
|
||||
float roughness = roughnessF * sampleTexture2D(material.roughnessTex, samplerID, inUV).g;
|
||||
roughness = max(roughness, 1e-2); // 0.0 roughness leads to NaNs
|
||||
|
||||
float metallic = metallicF * metallicRoughness.b;
|
||||
float occlusion = sampleTexture2D(material.occlusionTex, samplerID, inUV).r;
|
||||
float ambientOcclusion = mix(1.0, occlusion, occlusionStrength);
|
||||
|
||||
vec3 dielectricSpecular = vec3(0.04);
|
||||
vec3 black = vec3(0.0);
|
||||
@@ -57,7 +66,6 @@ void main()
|
||||
|
||||
vec3 cameraPos = pcs.sceneData.cameraPos.xyz;
|
||||
vec3 fragPos = inPos.xyz;
|
||||
vec3 n = normal;
|
||||
vec3 v = normalize(cameraPos - fragPos);
|
||||
|
||||
// forward+: only loop over the lights the culling pass put in this pixel's tile
|
||||
@@ -70,26 +78,28 @@ void main()
|
||||
uint lightIndex = pcs.sceneData.tileLightIndices.data[tileOffset + 1 + i];
|
||||
Light light = pcs.sceneData.lights.data[lightIndex];
|
||||
|
||||
float occlusion = 1.0;
|
||||
float shadow = 1.0;
|
||||
if (light.castShadows != 0) {
|
||||
occlusion = calculateDirectionalShadow(
|
||||
fragPos, n,
|
||||
shadow = calculateDirectionalShadow(
|
||||
fragPos, normalize(inNormal),
|
||||
pcs.sceneData.lightViewProj,
|
||||
pcs.sceneData.shadowMapId,
|
||||
pcs.sceneData.shadowNormalOffset);
|
||||
}
|
||||
|
||||
fragColor += calculateLight(light, fragPos, n, v,
|
||||
diffuseColor, roughness, metallic, f0, occlusion);
|
||||
diffuseColor, roughness, metallic, f0, shadow);
|
||||
}
|
||||
|
||||
// emissive
|
||||
float emissiveF = material.metallicRoughnessEmissive.b;
|
||||
vec3 emissiveColor = emissiveF * sampleTexture2DLinear(material.emissiveTex, inUV).rgb;
|
||||
vec3 emissiveColor = material.emissiveColor.rgb * sampleTexture2D(material.emissiveTex, samplerID, inUV).rgb;
|
||||
fragColor += emissiveColor;
|
||||
|
||||
// ambient
|
||||
fragColor += baseColor * pcs.sceneData.ambientColor * pcs.sceneData.ambientIntensity;
|
||||
// ambient, the specular part keeps metals from turning black without lights
|
||||
float NoV = clamp(dot(n, v), 0.0001, 1.0);
|
||||
vec3 ambientLight = pcs.sceneData.ambientColor * pcs.sceneData.ambientIntensity;
|
||||
vec3 ambientSpecular = envBRDFApprox(f0, roughness, NoV);
|
||||
fragColor += (diffuseColor + ambientSpecular) * ambientLight * ambientOcclusion;
|
||||
|
||||
if (pcs.sceneData.debugLightHeatmap != 0) {
|
||||
fragColor = mix(fragColor, lightHeatmapColor(tileLightCount), 0.5);
|
||||
@@ -104,7 +114,7 @@ void main()
|
||||
|
||||
#if 0
|
||||
// NORMAL DEBUG
|
||||
fragColor = normal;
|
||||
fragColor = n;
|
||||
#endif
|
||||
|
||||
outFragColor = vec4(fragColor, diffuse.a);
|
||||
|
||||
@@ -8,7 +8,6 @@ layout (location = 0) out vec3 outPos;
|
||||
layout (location = 1) out vec2 outUV;
|
||||
layout (location = 2) out vec3 outNormal;
|
||||
layout (location = 3) out vec4 outTangent;
|
||||
layout (location = 4) out mat3 outTBN;
|
||||
|
||||
// The depth pre-pass reuses this shader, positions have to match bit for bit
|
||||
// so the main pass can depth test against it with LESS_OR_EQUAL
|
||||
@@ -29,10 +28,6 @@ void main()
|
||||
// outNormal = (pcs.transform * vec4(v.normal, 0.0)).xyz;
|
||||
outNormal = mat3(transpose(inverse(pcs.transform))) * v.normal;
|
||||
|
||||
outTangent = v.tangent;
|
||||
|
||||
vec3 T = normalize(vec3(pcs.transform * v.tangent));
|
||||
vec3 N = normalize(outNormal);
|
||||
vec3 B = cross(N, T) * v.tangent.w;
|
||||
outTBN = mat3(T, B, N);
|
||||
// w is the bitangent sign, the fragment shader builds the TBN from the interpolated vectors
|
||||
outTangent = vec4(mat3(pcs.transform) * v.tangent.xyz, v.tangent.w);
|
||||
}
|
||||
|
||||