2017-08-28 41 views
0

我只是想通过Assimp (工程)加载一个对象 - 顶点,uvs和法线。然后我通过SOIL库加载一个纹理 - 通过很多教程,工作也很好,但是当纹理应用到对象时,UVs不能正常工作(如图所示)。我在这里粘贴一些代码,在许多教程中,它们都能正确工作,但不适合我。现在我陷入陷阱。错误的紫外线贴图应用于对象OpenGl

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); 

Result image of object

我也跟着这个教程,但没有工作对我来说: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/

非常感谢回复。

+2

尝试旋转/镜像的图像。这可能是一个坐标系问题。 – Banex

+0

也许不是问题,因为你的位置是好的,但你正在加载索引模型,然后忽略指数。如果这是一个核心配置文件代码,那么你错过了一个VAO。 – BDL

+0

在**甚至上传纹理之前,您正在生成mipmap **。这里也没有关系,因为'GL_LINEAR'插值不使用mipmap,但通常是一个坏主意。 – BDL

回答

-1

我通过在Assimp设置中添加aiProcess_flipUVs参数来解决此问题。这里的代码:

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

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