Проблемы картирования текстур с Assimp и OpenGL: некоторые сетки имеют неверное ультрафиоматическое отображениеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблемы картирования текстур с Assimp и OpenGL: некоторые сетки имеют неверное ультрафиоматическое отображение

Сообщение Anonymous »

Я пытаюсь загрузить и отображать 3D -модели, используя C ++, современный OpenGL (GLFW 3.4.0, Glad, GLM) и новейший Assimp. Мой модели загружатель в основном работает, но я сталкиваюсь с проблемой, в которой некоторые сетки неправильно текстурируются. Текстура навеса нанесена неправильной. Вместо использования правильного УФ -отображения, кажется, что вся текстура для модели применяется неправильно. Я отключил смешивание прямо сейчас, но проблема сохраняется при смешивании или без него. Кроме того, я сейчас загружаю диффузные текстуры.#include "model.h"

Model::Model(const std::string& file_path)
{
load_model(file_path);
}

void Model::load_model(const std::string& file_path)
{
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(file_path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs);

if (!scene || (scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE) || !scene->mRootNode) {
std::cerr mMeshes[node->mMeshes];

meshes.push_back(process_mesh(mesh, scene));
}
for (unsigned int i = 0; i < node->mNumChildren; i++) {
process_node(node->mChildren, scene);
}
}

Mesh Model::process_mesh(aiMesh* mesh, const aiScene* scene)
{
std::vector vertices;
std::vector indices;
std::vector textures;

for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
Vertex vertex;
vertex.position = glm::vec3(mesh->mVertices.x, mesh->mVertices.y, mesh->mVertices.z);

if (mesh->HasNormals()) {
vertex.normal = glm::vec3(mesh->mNormals.x, mesh->mNormals.y, mesh->mNormals.z);
}

if (mesh->mTextureCoords[0]) {
vertex.tex_coords = glm::vec2(mesh->mTextureCoords[0].x, mesh->mTextureCoords[0].y);
} else {
vertex.tex_coords = glm::vec2(0.0f, 0.0f);
}

vertices.push_back(vertex);
}

for (unsigned int i = 0; i < mesh->mNumFaces; i++) {
aiFace face = mesh->mFaces[i];
for (unsigned int j = 0; j < face.mNumIndices; j++) {
indices.push_back(face.mIndices[j]);
}
}

aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
std::vector diffuse_maps = load_material_textures(material, aiTextureType_DIFFUSE, "diffuse");
textures.insert(textures.end(), diffuse_maps.begin(), diffuse_maps.end());

return Mesh(vertices, indices, textures);
}

std::vector Model::load_material_textures(aiMaterial* material, aiTextureType type, const std::string& type_name)
{
std::vector textures;

for (unsigned int i = 0; i < material->GetTextureCount(type); i++) {

aiString str;
material->GetTexture(type, i, &str);

bool skip = false;
for (const auto& loaded_texture : textures_loaded) {
if (std::strcmp(loaded_texture.path.data(), str.C_Str()) == 0) {
textures.push_back(loaded_texture);
skip = true;
break;
}
}
if (!skip) {
Texture texture;
texture.id = load_texture_from_file(str.C_Str(), directory);
texture.type = type_name;
texture.path = str.C_Str();
textures.push_back(texture);
textures_loaded.push_back(texture);
}
}
return textures;
}

void Model::render(Shader& shader, Camera& camera) {
for (auto& mesh : meshes) {
mesh.render(shader, camera);
}
}

GLuint load_texture_from_file(const char* file_path, const std::string& directory)
{
std::string file_name = directory + "/" + file_path;
GLuint texture_id;
glGenTextures(1, &texture_id);

int width, height, number_of_color_channels;
unsigned char* data = stbi_load(file_name.c_str(), &width, &height, &number_of_color_channels, 0);
if (data) {
GLenum format = (number_of_color_channels == 1) ? GL_RED : (number_of_color_channels == 3) ? GL_RGB : GL_RGBA;
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
stbi_image_free(data);
} else {
std::cerr
фрагментный шейдер: < /p>
#version 330 core

out vec4 FragColor;

in vec3 crntPos;
in vec3 Normal;
in vec2 texCoord;

uniform sampler2D diffuse0;

uniform vec4 lightColor;
uniform vec3 camPos;

void main()
{
float ambient = 0.20f;
vec3 lightDirection = vec3(0.0f, 1.0f, 0.0f);

vec3 normal = normalize(Normal);

float diffuse = max(dot(normal, lightDirection), 0.0f);

FragColor = texture(diffuse0, texCoord) * lightColor * (diffuse + ambient);
}
< /code>
Я попытался изменить флаги с Assimp, как aiprocess_flipuvs или aiprocess_genuvcoords, но ничего не сработало. Я также попробовал GL_CLAMP_TO_EDGE вместо GL_REPEAT. Я думаю, что правильные файлы текстуры загружаются.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ect-uv-map
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»