2012-01-24 1 views
0

OpenGL에서 3D 모델을로드하려고했습니다. 나는 2000 개의 꼭짓점을 가진 작은 모델을로드하는 데 성공했습니다. 이제는 동일한 로더를 사용하여 350000 개의 꼭지점이있는 모델을로드하려고 시도하지만 단순히 나타나지 않습니다. 은 내가 http://www.morrowland.com/apron/tut_gl.php 에서 로더를 사용하고이 내가 3DS 형식을 사용하고OpenGL에서 3D 모델로드

내가 3DS 모델

void C3dsLoader::Render_3ds() 
{ 

for(int i = 0; i < m3DModel.numOfObjects; i++) 
{ 

    if(m3DModel.pObject.size() <= 0) break;      

    t3DObject *pObject = &m3DModel.pObject[i];     

    if(pObject->bHasTexture)          
    {         
     glEnable(GL_TEXTURE_2D);         

     glColor3ub(255, 255, 255);        

     glBindTexture(GL_TEXTURE_2D, TextureArray3ds[pObject->materialID]); 
    } 
    else 
    { 
     glDisable(GL_TEXTURE_2D);        

     glColor3ub(255, 255, 255);        
    } 

    glBegin(GL_TRIANGLES);          

    for(int j = 0; j < pObject->numOfFaces; j++) 
    { 

     for(int whichVertex = 0; whichVertex < 3; whichVertex++) 
     { 
      int index = pObject->pFaces[j].vertIndex[whichVertex]; 

      glNormal3f(pObject->pNormals[ index ].x, pObject->pNormals[ index ].y, pObject->pNormals[ index ].z); 

      if(pObject->bHasTexture) { 

       if(pObject->pTexVerts) { 
        glTexCoord2f(pObject->pTexVerts[ index ].x, pObject->pTexVerts[ index ].y); 
       } 
      } else { 

       if(m3DModel.pMaterials.size() < pObject->materialID) 
       { 
        BYTE *pColor = m3DModel.pMaterials[pObject->materialID].color; 

        glColor3ub(pColor[0], pColor[1], pColor[2]); 
       } 
      } 

      glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z); 
     } 
    } 

    glEnd(); 
} 

}를 렌더링하는 기능입니다. 왜 이렇게됩니까?

+0

사용 된 자습서의 코드가 16 비트 숫자 somwhere를 사용하고 있는데, 오버플로하여 많은 수의 프리미티브로 손상 될 수 있습니다. – datenwolf

+0

오, 내가 참조하십시오, 내가 큰 모델을로드 할 수있는 로더를 가질 수있는 링크를 제공 할 수있는 인터넷에있는 모든 로더가 작은 3D 모델과 비슷하고 아무 것도 작동하지 않는 것 같습니다. –

+0

나는 그렇지 않습니다. 3DS 로더를 가지고 있습니다. 솔직히 말해서, 제 프로젝트에서이 형식을 사용하지 않기 때문입니다. 필자는 독립형 프로그램 프로젝트에서 WebGL 용 JSON과 OpenCTM 또는 독점 형식을 사용하는 경향이 있습니다. – datenwolf

답변

-1

당신은 (여러 같이

어쨌든 이전 스타일로 glVertex 루프를 사용하여, 특히 각 정점의 색상이 아주 - 아주 느린 될 것입니다 변경하는 350K 삼각형 모델을 표시 카드에 메모리가 부족 될 수 있습니다 프레임 당 초)

당신이 훨씬 더 많은 것을하기 전에 버텍스 버퍼 객체에 대해 배우게됩니다.

+0

안녕하세요, 빠른 답장을 보내 주셔서 감사합니다. 내가 사용하는 형식은 3ds이므로 정말 glvertex를 사용하여 렌더링하는 방법을 알지 못합니다. 어떤 점이나 링크도 알게 될 것입니다. –

+3

@ 그가 Immediate Mode (glVertex 호출)를 사용하는 경우 GPU에서 메모리가 부족할 수는 없습니다. 연속 블록 형태로 업로드 된 것은 없기 때문입니다. 또한 350k 삼각형은 다소 길다. 마지막으로 OpenGL의 메모리 부족은 시스템 메모리 부족 (GPU RAM + CPU RAM + 스왑)을 의미합니다. – datenwolf

+0

@datenwolf - 카드에로드중인 텍스처가 캐시되지 않거나 각 업데이트에 복사됩니까? –