2009-05-04 1 views
1

이봐, 나는 SDL_Surface을로드하고 OpenGL을 텍스처로 저장이 스크립트가 있습니다SDL_surface

typedef GLuint texture; 

texture load_texture(std::string fname){ 
    SDL_Surface *tex_surf = IMG_Load(fname.c_str()); 
    if(!tex_surf){ 
     return 0; 
    } 
    texture ret; 
    glGenTextures(1, &ret); 
    glBindTexture(GL_TEXTURE_2D, ret); 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    SDL_FreeSurface(tex_surf); 
    return ret; 
} 

문제는 그것이 작동하지 않는입니다. main 함수에서 함수를 호출하면, 단지 이미지를로드하지 않고 (그냥 드로잉 컬러를 표시 할 때), 메인 함수 외부의 함수에서 호출 할 때 프로그램이 충돌합니다.

2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels); 

는 사람이의 실수를 볼 수 있습니다 은 프로그램 충돌하게이 줄이야?

+0

문제를 나타내는 최소한의 편집 가능한 출처를 게시하십시오. 더 나은 답변을 얻을 수 있습니다. 문제가 무엇인지 이론화하는 것은 매우 어렵습니다. – dirkgently

답변

2

OpenGL 텍스처로 채우기 전에 SDL_Surface를 변환해야합니다. 다음은 일반적인 아이디어를 제공하는 것입니다.

SDL_Surface* originalSurface; // Load like an other SDL_Surface 

int w = pow(2, ceil(log(originalSurface->w)/log(2))); // Round up to the nearest power of two 

SDL_Surface* newSurface = 
    SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0); 
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface 

texture ret; 

glGenTextures(1, &ret); 
glBindTexture(GL_TEXTURE_2D, ret); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB, 
      GL_UNSIGNED_BYTE, newSurface->pixels); 

I found the original code here. other useful posts on GameDev도있을 수 있습니다.

+0

감사합니다. 충돌이 수정되어 질감이 여전히 표시되지 않습니다. –

+0

소스가 없으면 블리 팅이 작동하지 않는 이유를 확인하기가 매우 어려울 수 있습니다. 렌더링에 사용하는 코드를 게시 할 수 있습니까? –

0

당신은 당신의 코드 외부에서이 곳을 다하고 있는지 확실하지 않습니다,하지만 당신은 어떤 점에서

glEnable(GL_TEXTURE_2D);

를 불렀다?

+0

새로운 OpenGL 버전에서는 고정 파이프 라인 텍스처가 더 이상 사용되지 않기 때문에 이것이 전혀 도움이되지 않을뿐만 아니라 OpenGL 컨텍스트에서 오류가 발생할 수도 있습니다. – Kenji

0

또한 기본 GL_REPLACE 텍스처 블렌딩 모드는 현재 glColor에 들어오는 텍셀 RGB 값을 곱합니다. 결과 : glColor3f (0,0,0)은 텍스처가 있어야하는 곳에 검은 색을 줄 것입니다.

텍스처가있는 형상을 그리기 전에 glColor3f (1,1,1)를 확인하십시오.

관련 문제