Using local Gltf structure

This commit is contained in:
mklefrancois 2020-12-14 17:11:22 +01:00
parent c9428a281e
commit 1abee6e84c
5 changed files with 29 additions and 40 deletions

View file

@ -28,7 +28,7 @@ layout(location = 4) in vec3 worldPos;
// Outgoing
layout(location = 0) out vec4 outColor;
// Buffers
layout(set = 0, binding = B_MATERIALS) buffer _GltfMaterial { GltfMaterial materials[]; };
layout(set = 0, binding = B_MATERIALS) buffer _GltfMaterial { GltfShadeMaterial materials[]; };
layout(set = 0, binding = B_TEXTURES) uniform sampler2D[] textureSamplers;
// clang-format on
@ -37,7 +37,7 @@ layout(set = 0, binding = B_TEXTURES) uniform sampler2D[] textureSamplers;
void main()
{
// Material of the object
GltfMaterial mat = materials[nonuniformEXT(pushC.matetrialId)];
GltfShadeMaterial mat = materials[nonuniformEXT(pushC.matetrialId)];
vec3 N = normalize(fragNormal);

View file

@ -1,34 +1,12 @@
struct GltfMaterial
struct GltfShadeMaterial
{
int shadingModel; // 0: metallic-roughness, 1: specular-glossiness
// PbrMetallicRoughness
vec4 pbrBaseColorFactor;
int pbrBaseColorTexture;
float pbrMetallicFactor;
float pbrRoughnessFactor;
int pbrMetallicRoughnessTexture;
// KHR_materials_pbrSpecularGlossiness
vec4 khrDiffuseFactor;
int khrDiffuseTexture;
vec3 khrSpecularFactor;
float khrGlossinessFactor;
int khrSpecularGlossinessTexture;
int emissiveTexture;
vec3 emissiveFactor;
int alphaMode;
float alphaCutoff;
bool doubleSided;
int normalTexture;
float normalTextureScale;
int occlusionTexture;
float occlusionTextureStrength;
vec4 pbrBaseColorFactor;
int pbrBaseColorTexture;
vec3 emissiveFactor;
};
#ifndef __cplusplus
struct PrimMeshInfo
{
uint indexOffset;
@ -37,14 +15,14 @@ struct PrimMeshInfo
};
vec3 computeDiffuse(GltfMaterial mat, vec3 lightDir, vec3 normal)
vec3 computeDiffuse(GltfShadeMaterial mat, vec3 lightDir, vec3 normal)
{
// Lambertian
float dotNL = max(dot(normal, lightDir), 0.0);
return mat.pbrBaseColorFactor.xyz * dotNL;
}
vec3 computeSpecular(GltfMaterial mat, vec3 viewDir, vec3 lightDir, vec3 normal)
vec3 computeSpecular(GltfShadeMaterial mat, vec3 viewDir, vec3 lightDir, vec3 normal)
{
// Compute specular only if not in shadow
const float kPi = 3.14159265;
@ -58,3 +36,4 @@ vec3 computeSpecular(GltfMaterial mat, vec3 viewDir, vec3 lightDir, vec3 normal)
return vec3(specular);
}
#endif

View file

@ -23,7 +23,7 @@ layout(set = 1, binding = B_VERTICES) readonly buffer _VertexBuf {float vertices
layout(set = 1, binding = B_INDICES) readonly buffer _Indices {uint indices[];};
layout(set = 1, binding = B_NORMALS) readonly buffer _NormalBuf {float normals[];};
layout(set = 1, binding = B_TEXCOORDS) readonly buffer _TexCoordBuf {float texcoord0[];};
layout(set = 1, binding = B_MATERIALS) readonly buffer _MaterialBuffer {GltfMaterial materials[];};
layout(set = 1, binding = B_MATERIALS) readonly buffer _MaterialBuffer {GltfShadeMaterial materials[];};
layout(set = 1, binding = B_TEXTURES) uniform sampler2D texturesMap[]; // all textures
@ -107,8 +107,8 @@ void main()
// https://en.wikipedia.org/wiki/Path_tracing
// Material of the object
GltfMaterial mat = materials[nonuniformEXT(matIndex)];
vec3 emittance = mat.emissiveFactor;
GltfShadeMaterial mat = materials[nonuniformEXT(matIndex)];
vec3 emittance = mat.emissiveFactor;
// Pick a random direction from here and keep going.
vec3 tangent, bitangent;

View file

@ -21,7 +21,7 @@ layout(set = 1, binding = B_VERTICES) readonly buffer _VertexBuf {float vertices
layout(set = 1, binding = B_INDICES) readonly buffer _Indices {uint indices[];};
layout(set = 1, binding = B_NORMALS) readonly buffer _NormalBuf {float normals[];};
layout(set = 1, binding = B_TEXCOORDS) readonly buffer _TexCoordBuf {float texcoord0[];};
layout(set = 1, binding = B_MATERIALS) readonly buffer _MaterialBuffer {GltfMaterial materials[];};
layout(set = 1, binding = B_MATERIALS) readonly buffer _MaterialBuffer {GltfShadeMaterial materials[];};
layout(set = 1, binding = B_TEXTURES) uniform sampler2D texturesMap[]; // all textures
@ -121,7 +121,7 @@ void main()
}
// Material of the object
GltfMaterial mat = materials[nonuniformEXT(matIndex)];
GltfShadeMaterial mat = materials[nonuniformEXT(matIndex)];
// Diffuse
vec3 diffuse = computeDiffuse(mat, L, world_normal);