重构材质系统

This commit is contained in:
2025-12-03 23:38:08 +08:00
parent bf62257884
commit 3c0e177905
47 changed files with 755 additions and 1151 deletions
+27 -16
View File
@@ -138,7 +138,7 @@ davinci::VertexElementType _getElementTypeFromGltf(const std::string& gltfElemen
if (gltfElementType == "POSITION")
{
return davinci::VET_POSITION;
return davinci::VET_POSITION_MODEL;
}
else if(gltfElementType == "NORMAL")
{
@@ -296,7 +296,7 @@ davinci::DeviceBufferAccessorPtr _createSupportedPrimitiveAttributeBufferAccesso
switch (vetType)
{
case davinci::VET_POSITION:
case davinci::VET_POSITION_MODEL:
case davinci::VET_NORMAL:
case davinci::VET_BINORMAL:
if (componentType == davinci::ComponentType::CT_Float32 && dataType == davinci::DataType::DT_Vec3)
@@ -558,6 +558,15 @@ bool _loadMesh(tinygltf::Model& gltfModel, davinci::Device& device, davinci::Sce
}
primitive->material = materialPtr;
}
else
{
davinci::MaterialPtr materialPtr = create_standard_material(&device, "classic:phong");
materialPtr->setParam("u_materialColor", davinci::fVector4::WHITE);
materialPtr->setParam("u_specularShininess", 32.f);
materialPtr->setupMaterial();
primitive->material = materialPtr;
}
}
}
return true;
@@ -665,45 +674,47 @@ bool _loadMaterial(tinygltf::Model& gltfModel, davinci::Device& device, davinci:
tinygltf::Material& gltfMaterial = gltfModel.materials[i];
//create new material
davinci::MaterialPtr materialPtr = create_standard_material(&device, "debug:geometry_normal");
davinci::MaterialPtr materialPtr = create_standard_material(&device, "pbr:gltf");
//apply matellic roughness info
const tinygltf::PbrMetallicRoughness& gltfPBRMetllicRoughness = gltfMaterial.pbrMetallicRoughness;
//base color texture
const tinygltf::TextureInfo& gltfBaseColorTextureInfo = gltfPBRMetllicRoughness.baseColorTexture;
materialPtr->setBaseColorTexture(
davinci::TextureInfo baseColorTextureInfo = davinci::TextureInfo{
_getTexturePtr(gltfModel, device, gltfBaseColorTextureInfo.index),
gltfBaseColorTextureInfo.texCoord,
_getTextureTransform(gltfBaseColorTextureInfo.extensions),
_getVector4FromDoubleArray(gltfPBRMetllicRoughness.baseColorFactor)
);
_getTextureTransform(gltfBaseColorTextureInfo.extensions)
};
materialPtr->setParam("u_baseColorTextureInfo", baseColorTextureInfo);
//matallic & roughness texture
const tinygltf::TextureInfo& gltfMetalicRoughnessTextureInfo = gltfPBRMetllicRoughness.metallicRoughnessTexture;
materialPtr->setMetallicRoughnessTexture(
davinci::TextureInfo metalicRoughnessTextureInfo = davinci::TextureInfo{
_getTexturePtr(gltfModel, device, gltfMetalicRoughnessTextureInfo.index),
gltfMetalicRoughnessTextureInfo.texCoord,
_getTextureTransform(gltfMetalicRoughnessTextureInfo.extensions),
gltfPBRMetllicRoughness.metallicFactor,
gltfPBRMetllicRoughness.roughnessFactor
);
};
materialPtr->setParam("u_metalicRoughnessTextureInfo", baseColorTextureInfo);
materialPtr->setParam("u_metalicFactor", static_cast<float32_t>(gltfPBRMetllicRoughness.metallicFactor));
materialPtr->setParam("u_roughnessFactor", static_cast<float32_t>(gltfPBRMetllicRoughness.roughnessFactor));
//normal texture
const tinygltf::NormalTextureInfo& gltfNormalTextureInfo = gltfMaterial.normalTexture;
materialPtr->setNormalTexture(
davinci::TextureInfo normalTextureInfo = davinci::TextureInfo{
_getTexturePtr(gltfModel, device, gltfNormalTextureInfo.index),
gltfNormalTextureInfo.texCoord,
_getTextureTransform(gltfNormalTextureInfo.extensions),
gltfMaterial.normalTexture.scale
);
};
materialPtr->setParam("u_normalTextureInfo", normalTextureInfo);
materialPtr->setParam("u_normalTextureScale", static_cast<float32_t>(gltfMaterial.normalTexture.scale));
//load shader
if (!(materialPtr->loadShader()))
if (!(materialPtr->setupMaterial()))
{
return false;
}
gltfMaterial.extensions.insert(std::make_pair("DAVINCI_ID", tinygltf::Value((int32_t)materialPtr->getID())));
}
return true;
@@ -4,34 +4,168 @@
DV_UTILS_BEGIN_NAMESPACE
class PbrGltfMaterial : public davinci::Material
{
public:
PbrGltfMaterial(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard+worldpos+normal+uv0");
setFragementShader("dv_standard_shaders.dll", "pbr:gltf");
registerParam<davinci::TextureInfo>("u_baseColorTextureInfo", {});
registerParam<davinci::TextureInfo>("u_metalicRoughnessTextureInfo", {});
registerParam<float32_t>("u_metalicFactor", 1.f);
registerParam<float32_t>("u_roughnessFactor", 1.f);
registerParam<davinci::TextureInfo>("u_normalTextureInfo", {});
registerParam<float32_t>("u_normalTextureScale", 1.f);
}
};
class PhongMaterial : public davinci::Material
{
public:
PhongMaterial(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard+worldpos+normal-uv0");
setFragementShader("dv_standard_shaders.dll", "classic:phong");
registerParam<davinci::fVector4>("u_materialColor", davinci::fVector4::GREEN);
registerParam<float32_t>("u_specularShininess", 64.f);
registerParam<float32_t>("u_specularStrength", 5.f);
}
virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override
{
return true;
}
};
class SolidColorMaterial : public davinci::Material
{
public:
SolidColorMaterial(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard-worldpos-normal-uv0");
setFragementShader("dv_standard_shaders.dll", "debug:solid_color");
registerParam<davinci::fVector4>("u_solidColor", davinci::fVector4::WHITE);
}
virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override
{
return true;
}
};
class BaseColorTextureMaterial : public davinci::Material
{
public:
BaseColorTextureMaterial(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard+worldpos-normal+uv0");
setFragementShader("dv_standard_shaders.dll", "debug:show_texture");
registerParam<davinci::TextureInfo>("u_textureInfo", {});
}
virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override
{
davinci::TextureInfo baseColorTextureInfo;
if (!(orginalMaterial->getParam("u_baseColorTextureInfo", baseColorTextureInfo)))
{
return false;
}
this->setParam("u_textureInfo", baseColorTextureInfo);
return true;
}
};
class NormalTextureMaterial : public davinci::Material
{
public:
NormalTextureMaterial(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard+worldpos-normal+uv0");
setFragementShader("dv_standard_shaders.dll", "debug:show_texture");
registerParam<davinci::TextureInfo>("u_textureInfo", {});
}
virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override
{
davinci::TextureInfo normalTextureInfo;
if (!(orginalMaterial->getParam("u_normalTextureInfo", normalTextureInfo)))
{
return false;
}
this->setParam("u_textureInfo", normalTextureInfo);
return true;
}
};
class TextureCoordinates0Material : public davinci::Material
{
public:
TextureCoordinates0Material(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard+worldpos-normal+uv0");
setFragementShader("dv_standard_shaders.dll", "debug:texture_coordinates");
registerParam<int32_t>("u_texCoord", 0);
}
virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override
{
return true;
}
};
class GeometryNormalMaterial : public davinci::Material
{
public:
GeometryNormalMaterial(int32_t id, const char* name) : davinci::Material(id, name)
{
setVertexShader("dv_standard_shaders.dll", "standard+worldpos+normal-uv0");
setFragementShader("dv_standard_shaders.dll", "debug:geometry_normal");
}
virtual bool pickupParam(const davinci::MaterialConstPtr orginalMaterial) override
{
return true;
}
};
davinci::MaterialPtr create_standard_material(davinci::Device* device, const char* name)
{
if (strcmp(name, "debug:base_color")==0)
if(strcmp(name, "pbr:gltf")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset();
materialPtr->setVertexShader("dv_standard_shaders.dll", "standard-normal+uv");
materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:base_color");
davinci::MaterialPtr materialPtr = device->newMaterialAsset<PbrGltfMaterial>(name);
return materialPtr;
}
else if(strcmp(name, "classic:phong")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset<PhongMaterial>(name);
return materialPtr;
}
else if(strcmp(name, "debug:solid_color")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset<SolidColorMaterial>(name);
return materialPtr;
}
else if (strcmp(name, "debug:base_color_texture")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset<BaseColorTextureMaterial>(name);
return materialPtr;
}
else if (strcmp(name, "debug:normal_texture")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset();
materialPtr->setVertexShader("dv_standard_shaders.dll", "standard-normal+uv");
materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:normal_texture");
davinci::MaterialPtr materialPtr = device->newMaterialAsset<NormalTextureMaterial>(name);
return materialPtr;
}
else if (strcmp(name, "debug:texture_coordinates")==0)
else if (strcmp(name, "debug:texture_coordinates_0")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset();
materialPtr->setVertexShader("dv_standard_shaders.dll", "standard-normal+uv");
materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:texture_coordinates");
davinci::MaterialPtr materialPtr = device->newMaterialAsset<TextureCoordinates0Material>(name);
return materialPtr;
}
else if (strcmp(name, "debug:geometry_normal")==0)
{
davinci::MaterialPtr materialPtr = device->newMaterialAsset();
materialPtr->setVertexShader("dv_standard_shaders.dll", "standard+normal-uv");
materialPtr->setFragementShader("dv_standard_shaders.dll", "debug:geometry_normal");
davinci::MaterialPtr materialPtr = device->newMaterialAsset<GeometryNormalMaterial>(name);
return materialPtr;
}
return nullptr;