重构材质系统
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user