2010-08-05 10 views
3

내 프로젝트에 큰 문제가 있습니다 :OpenGL 텍스처 매핑 오류

NeHe 웹 사이트의 튜토리얼을 좋아하고 Windows XP에서 프로그램을 완벽하게 실행했습니다. 그러나 컴퓨터를 다시 포맷하고 OS를 Windows Vista로 변경하고 Dev-C++ 컴파일러를 다시 설치 한 다음 텍스처를 사용하는 C++ 프로그램을 열려고 시도했을 때 프로그램이 다운되었습니다.

내 glaux.h가 누락되었음을 알게되었습니다. 인터넷에서 파일을 발견하고 프로젝트를 재 컴파일했지만 여전히 충돌했습니다. 텍스처 함수를 제외하면 모든 것이 잘되었습니다.

어디서 문제가 발생하며 해결하려면 어떻게해야합니까?

저는 이들 중 하나가 범인이라고 생각했습니다 : Windows Vista OS, 그래픽 카드, glaux.h 및 라이브러리 (나는 괴롭힘을 알고 있습니다), OpenGL 자체.

.

업데이트 : 문제의 원인을 파악했습니다.

이 코드 덩어리가 충돌 내 프로그램을 발생 : 어떤 이유

if (TextureImage[0]) { 
    if (TextureImage[0]->data) {  
    free(TextureImage[0]->data); 
    } 
    free(TextureImage[0]); 
} 

, 내 프로그램은 항상 내가 사용 가능한 메모리에 주문할 때마다 충돌합니다. 이 섹션을 주석 처리했을 때, 내 프로그램은 모든 색이 어둡게 된 것을 제외하고는 잘 동작합니다 (내 비트 맵 파일의 색 때문이라고 생각합니다). 어떤 팁?

.

대답에 : 마티아스 Valdenegro

음,이 Windows XP를 사용할 때 잘 작동 NeHe의 lesson6에서 파생되었다. Windows Vista로 전환했을 때는 전혀 변경되지 않았습니다.

#define NoOfTextures 3 
GLuint texture[NoOfTextures]; 

int LoadGLTextures() 
{ 
    int Status=FALSE; 

    AUX_RGBImageRec *TextureImage[NoOfTextures]; 

    memset(TextureImage,0,sizeof(void *)*1); 

    if (TextureImage[0]=LoadBMP("Data/Bitmaps/texture.bmp")) 
    { 
     Status=TRUE; 

     glGenTextures(1, &texture[0]); 

     glBindTexture(GL_TEXTURE_2D, texture[0]); 
     glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

     if (TextureImage[0] != NULL) { 
      if (TextureImage[0]->data != NULL) {  
       free(TextureImage[0]->data); 
      } 
      free(TextureImage[0]); 
     } 
    } 

    return Status;          
} 

:

당신은 그냥 알다시피, 여기에 전체 기능입니다.

추가 정보 :

나는 종종 내 프로젝트를 재건하고 LoadBMP() 같은 헤더 파일의 일부입니다. 다음은 LoadBMP() 함수입니다.

AUX_RGBImageRec *LoadBMP(char *Filename) 
{ 
    FILE *File=NULL; 

    if (!Filename) 
    { 
     return NULL; 
    } 

    File=fopen(Filename,"r"); 

    if (File) 
    { 
     fclose(File); 
     return auxDIBImageLoad(Filename); 
    } 

    return NULL; 
} 

이것은 꽤 명확합니다.

+0

어디에서 충돌이 발생합니까? 디버거를 사용하여 찾아냅니다. –

+0

__ * 그래픽 드라이버를 최신 버전 * __으로 업데이트하고 프로그램이 충돌하는 코드 줄을 게시하십시오. – SigTerm

+0

LoadBMP 기능을 게시 할 수 있습니까? 그것이 메모리를 올바르게 할당하고 있는지 확인하십시오. –

답변

0

명탐정 코난 : 내가 잘 보이지 않았다 그것에 그린 색상을 깨달았을 때 나는 내 비트 맵 (NeHe의 lesson7의 Crate.bmp)을 편집했다

. 새로운 24 비트 비트 맵을 만들고 색상을 표시 한 후에 흰색 배경이 주황색으로 변했지만 이것은 이전의 glColor3f() 호출 때문이었습니다. glColor3f (1.0f, 1.0f, 1.0f) 호출을 추가하고 free() 함수를 사용하여 코드 섹션을 주석 처리하고 모든 것이 부풀려졌습니다.

+0

또한 색상 보정을 위해 프로그램의 끝에 '빈'텍스처 (흰색 비트 맵)를로드해야했습니다. – EoS

0

파일 권한과 관련이 있다고 생각합니다. 프로젝트의 파일 권한을 낮은 수준 (특히 텍스처)으로 설정해보십시오. 이전에 XP에서 Vista 또는 Win7로 전환 할 때 런타임에 자산을로드하는 다른 프로젝트에서도 이와 같은 일이 발생했습니다. 이 무료 통화에 충돌하는 것으로

1

, 당신은 자유롭게 포인터를 두 번하지 않는 그건

  • 을 확인합니다.
  • 유효한 포인터가있는 곳. 이것은 malloc을 사용하여 할당 된 자유 포인터를 의미하며 new로 얻은 포인터를 해제 할 수 없습니다. 또한 할당 함수에서 얻은 원래 포인터 값을 포인터 + 1 또는 일부 산술 값으로 사용하지 말고 해제해야합니다.
0

다시 컴파일하지 않고 새로 컴파일 된 코드에서 해제 된 라이브러리에 메모리가 할당되고 있습니까 (malloc 포함)? 서로 다른 컴파일러/OS 조합은 힙을 다르게 사용하므로 서로 다른 환경에서 컴파일 된 두 라이브러리 간의 malloc/free가 충돌 (또는 다른 UB)을 유발할 수 있습니다.

특히, 다시 설치 한 후에 LoadBMP() 구현을 컴파일하고 있습니까?