2015-11-11 3 views
2
void OGLRectangle::LoadTexture(const char* filename) 
{ 
unsigned int texture; 
int width, height; 
BYTE * data; 
FILE * file; 

file = fopen(filename, "rb"); 

width = 1920; 
height = 1080; 
data = new BYTE[height * width * 3]; 

fread(data, width * height * 3, 1, file); 
fclose(file); 

glGenTextures(1.0, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
tex = 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_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

glTexImage2D(GL_TEXTURE_2D, 0, 2, width, height,0, GL_RGB, GL_UNSIGNED_BYTE, data); 

delete [] data; 

}C++ OpenGL текстуры не загружаются

У меня есть этот код для отображения в изображении, метод вызывается с: LoadTexture ("C: \\ Users \ Rhys \ Documents \ Hills.bmp"); Файл существует.

Затем я пытаюсь отобразить его в окне openGL, используя;

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, tex); 
glBegin(GL_QUADS); 
glTexCoord2d(0.0, 0.0); glVertex2d(0.0, 0.0); 
glTexCoord2d(1.0, 0.0); glVertex2d(100.0, 0.0); 
glTexCoord2d(1.0, 1.0); glVertex2d(100.0, 100.0); 
glTexCoord2d(0.0, 1.0); glVertex2d(0.0, 100.0); 
glEnd(); 
glDisable(GL_TEXTURE_2D); 

Однако все, что я получаю на экране, - это темно-синяя коробка, без текстуры в ней. Я искал учебники о том, как это сделать, даже спросил моего преподавателя, и я все еще не могу понять, почему он не работает. Любая помощь будет принята с благодарностью.

+0

Формат файла BMP не такой уж упрощен. (Странно, что ваш лектор не знает об этом.) – molbdnilo

ответ

2

.bmp файлов загрузка должна быть немного отличаться

Этого код просто загружает BMP файл в память m_pcbData без сжатия и индексируемой поддержки цвета.

bool CBMPImage::LoadFromFile(const CString& FileName) 
{ 
    BITMAPINFOHEADER BitmapInfo; 
    ZeroMemory(&BitmapInfo, sizeof(BITMAPINFOHEADER)); 

    BITMAPFILEHEADER BitmapFile; 
    ZeroMemory(&BitmapFile, sizeof(BITMAPFILEHEADER)); 

    std::ifstream FileStream(FileName, std::ios::binary | std::ios::in); 

    if (!FileStream.good()) 
     return false; 

    // Read bitmap file info 
    FileStream.read(reinterpret_cast<char*>(&BitmapFile), sizeof(BITMAPFILEHEADER)); 
    // Read bitmap info 
    FileStream.read(reinterpret_cast<char*>(&BitmapInfo), sizeof(BITMAPINFOHEADER)); 

    // Proper bitmap file supports only 1 plane 
    if (BitmapInfo.biPlanes != 1) 
     return false; 

    m_cbAlphaBits = 0; 
    m_cbRedBits = 0; 
    m_cbGreenBits = 0; 
    m_cbBlueBits = 0; 

    // Retrives bits per pixel info 
    m_cbBitsPerPel = (BMPbyte)BitmapInfo.biBitCount; 

    // Width and height of image 
    m_nWidth = BitmapInfo.biWidth; 
    m_nHeight = BitmapInfo.biHeight; 

    // Compute bitmap file size 
    m_nSize = 4 * ((m_nWidth * m_cbBitsPerPel + 31)/32) * m_nHeight; 

    // Less important info 
    m_nPixelWidthPerMeter = BitmapInfo.biXPelsPerMeter; 
    m_nPixelHeightPerMeter = BitmapInfo.biYPelsPerMeter; 

    // Indexes info not important in our case 
    m_nClrCount = BitmapInfo.biClrUsed; 
    m_nClrImportant = BitmapInfo.biClrImportant; 

    // COMPRESSION MUST BE BI_RGB 
    m_Compression = (BMPCompression)BitmapInfo.biCompression; 

    delete [] m_pcbData; 
    m_pcbData = NULL; 

    // Allocate proper data size 
    m_pcbData = new BMPbyte[m_nSize]; 

    // Read actual image data, considering offset of file header 
    FileStream.seekg(BitmapFile.bfOffBits); 
    FileStream.read(reinterpret_cast<char*>(m_pcbData), m_nSize); 

    FileStream.close(); 

    return true; 
} 

, чем загрузить данные BMP текстур в OpenGL

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Image.GetWidth(), Image.GetHeight(), 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, (GLvoid*)Image.GetImageData()); 

GL_BGR_EXT является важным, поскольку данные bmp сохраняет изображения в обратном порядке байтов.

Во-вторых вы должны указать свой цвет материала, как белый из-за использования, что текстура среды GL_TEXTURE_ENV_MODE, GL_MODULATE

И как уже упоминалось @Reto KORADI, необходимо указать для генерации мип перед загрузкой текстур изображения, используя один из этих вызовов функций.

glGenerateMipmap(GL_TEXTURE_2D); 

или

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 

Плюс, как вы использовали не силу двух текстур (width = 1920; height = 1080;) он может не работать.

1

Вы установка атрибута к образцу с мипмапов:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 

Вы должны только установить, что если ваши текстуры на самом деле имеет мип. Для генерации мип, вы можете позвонить:

glGenerateMipmap(GL_TEXTURE_2D); 

послеglTexImage2D() вызова. Или вы можете просто установить атрибут сэмплер не использовать мип:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

Как уже указывались: Если файл изображения действительно BMP, а не только сырой файл изображения, изображение код загрузки будет также нужна работа.

+0

В этом случае OP должен просто получить белый квадрат, считая, что он использует 'GL_TEXTURE_ENV_MODE, GL_MODULATE'. Потому что, если поле действительно черное, во всех случаях оно будет черным. – Mykola