Проблемы с загрузкой растровых данных в текстуру OpenGL

К сожалению, у меня есть некоторые проблемы с glBindTexture ().

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

Это мой engine.cpp, здесь я загружаю bitmap et 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);

Есть идеи?

0

Решение

Я вижу несколько возможных проблем.

  1. Вы уверены, что загружаете несжатый файл .bmp, проверьте bfh.biCompression
  2. Вы можете использовать GL_RGBA, если bih-> biBitCount == 32, попробуйте использовать GL_RGB
  3. Попробуйте использовать GL_UNSIGNED_BYTE вместо GL_UNSIGNED_INT
  4. Пожалуйста, проверьте размер изображения, я думаю, что для скайбокса это должно быть что-то вроде 128×128, 256×256, 512×512, то есть размер текстуры power-of-2
  5. замещать
    fread (данные, sizeof (данные), 1, ввод);
    на
    fread (данные, 1, bih-> biWidth * bih-> biHeight * bih-> biBitCount / 8, вход);
1

Другие решения

Это не правильно

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

bih это уже указатель на структуру. Ты хочешь:

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

Кроме того, вы действительно должны использовать bfOffBits от BITMAPFILEHEADERи не предполагать, что биты битовой карты сразу же следуют за BITMAPINFOHEADER, Увидеть раздел MSDN, описывающий формат растровых файлов.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector