glTexImage2D Segfault относится к ширине / высоте - PullRequest
6 голосов
/ 11 сентября 2011

При попытке загрузить изображение 771x768 у меня возникла ошибка.

Пробовал с изображением 24x24 и 768x768, и они работали, без проблем.

Ожидается ли это?Почему бы просто не ошибиться из-за ошибки GL?

Ошибка сегментации возникает в вызове glTexImage2D.Я загружаю двоичный файл PPM, поэтому он упакован 24 бит на пиксель.Это нечетное число в сочетании с нечетным измерением, вероятно, приводит к выравниванию не 4-байтовой (или даже 2-байтовой) структуры (и ссылки за пределы моего достаточно точно выделенного буфера могут быть причиной ошибки, но GDB не показывает мне памятьадрес (который я мог бы использовать, чтобы узнать, является ли это причиной)).

glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, dataptr);
// in this specific case of failure, width = 771, height = 768,
// dataptr contains 1776384 bytes of binary RGB image data (771*768*3 = 1776384)

Ответы [ 2 ]

16 голосов
/ 12 сентября 2011

Это нечетное число в сочетании с нечетным измерением, вероятно, приводит к выравниванию не 4-байтовой (или даже 2-байтовой) структуры (и ссылка на ошибку вне моего точно достаточно выделенного буфера может быть причиной ошибки

Вероятно, это и есть причина. К счастью, вы можете установить выравнивание OpenGL использует считывание данных пикселей. Прямо перед вызовом glTexImage…(…) do

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
1 голос
/ 12 сентября 2011

Я читал это на форумах opengl:

width must be 2^m + 2(border) for some integer m.
height must be 2^n + 2(border) for some integer n. 

(источник)

Я нашел это, которое, как мне кажется, проясняет, что происходит:

1. What should this extension be called?

  STATUS: RESOLVED

  RESOLUTION:  ARB_texture_non_power_of_two.  Conventional OpenGL
  textures are restricted to size dimensions that are powers of two.

из GL_ARB_texture_non_power_of_two

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...