实现彩绘纹理部分替换
parent
acd25b4964
commit
0d42af9200
|
@ -1190,7 +1190,7 @@ void main()
|
||||||
//imageStore(gBaseColor, pixelLocation, vec4(uv,1,1));
|
//imageStore(gBaseColor, pixelLocation, vec4(uv,1,1));
|
||||||
//imageStore(gMetallicRoughness, pixelLocation, vec4(uv,1,1));
|
//imageStore(gMetallicRoughness, pixelLocation, vec4(uv,1,1));
|
||||||
//return;
|
//return;
|
||||||
uv = vec2(1)-uv*2;
|
uv = uv*2-vec2(1);
|
||||||
//vec2 uv = imageLoad(gPaintingTexCoord, pixelLocation).rg;
|
//vec2 uv = imageLoad(gPaintingTexCoord, pixelLocation).rg;
|
||||||
|
|
||||||
vec3 debugBVH = vec3(0);
|
vec3 debugBVH = vec3(0);
|
||||||
|
|
|
@ -2,23 +2,22 @@
|
||||||
#include <QOpenGLFunctions_4_5_Core>
|
#include <QOpenGLFunctions_4_5_Core>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <QVector2D>
|
|
||||||
#include <QVector3D>
|
|
||||||
#include <QOpenGLShaderProgram>
|
#include <QOpenGLShaderProgram>
|
||||||
#include <QOpenGLBuffer>
|
#include <QOpenGLBuffer>
|
||||||
#include <QOpenGLVertexArrayObject>
|
#include <QOpenGLVertexArrayObject>
|
||||||
#include <QOpenGLTexture>
|
#include <QOpenGLTexture>
|
||||||
#include <QOpenGLWidget>
|
#include <QOpenGLWidget>
|
||||||
#include <assimp/vector3.h>
|
#include <assimp/vector3.h>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
#include "Drawable.h"
|
#include "Drawable.h"
|
||||||
|
|
||||||
namespace Renderer
|
namespace Renderer
|
||||||
{
|
{
|
||||||
struct Vertex
|
struct Vertex
|
||||||
{
|
{
|
||||||
QVector3D Position;
|
glm::vec3 Position;
|
||||||
QVector3D Normal;
|
glm::vec3 Normal;
|
||||||
QVector2D TexCoords;
|
glm::vec2 TexCoords;
|
||||||
Vertex(const aiVector3D& position, const aiVector3D& Normal, const aiVector3D& TexCoords);
|
Vertex(const aiVector3D& position, const aiVector3D& Normal, const aiVector3D& TexCoords);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ void Renderer::Model::loadModel(QString path)
|
||||||
directory = modelFile.dir();
|
directory = modelFile.dir();
|
||||||
|
|
||||||
Assimp::Importer importer;
|
Assimp::Importer importer;
|
||||||
const aiScene* scene = importer.ReadFile(modelFile.absoluteFilePath().toUtf8(), aiProcess_Triangulate | aiProcess_FlipUVs);
|
const aiScene* scene = importer.ReadFile(modelFile.absoluteFilePath().toUtf8(), aiProcess_Triangulate /*| aiProcess_FlipUVs*/);
|
||||||
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
|
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
|
||||||
{
|
{
|
||||||
qCritical() << "ERROR::ASSIMP::" << importer.GetErrorString() << endl;
|
qCritical() << "ERROR::ASSIMP::" << importer.GetErrorString() << endl;
|
||||||
|
@ -117,12 +117,8 @@ void Model::processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4)
|
||||||
|
|
||||||
std::unique_ptr<Drawable> Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model)
|
std::unique_ptr<Drawable> Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model)
|
||||||
{
|
{
|
||||||
aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
|
|
||||||
QMatrix4x4 modelQ((float*)&model);
|
QMatrix4x4 modelQ((float*)&model);
|
||||||
|
|
||||||
aiString str;
|
|
||||||
material->GetTexture(aiTextureType_BASE_COLOR, 0, &str);
|
|
||||||
|
|
||||||
std::vector<Vertex> vertices;
|
std::vector<Vertex> vertices;
|
||||||
for (unsigned int i = 0; i < mesh->mNumVertices; i++)
|
for (unsigned int i = 0; i < mesh->mNumVertices; i++)
|
||||||
{
|
{
|
||||||
|
@ -139,45 +135,59 @@ std::unique_ptr<Drawable> Model::processMesh(aiMesh* mesh, const aiScene* scene,
|
||||||
maxZ = std::max(maxZ, worldPos.z);
|
maxZ = std::max(maxZ, worldPos.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<unsigned int> indices;
|
std::vector<unsigned int> indices;
|
||||||
for (auto face = mesh->mFaces; face < mesh->mFaces + mesh->mNumFaces; face++)
|
for (auto face = mesh->mFaces; face < mesh->mFaces + mesh->mNumFaces; face++)
|
||||||
indices.insert(indices.end(), face->mIndices, face->mIndices + face->mNumIndices);
|
indices.insert(indices.end(), face->mIndices, face->mIndices + face->mNumIndices);
|
||||||
|
|
||||||
|
aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
|
||||||
|
|
||||||
if (auto iter = paintingMap.find(std::string(str.C_Str())); paintingProgram != nullptr && iter != paintingMap.end())
|
if (auto iter = paintingMap.find([&] {
|
||||||
|
aiString str;
|
||||||
|
material->GetTexture(aiTextureType_BASE_COLOR, 0, &str);
|
||||||
|
return std::string(str.C_Str());
|
||||||
|
}()); paintingProgram != nullptr && iter != paintingMap.end())
|
||||||
{
|
{
|
||||||
|
qDebug() << iter->first.c_str() << "Replaced";
|
||||||
|
|
||||||
|
auto mesh = std::make_unique<PaintingMesh>(glFunc, paintingProgram, shadowProgram, modelQ);
|
||||||
|
|
||||||
auto& [paintingPath, leftBottom, rightTop] = iter->second;
|
auto& [paintingPath, leftBottom, rightTop] = iter->second;
|
||||||
qDebug() << str.C_Str() << "Replaced";
|
|
||||||
|
|
||||||
auto m_mesh = std::make_unique<PaintingMesh>(glFunc, paintingProgram, shadowProgram, modelQ);
|
for (auto& v : vertices)
|
||||||
m_mesh->vertices = vertices;
|
{
|
||||||
m_mesh->indices = indices;
|
//qDebug() << v.TexCoords.x << v.TexCoords.y;
|
||||||
|
v.TexCoords = (v.TexCoords - leftBottom) / (rightTop - leftBottom);
|
||||||
|
qDebug() << v.TexCoords.x << v.TexCoords.y;
|
||||||
|
}
|
||||||
|
|
||||||
m_mesh->paintingId = loadPainting(paintingPath);
|
mesh->vertices = vertices;
|
||||||
auto& handle = vtManager->getPaintingHandle(m_mesh->paintingId);
|
mesh->indices = indices;
|
||||||
m_mesh->textureBasecolor = handle.baseColor;
|
|
||||||
m_mesh->textureMetallicRoughness = handle.metallicRoughness;
|
mesh->paintingId = loadPainting(paintingPath);
|
||||||
m_mesh->setupMesh();
|
auto& handle = vtManager->getPaintingHandle(mesh->paintingId);
|
||||||
return m_mesh;
|
mesh->textureBasecolor = handle.baseColor;
|
||||||
|
mesh->textureMetallicRoughness = handle.metallicRoughness;
|
||||||
|
mesh->setupMesh();
|
||||||
|
return mesh;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto m_mesh = std::make_unique<Mesh>(glFunc, shaderProgram, shadowProgram, modelQ);
|
auto mesh = std::make_unique<Mesh>(glFunc, shaderProgram, shadowProgram, modelQ);
|
||||||
m_mesh->vertices = vertices;
|
mesh->vertices = vertices;
|
||||||
m_mesh->indices = indices;
|
mesh->indices = indices;
|
||||||
|
|
||||||
// ´¦Àí²ÄÖÊ
|
if (!(mesh->textureBasecolor = loadMaterialTextures(material, aiTextureType_BASE_COLOR)))
|
||||||
if (!(m_mesh->textureBasecolor = loadMaterialTextures(material, aiTextureType_BASE_COLOR)))
|
|
||||||
qWarning() << "Basecolor Texture Loading Failed!";
|
qWarning() << "Basecolor Texture Loading Failed!";
|
||||||
if (!(m_mesh->textureMetallicRoughness = loadMaterialTextures(material, aiTextureType_METALNESS)))
|
if (!(mesh->textureMetallicRoughness = loadMaterialTextures(material, aiTextureType_METALNESS)))
|
||||||
qWarning() << "MetallicRoughness Texture Loading Failed!";
|
qWarning() << "MetallicRoughness Texture Loading Failed!";
|
||||||
if (!(m_mesh->textureNormal = loadMaterialTextures(material, aiTextureType_NORMALS)))
|
if (!(mesh->textureNormal = loadMaterialTextures(material, aiTextureType_NORMALS)))
|
||||||
qWarning() << "Normal Texture Loading Failed!";
|
qWarning() << "Normal Texture Loading Failed!";
|
||||||
|
|
||||||
if (m_mesh->textureBasecolor && m_mesh->textureMetallicRoughness && m_mesh->textureNormal)
|
if (mesh->textureBasecolor && mesh->textureMetallicRoughness && mesh->textureNormal)
|
||||||
{
|
{
|
||||||
m_mesh->setupMesh();
|
mesh->setupMesh();
|
||||||
return m_mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -208,7 +218,7 @@ GLuint Model::loadMaterialTextures(aiMaterial* mat, aiTextureType type)
|
||||||
texture.setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat);
|
texture.setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat);
|
||||||
texture.setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat);
|
texture.setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat);
|
||||||
texture.setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
|
texture.setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
|
||||||
texture.setData(data);
|
texture.setData(data.mirrored());
|
||||||
return texture.textureId();
|
return texture.textureId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,10 @@ namespace Renderer
|
||||||
QOpenGLShaderProgram* shadowProgram = nullptr;
|
QOpenGLShaderProgram* shadowProgram = nullptr;
|
||||||
VirtualTextureManager* vtManager = nullptr;
|
VirtualTextureManager* vtManager = nullptr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key BaseColor路径
|
||||||
|
* @param value json路径, 纹理坐标
|
||||||
|
*/
|
||||||
std::unordered_map<std::string, std::tuple<std::string, glm::vec2, glm::vec2>> paintingMap;
|
std::unordered_map<std::string, std::tuple<std::string, glm::vec2, glm::vec2>> paintingMap;
|
||||||
std::unordered_map<std::string, GLuint> paintingLoaded;
|
std::unordered_map<std::string, GLuint> paintingLoaded;
|
||||||
std::unordered_map<std::string, QOpenGLTexture> texturesLoaded;
|
std::unordered_map<std::string, QOpenGLTexture> texturesLoaded;
|
||||||
|
|
Loading…
Reference in New Issue