簡體   English   中英

將位圖數據加載到OpenGL紋理時出現問題

[英]Problems loading bitmap data into an OpenGL texture

不幸的是,我在glBindTexture()上遇到了一些問題。

當我嘗試將位圖圖像綁定到我的天空盒時,我只會看到一些白色。 我用其他數字進行了測試,但這也不起作用。 我確定問題出在Engine類中。

這是我的engine.cpp,在這里我加載了位圖和cetra:

#include <windows.h>
#include <gl/GL.h>

#include <iostream>
#include "engine.h"

unsigned char* Engine::getImageContents(char path[], BITMAPINFOHEADER* bih) {
    FILE* input; fopen_s(&input, path, "rb");

    if (input != NULL) {
        BITMAPFILEHEADER bfh;
        fread(&bfh, sizeof(bfh), 1, input);
        fread(&bih, sizeof(bih), 1, input);

        unsigned char* data =
            new unsigned char[bih->biWidth * bih->biHeight * bih->biBitCount / 8];

        fread(data, sizeof(data), 1, input);
        fclose(input);

        return data;
    } else {
        return NULL;
    }
}

void Engine::bindTexture(char path[]) {
    this->bindTexture(this->getTextureId(path));
}

void Engine::bindTexture(unsigned int id) {
    if (id != this->boundTexture) {
        glBindTexture(GL_TEXTURE_2D, id);
        this->boundTexture = id;
    }
}

unsigned int Engine::getTextureId(char path[]) {
    if (this->textureMap.find(path) != this->textureMap.end()) {
        return this->textureMap[path];
    } else {
        unsigned int id; glGenTextures(1, &id);
        BITMAPINFOHEADER bih;
        unsigned char* data = this->getImageContents(path, &bih);
        this->setupTexture(data, id, bih.biWidth, bih.biHeight);
        this->textureMap.insert(std::pair<char*, unsigned int>(path, id));
        return id;
    }
}

void Engine::setupTexture(unsigned char* data, unsigned int id, long width, long height) {
    this->setupTexture(data, id, width, height, false);
}

void Engine::setupTexture(unsigned char* data, unsigned int id, long width, long height, bool clamp) {
    std::cout << height << std::endl;
    this->bindTexture(id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp ? GL_CLAMP : GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp ? GL_CLAMP : GL_REPEAT);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_INT, data);
}

我使用這樣的類:

Engine::bindTexture(path);

有任何想法嗎?

這是不對的:

fread(&bih, sizeof(bih), 1, input);

bih已經是該結構的指針。 你要:

fread(bih, sizeof *bih, 1, input);

另外,您確實應該使用BITMAPFILEHEADER bfOffBits ,而不應BITMAPFILEHEADER圖位緊跟在BITMAPINFOHEADER 請參閱描述位圖文件格式的MSDN主題

我看不到任何可能的問題。

  1. 確定要加載未壓縮的.bmp文件,請檢查bfh.biCompression
  2. 如果bih-> biBitCount == 32,則可以使用GL_RGBA,請嘗試使用GL_RGB
  3. 嘗試使用GL_UNSIGNED_BYTE而不是GL_UNSIGNED_INT
  4. 請檢查圖像大小,我認為對於Skybox,它應為128x128、256x256、512x512,即2的冪
  5. 更換
    fread(data,sizeof(data),1,輸入);

    fread(數據,1,bih-> biWidth * bih-> biHeight * bih-> biBitCount / 8,輸入);

暫無
暫無

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

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