C ++ OpenGL纹理无法加载

时间:2015-11-11 14:46:42

标签: c++ opengl

display: none

}

我有这个代码在图像中呈现,该方法被调用: LoadTexture( “C:\\用户\里斯\文件\ Hills.bmp”); 该文件存在。

然后我尝试将其渲染到openGL窗口;

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;

然而,我在屏幕上看到的只是一个深蓝色的盒子,里面没有纹理。 我已经搜索了如何做到这一点的教程,甚至问我的讲师,我似乎仍然无法找出它为什么不起作用。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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,您必须指定在使用其中一个函数调用加载纹理图像之前生成mipmap。

glGenerateMipmap(GL_TEXTURE_2D);

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

另外,因为你没有使用两种纹理(width = 1920; height = 1080;),所以它可能不起作用。

答案 1 :(得分:1)

您正在使用mipmaps将属性设置为sample:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

如果你的纹理实际上有mipmap,你应该只设置它。要生成mipmap,您可以调用:

glGenerateMipmap(GL_TEXTURE_2D);
在<{strong> glTexImage2D()电话之后

。或者您可以简单地将sampler属性设置为不使用mipmaps:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

正如已经指出的那样:如果您的图像文件确实是BMP,而不仅仅是原始图像文件,那么您的图像加载代码也需要工作。