2013-07-13 2 views
2

Я использую этот ответ, чтобы встроить мое изображение в EXE-файле:Загрузки встроенные текстуры с почвенными

Embedding resources in executable using GCC

Здесь находятся соответствующие биты моего кода:

GLuint grass_DTexture; 

extern char binary_grass_D_bmp_start[]; 
extern char binary_grass_D_bmp_size[]; 

short loadTexture(char *imageData[], GLuint *texture) { 
    *texture = SOIL_load_OGL_texture_from_memory(imageData, sizeof(*imageData), SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    return 1; 
} 

loadTexture(&binary_grass_D_bmp_start, &grass_DTexture); 

Однако текстура не загружается, и я получаю беловато-серое покрытие.

EDIT: Я знаю, что это был не мой первоначальный вопрос, однако мне трудно использовать mipmaps. Я изменил функцию loadTexture следующим образом: short loadTexture (char * imageData [], GLuint * texture, int width, int height) { glEnable (GL_TEXTURE_2D); glGenTextures (1, текстура); glBindTexture (GL_TEXTURE_2D, * texture);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    *texture = SOIL_load_OGL_texture_from_memory(imageData, sizeof(*imageData), SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_MIPMAPS); 

    //gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, imageData); 

    //glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, width, height); 
    //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, imageData); 
    //glGenerateMipmap(GL_TEXTURE_2D); 

    glDisable(GL_TEXTURE_2D); 
    return 1; 
} 

На этот раз exe сработает, как только он будет запущен. Я также поздоровался со следующим предупреждением, что может быть причиной этого (возможно, отсутствующий символ * или & где-нибудь):

init.c:76:2: warning: passing argument 1 of 'loadTexture' from incompatible poin 
ter type [enabled by default] 
loadTexture.h:1:7: note: expected 'char **' but argument is of type 'char (*)[]' 

я сумел сократить аварии на SOIL_load_OGL_texture_from_memory вызова.

+0

Этот код также получает несколько предупреждений. Пожалуйста, не могли бы вы исправить их? – CHRIS

ответ

2

GL_TEXTURE_MIN_FILTER по умолчанию GL_NEAREST_MIPMAP_LINEAR​.

Upload some mipmaps or switch to GL_NEAREST or GL_LINEAR.

+0

Спасибо за ваш ответ, он действительно направил меня в правильном направлении. Но когда я пытаюсь использовать mipmaps, я получаю новую проблему. Я новичок в OpenGL, и многие обучающие программы, с которыми я столкнулся, используют устаревшую библиотеку, такую ​​как GLAUX или просто используют доступ к файлам, и не вставляют текстуры. – CHRIS

+0

@CHRIS: Почему 'gluBuild2DMipmaps()'? Что случилось с 'SOIL_FLAG_MIPMAPS'? – genpfault

+0

А, думаю, я, возможно, столкнулся с проблемой. My imageData - это содержимое BMP-файла. Является ли функция SOIL_load_OGL_texture_from_memory разработанной для использования с необработанными пиксельными данными? – CHRIS