Ключ здесь не в настройке фрейма
let inBox = UIView(frame: CGRect(x: 100, y: 2000, width: 10, height: 10))
, но здесь
inBox.translatesAutoresizingMaskIntoConstraints = false
эта строка игнорирует внутреннее преобразование фрейма в ограничения и устанавливает их по умолчанию на ноль, недостаточные ограничения не означают, что вы не можете видеть представление, например, вы можете сделать то же самое в IB и по-прежнему видеть представление с красной рамкой, а также после запуска, но это не значит, что оно установлено правильно, и это как окончательные ограничения будет преобразован во фрейм, так что это совпадение относительно нуля
Править: Используйте glPixelStorei. Вы используете его для установки GL_UNPACK_ROW_LENGTH
к ширине (в пикселях) всего изображения. Затем Вы называете glTexImage2D (или безотносительно), передавая его указатель на первый пиксель подызображения и ширины и высоты подызображения.
Не забывайте восстанавливать GL_UNPACK_ROW_LENGTH
к 0, когда Вы закончены с ним.
Т.е.:
glPixelStorei( GL_UNPACK_ROW_LENGTH, img_width );
char *subimg = (char*)m_data + (sub_x + sub_y*img_width)*4;
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, subimg );
glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
Или, если у Вас аллергия на математику указателя:
glPixelStorei( GL_UNPACK_ROW_LENGTH, img_width );
glPixelStorei( GL_UNPACK_SKIP_PIXELS, sub_x );
glPixelStorei( GL_UNPACK_SKIP_ROWS, sub_y );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data );
glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
Edit2: Ради полноты я должен указать, что при использовании OpenGL-ES затем, Вы не добираетесь GL_UNPACK_ROW_LENGTH
. В этом случае Вы могли или (a) извлечь подызображение в новый буфер сами, или (b)...
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTES, NULL );
for( int y = 0; y < sub_height; y++ )
{
char *row = m_data + ((y + sub_y)*img_width + sub_x) * 4;
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, y, sub_width, 1, GL_RGBA, GL_UNSIGNED_BYTE, row );
}