簡體   English   中英

C ++ OpenGL紋理未加載

[英]C++ OpenGL Texture not loading

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;

}

我有這段代碼可以在圖像中呈現,該方法的調用方式為: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);

但是,我在屏幕上看到的只是一個深藍色的框,其中沒有渲染紋理。 我已經搜索了有關如何執行此操作的教程,甚至問了我的講師,我仍然似乎無法找出為什么它不起作用。 任何幫助將不勝感激。

.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;)因此它可能無法工作。

您正在設置屬性以使用mipmaps進行采樣:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

僅當紋理實際具有mipmap時才應進行設置。 要生成Mipmap,可以調用:

glGenerateMipmap(GL_TEXTURE_2D);

glTexImage2D()調用之后。 或者,您可以簡單地將sampler屬性設置為不使用mipmap:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

正如已經指出的那樣:如果您的圖像文件確實是BMP,而不僅僅是原始圖像文件,則圖像加載代碼也將需要工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM