【问题标题】:Wrong UV mapping applied on object OpenGl在对象 OpenGL 上应用了错误的 UV 映射
【发布时间】:2017-08-28 13:23:03
【问题描述】:

我只想通过 Assimp 加载一个对象 (有效) - 顶点、UV 和法线。然后我通过 SOIL 库加载纹理 - 通过许多教程,效果也很好,但是当纹理应用于对象时,UV 无法正常工作(如图所示)。我在这里粘贴了一些代码,在许多正确适用于它们的教程中,但不适用于我。现在我陷入了陷阱。

GLuint Texture::load(const char *name) {

GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

int width, height;
unsigned char* image = SOIL_load_image(name, &width, &height, 0, SOIL_LOAD_RGB);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glGenerateMipmap(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);

SOIL_free_image_data(image);

return textureID;}

在主文件中,在主循环之前:

std::vector<unsigned short> indices;
std::vector<glm::vec3> vertices;
std::vector<glm::vec2> uvs;
std::vector<glm::vec3> normals;
bool res = loader->loadAssImp("Models/cube/test.obj", indices, vertices, uvs, normals);

glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);

glGenBuffers(1, &uvbuffer);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);

在主循环中:

glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, Texture);
    glUniform1i(TextureID, 0);

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    // 2nd attribute buffer : UVs
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

    glDrawArrays(GL_TRIANGLES, 0, vertices.size());

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

我也遵循了本教程,但对我没有任何帮助: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/

非常感谢您的回复。

【问题讨论】:

  • 尝试旋转/镜像图像。可能是坐标系的问题。
  • 也许不是问题,因为您的位置没问题,但是您正在加载索引模型,然后忽略索引。如果这是核心配置文件代码,那么您缺少 VAO。
  • 而且您在上传纹理之前生成mipmap。在这里也没有关系,因为 GL_LINEAR 插值不使用 mipmap,但通常是个坏主意。
  • 我也旋转了图像,但无法正常工作。 @BDL所以你建议我不需要加载索引?它只是填充了向量数组(我认为它对其他代码有任何影响)。而我正在使用的 VAO,如果你的意思是命令 glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID);
  • 我要尝试的第一件事是翻转 Y 上的位图(将其倒置)。

标签: c++ opengl assimp soil


【解决方案1】:

我通过将 aiProcess_flipUVs 参数添加到 Assimp 设置中解决了这个问题。代码如下:

unsigned int importOptions = aiProcess_Triangulate
    | aiProcess_OptimizeMeshes              
    | aiProcess_JoinIdenticalVertices       
    | aiProcess_Triangulate                
    | aiProcess_CalcTangentSpace           
    | aiProcess_FlipUVs;

const aiScene* scene = importer.ReadFile(path, importOptions);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2013-12-07
    • 2023-03-26
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多