LINUX.ORG.RU

[opengl] glGenerateMipmap приводит к падению приложения

 


0

1

Прочитал новость про Lips of suna и решил посмотреть что она из себя представляет. Но она не запустилась, т.к. требует opengl 3.2, а у меня драва поддерживают только 1.4. Захотелось мне снизить требования, убрав всё лишнее. Начал с того что убрал проверку на версию opengl и тут же получил падение вот тут:

LIImgTexture*
liimg_texture_new_from_rgba (int         width,
                             int         height,
                             const void* pixels)
{
	LIImgTexture* self;
	// ---------------- 8-<------------- 
	glGenTextures (1, &self->texture);
	glBindTexture (GL_TEXTURE_2D, self->texture);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
	glGenerateMipmap (GL_TEXTURE_2D); // <<-- Segmentation fault

	return self;
}

Я закомментировал эту строку, но после этого вылетать стало на следующем вызове glGenerateMipmap (в другом файле). В описании этой функции не нашёл ничего страшного. Почему на ней вылетает? Если она не поддерживается в 1.4, чем её можно заменить?


Смотреть в исходник внимательнее. Например в Quake{2,3} все функции opengl вытаскивались с помощью dlsym(). Если тут что-то в этом же духе, то падение предсказуемо.

А вообще, прежде чем задавать вопрос, почему падает, можно было бы запустить это дело в gdb, и посмотреть stacktrace падения.

vaulter
()

Какое-то расширение не поддерживается твоей картой, например. А так - смотри корку gdb'ой.

cnupm
()

Почему на ней вылетает? Если она не поддерживается в 1.4, чем её можно заменить?

Ну вот вы и ответили на первую часть своего вопроса. Заменить можно собственной функцией, генерирующей mipmap'ы, это совсем просто. Пример можно посмотреть в исходниках Quake 2/3, например.

Deleted
()
Ответ на: комментарий от cnupm

А, еще тут подземный стук поищи - например, формат компресии текстур не поддерживается дровами/железом.

cnupm
()

glGenerateMipmap только для OpenGL 3.0 и выше.

Если она не поддерживается в 1.4, чем её можно заменить?

Перед glTexImage2D вызывай:

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 

Еще есть gluBuild2DMipmaps, но её рекомендуют бояться как огня :)

Andru ★★★★
()

Кстати, а в 3.0 искаропки поддерживаются неквадратные текстуры? А то тут тоже могут возникнуть проблемы.

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

Использовать неквадратные текстуры вообще и npot в частности весьма вредно.

iSage ★★★★
()
Ответ на: комментарий от cnupm

Что за tile.dat? В исходном посте автора ничего подобного не вижу. Зато вижу, что формат текстуры — GL_RGBA.

Deleted
()
Ответ на: комментарий от Andru

Перед glTexImage2D вызывай:

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 

Огромное спасибо! Оказывается glGenerateMipmap появилась только в 3.1.

Но теперь у меня появилась другая проблема:

int liren_buffer_init (
	LIRenBuffer*       self,
	const void*        index_data,
	int                index_count,
	const LIRenFormat* vertex_format,
	const void*        vertex_data,
	int                vertex_count,
	int                type)
{
	int size;

	lisys_assert (vertex_format->vtx_format);

	memset (self, 0, sizeof (LIRenBuffer));
	self->type = type;
	self->vertex_format = *vertex_format;
	glBindVertexArray (0); // <<-- Segmentation fault

Вроде бы эта функция появилась только в OGL 3.0. Чем её можно заменить в 1.4??

mors
() автор топика
Ответ на: комментарий от mors

Вроде бы эта функция появилась только в OGL 3.0. Чем её можно заменить в 1.4??

Увы, Vertex Array Objects прерогатива лишь OpenGL >= 3.0. По идеи это можно переделать кое-как используя Vertex Buffer Object(я правда не уверен, т.к. с VAOs дела не имел), но это очень много работы, овчинка не стоит выделки, ИМНО.

Andru ★★★★
()
Ответ на: комментарий от Andru

но это очень много работы, овчинка не стоит выделки, ИМНО.

Ага. Понял. Спасибо за ответ :)

mors
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.