2017-01-13 15 views
0

나는 이것에 대한 코드는 (내 이해) Assimp와 모델 로딩이 간다까지로 매우 간단합니다 내가 C에서 OpenGL을에 시험 로딩 모델에 사용하는 프로그램이 있습니다문제는 OpenGL을

const struct aiScene* scene = aiImportFile(objfile, aiProcessPreset_TargetRealtime_Fast); 
unsigned int vbo, ibo, tex; 

if(scene == NULL) 
{ 
    fprintf(stderr, "Could not load file '%s'\n", objfile); 
    return 1; 
} 
int count = 0, size = 0; 
int i, j, k; 

for(i = 0; i < scene->mNumMeshes; i ++) 
    size += (3 * scene->mMeshes[i]->mNumFaces); 

Vertex* vertices = (Vertex*)malloc(size * sizeof(Vertex)); 
int* indices = (int*)malloc(size * sizeof(int)); 

for(i = 0; i < scene->mNumMeshes; i ++) 
{ 
    struct aiMesh* mesh = scene->mMeshes[i]; 
    int meshFaces = mesh->mNumFaces; 

    for(j = 0; j < meshFaces; j ++) 
    { 
     struct aiFace* face = &(mesh->mFaces[j]); 
     for(k = 0; k < face->mNumIndices; k ++) 
     { 
      int index = face->mIndices[k]; 

      struct aiVector3D pos = mesh->mVertices[index]; 
      struct aiVector3D uv = mesh->mTextureCoords[0][index]; 
      struct aiVector3D normal = {.x=1.0f,.y=1.0f,.z=1.0f}; 

      if(mesh->mNormals != NULL) 
       normal = mesh->mNormals[index]; 

      Vertex _vertex = {.x=pos.x * scale, 
           .y=pos.y * scale, 
           .z=pos.z * scale, 
           .u=uv.x, .v=uv.y, 
           .nx=normal.x * scale, 
           .ny=normal.y * scale, 
           .nz=normal.z * scale}; 

      vertices[count] = _vertex; 
      indices[count] = count; 
      count ++; 
     } 
    } 
} 
aiReleaseImport(scene); 

tex = loadTexture(texfile); 
if(tex == 0) 
{ 
    fprintf(stderr, "Could not load file '%s'\n", texfile); 
    return 1; 
} 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, size * sizeof(Vertex), vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glGenBuffers(1, &ibo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size * sizeof(int), indices, GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

loadTexture 함수는 내가 사용한 다른 모든 텍스처에도 잘 작동하므로 문제는 아닌지 의심 스럽습니다. 그리고 더 기본적인 모델 중 일부는 전혀 문제가 없습니다. 질감이 같은 방식으로 떨어져 던져 좌표 Quad Shotgun rendered in Blender

: :이처럼 더 복잡한 모델을로드 할 때뿐만 아니라 Quad Shotgun rendered first person

, 그것은 .mtl을로드하지에 문제가 아니에요 보장 파일은 .obj과 적절히 연관되어 있습니다. .mtl에서 텍스처 파일을 정의한 부분을 제외하고 모든 것을 없앴습니다. 그래야 블렌더에로드 할 수 있습니다. 같은 결과. 나는 Assimp on에 대한 연구를 해왔고, 렌더링 루프에 문제가 없다고 확신한다. 제발 도와주세요, 내가 여기에서 무엇을 놓쳤는 지, 아니면 내 프로그램에 잘못 될 수 있다는 것을 전혀 모릅니다!

답변

0

모든 코드가 모델을로드하는 데 올바르지 만 데이터가 올바르지 만, aiImportScene에 모델을로드하기 위해 사용한 플래그가 미리 플립 할 플래그가 포함되어 있지 않은 것을 잊어 버렸습니다. 자외선. 대신이의 즉, :

const struct aiScene* scene = aiImportFile(objfile, aiProcessPreset_TargetRealtime_Fast); 

모델을 가져,이를 사용하고 있어야합니다

const struct aiScene* scene = aiImportFile(objfile, aiProcessPreset_TargetRealtime_Fast | aiProcess_FlipUVs); 

키 차이가 나는 플래그의 끝에 | aiProcess_FlipUVs을 추가 한 것. 이것은 블렌더에서 내 보낸 모델이나 인터넷에서 발견 한 모델 중 많은 텍스처링 문제를 해결해 주었고 이전에는 문제가 없었던 모델에 해를 끼치 지 않는 것 같습니다. 유사한 문제가있는 다른 사람들이 있다면이 대답이 도움이되기를 바랍니다!