@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;
	}
}

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы