Задать вопрос
@IliaNeverov

Почему одна текстура работает и загружается, а другие нет?

Подскажите пожалуйста почему когда загружаю одну текстуру она работает и отображается, когда загружаю любую другую текстуру (такого же формата) вызывается какое то исключение по адресу 0x00007FFD52C23138 (nvoglv64.dll) в MOTOR.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000001AD861C6000.

Вот код загрузки текстуры:
void GL::Texture::loadTextures(GLuint& texture, std::string WayToTexture)
{
	data = stbi_load(WayToTexture.data(),&width,&height,&channels,0);
	if (data != nullptr) {
		glGenTextures(1, &texture); 
		glBindTexture(GL_TEXTURE_2D,texture);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
		stbi_image_free(data);
	}
	else {
		std::cout << "texture"<< WayToTexture <<"couldn`t loaded"<<std::endl;
	}
}

Кроме того если заменить путь на неправильный то в консоль просто выведется сообщение что текстура не загружена , если же путь правильный (к другим картинкам) то вылетает исключение
В чем кроется проблема?
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Как показало обсуждение в комментариях, исключение бросается из функции glTexImage2D.
Подозрение в этом случае может пасть только на то, что размер переданной через data памяти меньше расчетного размера, который определяет функция исходя из параметров width, height, GL_RGBA, GL_UNSIGNED_BYTE.

Это может означать что переданные в glTexImage2D параметры не соответствуют считанному изображению. А т.к. width и height получены напрямую при чтении изображения, вопросы возникать могут только относительно заявленного формата изображения - GL_RGBA, GL_UNSIGNED_BYTE.

Собственно, именно так и оказалось на самом деле. Прочитанное изображение имеет другой формат и меньше каналов, а следовательно и меньший размер относительно расчетного.

Касательно самой функции загрузки текстуры - она слишком простая. Настоящая функция загрузки учитывает массу возможных вариантов хранения изображения и всегда учитывает все возможные точки отказа. Обработка всех возможных ошибок гораздо важнее прикладного кода функции.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы