Войти
ПрограммированиеФорумГрафика

Помогите загрузить sponza через Assimp

#0
20:53, 22 апр. 2018
+ Показать
ModelLoader::ModelLoader(D3D11::Device const& device, D3D11::Context const& context, std::string filename)
  : m_Directory(filename.substr(0, filename.find_last_of('/'))) {

  Assimp::Importer importer;

  const aiScene* pScene = importer.ReadFile(filename, aiProcess_FlipWindingOrder | aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace | aiProcess_GenNormals | aiProcess_GenSmoothNormals);

  if (pScene == NULL)
    throw std::runtime_error("Dont't load file: "+ filename);


  std::vector<Vertex>   vertices;
  std::vector<uint32_t> indices;

  auto g_CountVertices = 0u;
  auto g_CountIndices  = 0u;

  for (auto index = 0; index < pScene->mNumMeshes; index++) {
    g_CountVertices += pScene->mMeshes[index]->mNumVertices;
    g_CountIndices  += pScene->mMeshes[index]->mNumFaces * 3;
  }

  m_Meshes.reserve(pScene->mNumMeshes);
  m_Materials.reserve(pScene->mNumMaterials);
  vertices.reserve(g_CountVertices);
  indices.reserve(g_CountIndices);


  auto filenameDiffuse  = m_Directory + "/sponza/dummy.dds";
  auto filenameNormal   = m_Directory + "/sponza/dummy_ddn.dds";
  auto filenameSpecular = m_Directory + "/sponza/dummy_specular.dds";

  auto diffuseDefaultSRV  = LoadTexture(device, context, filenameDiffuse);
  auto normalDefaultSRV   = LoadTexture(device, context, filenameNormal);
  auto specularDefaultSRV = LoadTexture(device, context, filenameSpecular);

  for (auto indexMaterial = 0u; indexMaterial < pScene->mNumMaterials; indexMaterial++) {

    aiString strDiffuse;
    aiString strSpecular;
    aiString strNormal;
  
    pScene->mMaterials[indexMaterial]->GetTexture(aiTextureType_DIFFUSE, 0, &strDiffuse);
    pScene->mMaterials[indexMaterial]->GetTexture(aiTextureType_SPECULAR, 0, &strSpecular);
    pScene->mMaterials[indexMaterial]->GetTexture(aiTextureType_NORMALS, 0, &strNormal);
  

    bool flagLoadDiffuse  = false;
    bool flagLoadNormal  = false;
    bool flagLoadSpecular = false;
    
    if (pScene->mMaterials[indexMaterial]->GetTextureCount(aiTextureType_DIFFUSE) > 0) {
      filenameDiffuse = m_Directory + strDiffuse.C_Str();
      flagLoadDiffuse = true;
    }

    if (pScene->mMaterials[indexMaterial]->GetTextureCount(aiTextureType_SPECULAR) > 0) {
      filenameSpecular = m_Directory + strSpecular.C_Str();
      flagLoadSpecular = true;  
    }
    
    if (pScene->mMaterials[indexMaterial]->GetTextureCount(aiTextureType_NORMALS) > 0) {
      filenameNormal = m_Directory  + strNormal.C_Str();
      flagLoadNormal = true;
    }

    
    m_Materials.push_back(Material{
      flagLoadDiffuse  ? LoadTexture(device, context, filenameDiffuse)  : diffuseDefaultSRV ,
      flagLoadSpecular ? LoadTexture(device, context, filenameSpecular) : specularDefaultSRV,
      flagLoadNormal   ? LoadTexture(device, context, filenameNormal)   : normalDefaultSRV});
    
  }

  g_CountVertices = 0u;
  g_CountIndices  = 0u;

  for (auto indexMesh = 0u; indexMesh < pScene->mNumMeshes; indexMesh++) {
  
    auto base = static_cast<uint32_t>(vertices.size());
    for (auto indexElement = 0u; indexElement < pScene->mMeshes[indexMesh]->mNumVertices; indexElement++) {
      Vertex vertex;
      vertex.position = { 
        pScene->mMeshes[indexMesh]->mVertices[indexElement].x,
        pScene->mMeshes[indexMesh]->mVertices[indexElement].y,
        pScene->mMeshes[indexMesh]->mVertices[indexElement].z };
      vertex.normal = {
        pScene->mMeshes[indexMesh]->mNormals[indexElement].x,
        pScene->mMeshes[indexMesh]->mNormals[indexElement].y,
        pScene->mMeshes[indexMesh]->mNormals[indexElement].z };
      vertex.tangent = {
        pScene->mMeshes[indexMesh]->mTangents[indexElement].x,
        pScene->mMeshes[indexMesh]->mTangents[indexElement].y,
        pScene->mMeshes[indexMesh]->mTangents[indexElement].z,
      };
      vertex.texcoord = { pScene->mMeshes[indexMesh]->mTextureCoords[0][indexElement].x, pScene->mMeshes[indexMesh]->mTextureCoords[0][indexElement].y };
      
    
      
      vertices.push_back(vertex);
      g_CountVertices++;
    }
    
    for (auto indexElement = 0u; indexElement < pScene->mMeshes[indexMesh]->mNumFaces; indexElement++) {  
      aiFace face = pScene->mMeshes[indexMesh]->mFaces[indexElement];    
      indices.push_back(face.mIndices[0]);
      indices.push_back(face.mIndices[1]);
      indices.push_back(face.mIndices[2]);
      g_CountIndices += 3;
      
    }

  
    m_Meshes.push_back(Mesh{ m_Materials[pScene->mMeshes[indexMesh]->mMaterialIndex],
                           3 * pScene->mMeshes[indexMesh]->mNumFaces,
                           g_CountIndices - 3 * pScene->mMeshes[indexMesh]->mNumFaces, base});
  }

  m_VertexBuffer = device.CreateVertexBuffer(vertices.data(), vertices.size() * sizeof(Vertex), D3D11_USAGE_IMMUTABLE);
  m_IndexBuffer  = device.CreateIndexBuffer(indices.data(), indices.size() * sizeof(uint32_t),  D3D11_USAGE_IMMUTABLE);
  

}

