![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Привет.
Вот какой вопрос возник. Раньше загружал текстуру в DirectX путём копирования её из Bitmap по пикселям. Это долго и неудобно. Решил попробовать скопировать кусок памяти, вот что написал:
Получается, только одна проблема - каналы. Синий и красный поменяны местами. Что-то не получается каналы поменять местами. Подскажите как это сделать? Я перепробовал много форматов текстур, и PixelFormat у Bitmapa ставил 32 и 24, но ничего не помогает. Как поменять каналы-то? Вот такое получается: Присоединённый файл ( Кол-во скачиваний: 16 ) ![]() |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Забыл сказать: Можно для этого использовать функцию D3DXCreateTextureFromFileInMemory, это решает проблему, но копирование памяти напрямую выполняется в несколько раз быстрее, а это в данном случае очень важно, так как я пытаюсь реализовать видео текстуру.
|
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Вобщем ответ нашелся как всегда неожиданно.
Вместо CopyMemory(lrect.pBits,str.Memory,str.Size); я написал CopyMemory(PDWORD (DWORD(lrect.pBits) + offset),str.Memory,str.Size); при этом offset равен магическому числу -54! ![]() Это сообщение отредактировал(а) Bitter - 24.2.2010, 15:15 |
|||
|
||||
Rpahut |
|
|||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
А что же Texture.FromBitmap()?
Странно что в D3D нет D3DFMT_B8G8R8. Или я его просто не нашел?
Как вообще ты это определил, если у тебя синий и красный каналы одинаковые? А зеленый вобще пустой ![]() Короче не самая подходящая картинка для проверки расположения каналов. Поменяй ее на картинку с надписью "красный зеленый синий" и покажи что получилось. --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Вот пример видео выложил. Тут оказалась проблема не с каналами, а дело в како-то смещении.
Я получаю указатель на начало памяти текстуры методом LockRect. После чего копирую в него кусок памяти из потока. Но копируется почему-то с каким-то смещением, и получается что информация о красной цветовой составляющей копируется, например, в синюю, синяя в зеленую, зеленая в красную. Но если я копирую со смещением -54, то всё хорошо.
В IDirect3DTexture9 нет такого. А формата D3DFMT_B8G8R8 действительно нет, за-то есть D3DFMT_A8B8G8R8, только что-то с каким бы я форматом не создавал текстуру - результат одинаковый. Присоединённый файл ( Кол-во скачиваний: 17 ) ![]() |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
А вы не замечали что у вас в случаях, когда смещение не равно -54, картинка косая? Левая сторона не сходится. Скорее всего в начале записаны какие-то рабочие данные, которые вы пропускаете этим самым смещением.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Bitter |
|
||||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Rickert, да, похоже на то. Может это какой-то заголовок битмапа? 54 байта
Добавлено @ 14:09 Вобщем если это заголовок, а так скорее всего и есть, то тогда правильно не
а
и поменять с -54 на 54. А то получается я затираю 54 байта памяти до текстуры. Это сообщение отредактировал(а) Bitter - 25.2.2010, 14:11 |
||||
|
|||||
Rpahut |
|
|||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Если там битмаповы заголовки, еще правильнее будет учитывать их фактические размеры. Вот тут про них, правда у меня 54 не получается никак
![]() --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
А! так может это заголовок потока... Я ж битмап сначала сохраняю в поток, а потом память потока копирую.
|
|||
|
||||
Rpahut |
|
|||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Сомневаюсь чтобы у потока был хедер. Даже если это дельфи. Там может быть мусор, тогда его надо Flush'ить перед записью или делать Clear.
И заголовки битмапа все равно следует обрабатывать. Если вдруг попадется картинка с палитрой или 32-битная, нужно использовать соответствующий D3DFMT или в крайнем случае отказывать в обработке. --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |