Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2013, 23:41   #1
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
Лампочка Вопросы по ГЛ

Недавно просматривал копипастил код загрузки текстуры и обнаружил вот такой вызов.

glPixelStorei(GL_UNPACK_ALIGNMENT,1 );

Это что и для чего? Что за распаковочное выравнивание для хранящихся пикселей?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 29.04.2013, 00:29   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
GL_UNPACK_ALIGNMENT

Specifies the alignment requirements for the start of each pixel row in memory. The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries).
на русском не искал.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2013, 07:15   #3
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

я так и думал что это выравнивание, но для чего оно?

pixel row - это три(четыре) байта RGB(A) и их вариации ?

почему при загрузке изображения в текстуру выравнивают по байту ?

по умолчанию стоит значение 4, да?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 29.04.2013, 08:03   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

выравнивание строки текстуры, по умолчанию стоит 4, и скажем если у нас 24 битная текстура, то надо делать дополнительные телодвижения, чтоб обеспечить выравнивание.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2013, 09:06   #5
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Цитата:
то надо делать дополнительные телодвижения
И все-таки не понятно для чего?
Смотрите.
Файл изображений имеет формат [ R8 G8 B8 ]
V для:
glPixelStorei(GL_UNPACK_ALIGNMENT,1 );
V имеем плотно упакованные цвета:
Текстура в видео памяти [R8 G8 B8] [ R8 G8 B8 ] [ R8 G8 B8 ]...


V а если:
glPixelStorei(GL_UNPACK_ALIGNMENT,4 );
V то:
Текстура в видео памяти [R8 G8 B8 0] [ R8 G8 B8 0] [ R8 G8 B8 0]...
Так? Видно что у нас появляется избыточный байт на хранение, если битность не кратна 4 байтам.

Но, ядра в гпу оперируют векторами из четырех компонентов float типа.
V
Вектор4 для счета в гпу имеет вид [ f32 f32 f32 f32]

И мне кажется вот это [R8 G8 B8 0] будет куда быстрее ложится в [ f32 f32 f32 f32], чем вот это - [ R8 G8 B8 ] ?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 29.04.2013, 10:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы не знакомы с выравниванием данных в памяти?

вы сейчас привязываетесь к формату пикселя, а он не причем, я говорю о выравнивании начала каждой строки битмапа.
скажем одна строчка занимает 3 байт
имеем(D данные, X выравнивание), без выравнивания:
D D D
D D D
с выравниванием 2/4:
DDDX
DDDX
с выравниванием 8:
DDDXXXXX
DDDXXXXX

а параметр существует для того чтоб OpenGL знать дают ему данные с выравниванием или без, чтоб коррекно их прочесть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2013, 11:00   #7
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Цитата:
вы не знакомы с выравниванием данных в памяти?
С концепцией я знаком.
Выравнивание структур описывающие цвет по адресу кратному 1, 4 ? именно его я по-моему и показывал, у вас что-то схожее. У меня 0 – у вас Х.

Цитата:
я говорю о выравнивании начала каждой строки битмапа
Зачем выравнивать строки битмапа? Разве битмап не линейная область памяти?
Просто каждый кратный ширине рисунка пиксель есть перенос по Y.

Я же говорю о выравнивании именно структур описывающих цвет в битмапе, каждого пикселя.
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 29.04.2013, 11:13   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Зачем выравнивать строки битмапа? Разве битмап не линейная область памяти?
Просто каждый кратный ширине рисунка пиксель есть перенос по Y.
каждая строка считай структура, которая выравнена, внутри нее пиксели лежат именно согласно формату пикселя, а сами строки выравнены, чтоб каждая новая строка начиналась на выравненном адресе.

вы говорите о формате пикселя RGBX.
как бы процессор не умеет работать с 3 байтовыми данными(ох вспоминаю работу с FAT12 на асме...), приходится читать 4 байта*, и выделять нужные байты.

* причем учтем кратность шины адреса, откуда выравнивание и пошло, а именно что если данные лежат в двух областях согласно кратности, процессор будет вынужден сделать два считывания из памяти вместо одного.(он лишь откидывает не нужное, и берет нужное)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2013, 19:35   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от intmain Посмотреть сообщение
Зачем выравнивать строки битмапа? Разве битмап не линейная область памяти?
Нет.
Почитайте о формате файла BMP. Думаю, все само собой прояснится.
s-andriano вне форума Ответить с цитированием
Старый 29.04.2013, 19:36   #10
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Цитата:
как бы процессор не умеет работать с 3 байтовыми данными
для каких целей тогда это?
glPixelStorei(GL_UNPACK_ALIGNMENT,1 );
Текстура без альфы RGB выровненная по 1 = 24 бита = 3 байта.
Пусть хоть первый пиксель растра и находиться на выровненном адресе, последующие как мне представляется - нет.

Я не пойму эта команда это приказ как хранить текстуру или же в каком формате будут предоставлены данные, а хранить ГЛ будет в каком укажешь в переменной интернал формат ?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы Syltan Общие вопросы C/C++ 2 13.11.2009 19:32
Вопросы по if, else? molodoyy Общие вопросы C/C++ 1 25.10.2008 18:55
вопросы MAcK Win Api 7 21.07.2007 18:08