Очередной вопрос: почему это происходит с некоторыми изображениями, а с некоторыми - нет?
Думаю на SOIL
Mifls_X
Подозреваю что это два треугольника нарисованных квадом и у верхних или нижних вершин перепутаны текстурные координаты.
В том то и дело, что нет
Меняю название файла текстуры, и все норм:
Читаю так:
#include <SOIL/SOIL.h>
unsigned char* image = SOIL_load_image("../cat.jpg", &width, &height, 0, SOIL_LOAD_RGB);
Какой размер текстуры у тебя?
Попробуй перед заливкой в текстуру - glPixelStorei(GL_UNPACK_ALIGNMENT, 2)
Типичные Ошибки
а конкретно Texture upload and pixel reads
glPixelStorei(GL_UNPACK_ALIGNMENT, 2) не помог.
Но что мы делаем, когда код не работает?
Правильно! Подключаем метод тыка!
glPixelStorei(GL_UNPACK_ALIGNMENT, 1) помог=)
Спасибо=)
Текстуры лучше грузить в формате RGBA, вроде как RGB всё равно эмулируется драйвером.
Mifls_X
lassons
Добавил структуру папок и снова проблема с текстурами:
Game/Room.h
#include "../Engine/Texture.h" floorFigure.texture = LoadTexture(strdup("../Resources/smile.png"));
А теперь внимание: размер текстуры он загружает, а вместо текстуры - мусор.
Если же из main.cpp сделать следующее, все ОК
#include "Game/Room.h" Room room; room.floorFigure.texture = LoadTexture(strdup("../Resources/smile.png"));
Ну и неизменный GitLab: https://gitlab.com/Mifls/opengl-lessons/
Нашел ошибку:
Класс инициализируется как-то не до конца.
Решение: room = *(new Room());
Mifls_X
> room = *(new Room());
привет утечкам памяти.
А как лучше?
Mifls_X
> А как лучше?
сейчас они тебе насоветуют всякие умные указатели.
Но ты их не слушай. Просто пойми, что если ты делаешь new, то делаешь это в указатель, например вот так:
Room * r = nullptr; ... r = new Room;
r - это твой "ключ" доступа к куску памяти выделенной в куче. Потеряешь его, память утечет.
Когда ты знаешь, что дальше в твоей программе эта память не нужна, то освобождаешься от нее снова с помощью "ключа" r:
delete r;
Mifls_X
> А как лучше?
твоя проблема в том что у тебя сейчас есть глобальная переменная room конструктор которой вызывается еще до входа main() в то время когда у тебя еще не создан контекст opengl который в свою очередь необходим для загрузки текстур. Если не сильно переписывать то решений несколько:
1)
#include <memory> std::unique_ptr<Room> room; // вместо Room room; room = std::make_unique<Room>(); // вместо room = *(new Room());
2)
// вынести содержание конструктора в отдельный метод, anti RAiI подход. room.Init(); // // вместо room = *(new Room());
Тема в архиве.