2014-07-23 4 views
-5
GLuint createTexture(const char* filename, int width = 128, int height = 128) 
{ 
    GLuint texture; 
    char bitmap[width][height][3]; 
    FILE* fp = fopen(filename, "rb"); 
    assert(fp); 
    assert(fread(bitmap, 3*sizeof(char), width*height, fp) == width*height); 
    fclose(fp); 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmap); 
    glBindTexture(GL_TEXTURE_2D,0); 

    return texture; 
} 

안녕하세요. 위 코드가 어떻게 작동하는지 알고 싶습니다. 이것은 OpenGL에서 솔리드 오브젝트를 텍스처링하는 데 사용할 수있는 코딩 일 것입니다 (예 : glutSolidSphere). 누군가 위의 코딩이 어떻게 작동하는지 설명해 주시겠습니까?C++을 사용한 OpenGL 텍스처링

+0

다음은 답변을 얻었으므로 초보자 용 자습서를 읽어보십시오. 명령에 대한 자세한 내용은이 문서와 같은 openGL 라이브러리 참조를 찾으십시오. http://www.opengl.org/sdk/docs/man/ – Protheus

답변

2
GLuint createTexture(const char* filename, int width=128, int height=128) 
{ 
    GLuint texture; 

사용 C99 폭 * 높이 * 3 바이트를 할당하는 가변 배열 스택의 메모리. 스택이 충분하지 않으면 프로그램이 스택 오버플로와 충돌합니다.

char bitmap[width][height][3]; 

텍스처를 가져 오려면 파일을 열어보십시오. 파일은 헤더없는 원시, 원시 채널 8 비트 RGB 데이터 배열이어야합니다.

FILE* fp=fopen(filename, "rb"); 

파일을 열지 못하면 프로그램을 종료하십시오. 기술적으로이 목적을 위해 assert를 사용하는 것은 프로그래밍 오류입니다. 왜냐하면 a) assert는 릴리즈 빌드에서 아무 것도하지 않기 때문에 b) 오류로부터 쉽게 복구 할 수 있기 때문입니다. 파일을 열 수 없으면 함수는 단지 0을 리턴해야합니다.

assert(fp); 

3 바이트의 읽기 * 너비 * 높이 청크. sizeof(char)은 C의 표준이 sizeof(char) == 1을 정의하기 때문에 이것에 대한 단서가 없다는 것을 나타냅니다. 따라서 곱셈을 할 필요가 없습니다.

예상되는 데이터 양을 읽을 수 없으면 디버그 모드에있는 경우 프로그램이 중단됩니다. 오류 및 릴리스 빌드의 경우 이상한 일을하십시오.

assert(fread(bitmap, 3*sizeof(char), width*height, fp) == width*height); 

파일을 닫습니다.

fclose(fp); 

OpenGL 텍스처 개체 핸들을 할당하십시오.

glGenTextures(1, &texture); 

텍스쳐에 영향을 미치는 후속 OpenGL 작업이 지정된 객체에서 작동하도록 텍스처 핸들을 바인딩합니다.

glBindTexture(GL_TEXTURE_2D, texture); 

텍스처 확대 및 축소 필터를 설정합니다. 선형을 사용하면 밉맵 레벨이 필요하지 않습니다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

데이터를 OpenGL 텍스처로 복사하십시오. 이것은 새로 할당 된 텍스쳐 객체 핸들을 사용하기 때문에 텍스쳐 또한 이것에 의해 초기화됩니다.

여기에 중요한 단계가 많이 있습니다. 즉, glPixelStorei은 배열에서 데이터를 읽으려는 OpenGL을 준비하는 데 사용해야합니다. 라인 정렬, 스트라이드 등등.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE,bitmap); 

텍스처 개체 바인딩 해제.

glBindTexture(GL_TEXTURE_2D,0); 

텍스처 개체 핸들을 반환합니다.

return texture; 
} 

이 코드의 주요 문제 : 디버그 빌드에서 OpenGL 오류 검사 및 프로그램 충돌이 발생하지 않습니다. 릴리스 빌드에서는 파일 조작 오류가 감지되어 처리되지 않습니다.

이 코드를 사용하지 마세요.