2016-04-29 2 views
0

Я текстурировал сферу с изображением .bmp. Проблема в том, что когда изображение отображается на сфере, цвет изображения выглядит инвертированным. Подобно RED, становится BLUE, а BLUE становится RED. Я пробовал использовать GL_BGR вместо GL_RGB, но его бесполезно. Должен ли я изменить код для загрузки изображения. Потому что он дает предупреждение для использования функции fopen(), а также не думаю, что это имеет значение для того, что я прошу. Изображение, которое я получаю после сопоставления texured sphere with inverted colorsЗагрузка и картирование текстуры

Это то, что я попытался загрузить изображение и применил некоторые материалы для текстурирования.

GLuint LoadTexture(const char * filename, int width, int height) 
{ 
GLuint texture; 
unsigned char * data; 
FILE * file; 

//The following code will read in our RAW file 
file = fopen(filename, "rb"); 
if (file == NULL) return 0; 
data = (unsigned char *)malloc(width * height * 3); 
fread(data, width * height * 3, 1, file); 
fclose(file); 

glGenTextures(1, &texture); //generate the texturewith the loaded data 
glBindTexture(GL_TEXTURE_2D, texture); //bind thetexture to it’s array 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE); //set  texture environment parameters 




// better quality 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); 

//Here we are setting the parameter to repeat the textureinstead of clamping the texture 
//to the edge of our shape. 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT); 

//Generate the texture with mipmaps 
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data); 
free(data); //free the texture 
return texture; //return whether it was successfull 
} 

    void FreeTexture(GLuint texture) 
    { 
    glDeleteTextures(1, &texture); 
    } 
+0

Возможный дубликат [Как загрузить BMP на GLUT, чтобы использовать его в качестве текстуры?] (Http://stackoverflow.com/questions/12518111/how-to-load-a-bmp-on-glut- to-use-it-as-a-texture) – teivaz

ответ

0

БМП файл начинается с BITMAPFILEHEADER структурой, которая содержит (помимо всего прочего) смещение до фактического начала бит в файле.

Итак, вы можете сделать что-то подобное, чтобы добраться до битов BMP-файла.

BITMAPFILEHEADER bmpFileHeader; 
fread(&bmpFileHeader,sizeof(bmpFileHeader),1,file); 
fsetpos(file,bmpFileHeader->bfOffBits,SEEK_SET); 
size_t bufferSize = width * height * 3; 
fread(data,bufferSize,1,file); 

Конечно, это опасно, так как вы ожидаете должным образом отформатированный BMP-файл. Поэтому вам действительно нужно прочитать BITMAPINFO.

BITMAPFILEHEADER bmpFileHeader; 
fread(&bmpFileHeader,sizeof(bmpFileHeader),1,file); 
BITMAPINFO bmpInfo; 
fread(&bmpInfo,sizeof(bmpInfo),1,file) 
fsetpos(file,bmpFileHeader->bfOffBits,SEEK_SET); 
int width = bmpInfo->bmiHeader.biWidth; 
int height = bmpInfo->bmiHeader.biHeight; 
assert(bmpInfo->bmiHeader.biCompression == BI_RGB); 
assert(bmpInfo->bmiHeader.biBitCount == 24; 
size_t bufferSize = width * height * 3; 
fread(data,bufferSize,1,file); 

Возможно, вы сделаете это более сложным в отношении сопоставления форматов bmp с разрешенными форматами opengl.

Дополнительные осложнения будут:

  • данные ВМР является снизу вверх так появится вверх дном, если вы не исправите для этого.
  • данные пикселя в файле bmp дополняются, чтобы каждая строка была кратной ширине 4 байта, что может вызвать проблемы с шагами, если ваше изображение не равно 32 битам на пиксель или кратно 4 пикселям в ширину (что является практикой обычно верно).
  • Просто потому, что вы можете подавать константу в OpenGL, не означает, что формат фактически поддерживается. Иногда вам просто нужно попасть туда и переупорядочить байты самостоятельно.
+0

Поскольку я новичок в этом поле, скажите, что BITMAPFILEHEADER доступен в glut.h, или мне нужно добавить для него определенный файл заголовка. – saurabh

+0

О, я вижу, вы не делаете это на окнах? Если вы, просто #include , если нет, вы можете найти структуры файлов BMP, описанные здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85) ,aspx –

+0

Хорошо. Я скорректировал это перевернутое изображение, отредактировав его. – saurabh

0

Наконец-то я получил то, что мне нужно. Я с помощью неправильный аргумент GL_RGB вместо я заменил его с GL_BRG_EXT в этой функции

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_BGR_EXT, GL_UNSIGNED_BYTE, data); 

ранее я получал это. textured mapped sphere with inverted colors

сейчас я получаю это после изменения, которое я сделал выше. textured mapped sphere with true colors

Смежные вопросы