feat: add pbr support
This commit is contained in:
@@ -57,11 +57,6 @@ MaterialID MaterialCache::addMaterial(Material material)
|
||||
device->waitIdle();
|
||||
}
|
||||
|
||||
const auto getTextureOrElse = [](ImageID imageId, ImageID placeholder)
|
||||
{
|
||||
return imageId != NULL_IMAGE_ID ? imageId : placeholder;
|
||||
};
|
||||
|
||||
MaterialData* data = static_cast<MaterialData*>(materialDataBuffer.info.pMappedData);
|
||||
|
||||
const auto id = getFreeMaterialId();
|
||||
@@ -72,28 +67,7 @@ MaterialID MaterialCache::addMaterial(Material material)
|
||||
throw std::runtime_error("MaterialCache material buffer is not mapped");
|
||||
}
|
||||
|
||||
data[id] = MaterialData{
|
||||
.baseColor = glm::vec4(material.baseColor, 1.0f),
|
||||
|
||||
.metalRoughnessEmissive = glm::vec4{
|
||||
material.metallicFactor,
|
||||
material.roughnessFactor,
|
||||
material.emissiveFactor,
|
||||
0.f
|
||||
},
|
||||
|
||||
.textureFilteringMode = static_cast<std::uint32_t>(material.textureFilteringMode),
|
||||
|
||||
.diffuseTex = getTextureOrElse(
|
||||
material.diffuseTexture,
|
||||
defaultTextures.white),
|
||||
|
||||
.normalTex = defaultTextures.normal,
|
||||
|
||||
.metallicRoughnessTex = defaultTextures.metallicRoughness,
|
||||
|
||||
.emissiveTex = defaultTextures.emissive,
|
||||
};
|
||||
data[id] = toMaterialData(material);
|
||||
device->getMemoryManager().flushAllocation(
|
||||
materialDataBuffer,
|
||||
static_cast<VkDeviceSize>(id) * sizeof(MaterialData),
|
||||
@@ -190,6 +164,35 @@ std::optional<MaterialID> MaterialCache::findMaterialByName(
|
||||
return fallback;
|
||||
}
|
||||
|
||||
MaterialData MaterialCache::toMaterialData(const Material& material) const
|
||||
{
|
||||
const auto getTextureOrElse = [](ImageID imageId, ImageID placeholder)
|
||||
{
|
||||
return imageId != NULL_IMAGE_ID ? imageId : placeholder;
|
||||
};
|
||||
|
||||
return MaterialData{
|
||||
.baseColor = glm::vec4(material.baseColor, 1.0f),
|
||||
.emissiveColor = glm::vec4(material.emissiveColor, 0.0f),
|
||||
|
||||
.metallicRoughnessNormalOcclusion = glm::vec4{
|
||||
material.metallicFactor,
|
||||
material.roughnessFactor,
|
||||
material.normalScale,
|
||||
material.occlusionStrength
|
||||
},
|
||||
|
||||
.textureFilteringMode = static_cast<std::uint32_t>(material.textureFilteringMode),
|
||||
.diffuseTex = getTextureOrElse(material.diffuseTexture, defaultTextures.white),
|
||||
.normalTex = getTextureOrElse(material.normalTexture, defaultTextures.normal),
|
||||
.metallicTex = getTextureOrElse(material.metallicTexture, defaultTextures.metallicRoughness),
|
||||
.roughnessTex = getTextureOrElse(material.roughnessTexture, defaultTextures.metallicRoughness),
|
||||
.occlusionTex = getTextureOrElse(material.occlusionTexture, defaultTextures.white),
|
||||
.emissiveTex = getTextureOrElse(material.emissiveTexture, defaultTextures.emissive),
|
||||
._pad0 = 0,
|
||||
};
|
||||
}
|
||||
|
||||
MaterialID MaterialCache::getFreeMaterialId() const
|
||||
{
|
||||
return static_cast<MaterialID>(materials.size());
|
||||
@@ -212,32 +215,10 @@ void MaterialCache::updateMaterialGPU(MaterialID id)
|
||||
assert(id < materials.size());
|
||||
assert(materialDataBuffer.info.pMappedData && "materialDataBuffer must be mapped");
|
||||
|
||||
const auto getTextureOrElse = [](ImageID imageId, ImageID placeholder)
|
||||
{
|
||||
return imageId != NULL_IMAGE_ID ? imageId : placeholder;
|
||||
};
|
||||
|
||||
Material& material = materials[id];
|
||||
|
||||
MaterialData* data =
|
||||
reinterpret_cast<MaterialData*>(materialDataBuffer.info.pMappedData);
|
||||
|
||||
data[id] = MaterialData{
|
||||
.baseColor = glm::vec4(material.baseColor, 1.0f),
|
||||
|
||||
.metalRoughnessEmissive = glm::vec4{
|
||||
material.metallicFactor,
|
||||
material.roughnessFactor,
|
||||
material.emissiveFactor,
|
||||
0.f
|
||||
},
|
||||
|
||||
.textureFilteringMode = static_cast<std::uint32_t>(material.textureFilteringMode),
|
||||
.diffuseTex = getTextureOrElse(material.diffuseTexture, defaultTextures.white),
|
||||
.normalTex = defaultTextures.normal,
|
||||
.metallicRoughnessTex = defaultTextures.metallicRoughness,
|
||||
.emissiveTex = defaultTextures.emissive,
|
||||
};
|
||||
data[id] = toMaterialData(materials[id]);
|
||||
device->getMemoryManager().flushAllocation(
|
||||
materialDataBuffer,
|
||||
static_cast<VkDeviceSize>(id) * sizeof(MaterialData),
|
||||
|
||||
Reference in New Issue
Block a user