#1
21:56, 22 апр. 2018

Слышал когда-нибудь фразу "какой вопрос такой и ответ"?

#2
23:21, 22 апр. 2018

Успехов http://assimp.sourceforge.net/lib_html/index.html

#3
5:25, 23 апр. 2018

IBets
Оберни код в тег c++, а картинку убери под спойлер, может появятся желающие помочь.
А то вопрос ни о чём и инфа набросана, как шмотки в комнате неухоженной девахи :)))

#4
6:53, 23 апр. 2018

D3D11_TEXTURE_ADDRESS_WRAP /thread

#5
12:36, 23 апр. 2018

Dampire
+1

#6
14:09, 23 апр. 2018

IBets
ты может с простого начнешь? текстурированный кубик к примеру.

#7
14:22, 23 апр. 2018

Andrey
Изображение

#8
14:34, 23 апр. 2018

lookid
+100500 xD

#9
18:00, 23 апр. 2018

lookid
На самом деле это шютка с двойным дном.
Нормальные люди задают атрибут "цвет" по возрастанию, т.е. первая точка должна быть красной, вторая зеленой, а третья синей.
Более того, дефолтное рисование треугольников идет против часовой стрелки.
Итого, либо Нео неверно задал атрибуты и при добавлении нормалей все съедет к чертям, либо криво расположил вершины и при первой попытке кулинга он увидит черный экран.
Либо он вообще задал цвета не по порядку и у него совсем туго с чувством прекрасного (худший вариант).
Даже первый туториал не осилил, в общем.

#10
19:55, 23 апр. 2018

lookid
Ошибки не было. Это очень странно, я включил анизонтропную фильтрацию текстур и все нормально стало

#11
20:08, 23 апр. 2018

Great V.
Но вот скажи очевидно ли, что изменив фильтрацию текстур рендерится все нормально?

#12
21:12, 23 апр. 2018

IBets
тут проблема того, что ты с этим сталкивался и запомнил. Или просто азпомнил. Как бы да, в графике нужно держать в голове целые куски кода наизусть. Как в программировании физике той же. Просто на SOLID не выедешь.

#13
22:41, 23 апр. 2018

IBets
> Но вот скажи очевидно ли, что изменив фильтрацию текстур рендерится все
> нормально?
1. Не фильтрацию, а тайлинг.
2. Да, очевидно.

#14
22:49, 23 апр. 2018

Great V.
Где ты увидел в maxAnisotropy тайлинг? И если это так очевидно почему ты не увидел это по картинке?

ПрограммированиеФорумГрафика

Тема в архиве.