openGL SubTexturing

Ключ здесь не в настройке фрейма

let inBox = UIView(frame: CGRect(x: 100, y: 2000, width: 10, height: 10))

, но здесь

inBox.translatesAutoresizingMaskIntoConstraints = false

эта строка игнорирует внутреннее преобразование фрейма в ограничения и устанавливает их по умолчанию на ноль, недостаточные ограничения не означают, что вы не можете видеть представление, например, вы можете сделать то же самое в IB и по-прежнему видеть представление с красной рамкой, а также после запуска, но это не значит, что оно установлено правильно, и это как окончательные ограничения будет преобразован во фрейм, так что это совпадение относительно нуля

8
задан DavidG 23 January 2019 в 19:40
поделиться

1 ответ

Править: Используйте 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 );
}
28
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

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