Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> цветовые каналы у Bitmap и DirectX, как поменять каналы местами? 
V
    Опции темы
Bitter
Дата 24.2.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Привет.

Вот какой вопрос возник. Раньше загружал текстуру в DirectX путём копирования её из Bitmap по пикселям. Это долго и неудобно. Решил попробовать скопировать кусок памяти, вот что написал:

Код

 Bitmap.SaveToStream(str);
 D3DXCreateTexture(Device, Bitmap.Width, Bitmap.Height, 0, 0, D3DFMT_R8G8B8,
                                  D3DPOOL_MANAGED, Texture);

 Texture.LockRect(0, lrect, nil, 0);
 CopyMemory(lrect.pBits,str.Memory,str.Size);
 Texture.UnlockRect(0);


Получается, только одна проблема - каналы. Синий и красный поменяны местами. Что-то не получается каналы поменять местами. Подскажите как это сделать? Я перепробовал много форматов текстур, и PixelFormat у Bitmapa ставил 32 и 24, но ничего не помогает. Как поменять каналы-то?

Вот такое получается:

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  1.jpg 75,73 Kb
PM MAIL ICQ Skype   Вверх
Bitter
Дата 24.2.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Забыл сказать: Можно для этого использовать функцию D3DXCreateTextureFromFileInMemory, это решает проблему, но копирование памяти напрямую выполняется в несколько раз быстрее, а это в данном случае очень важно, так как я пытаюсь реализовать видео текстуру.
PM MAIL ICQ Skype   Вверх
Bitter
Дата 24.2.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 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!  smile . Почему? это мне не понятно. Но работает идеально.

Это сообщение отредактировал(а) Bitter - 24.2.2010, 15:15
PM MAIL ICQ Skype   Вверх
Rpahut
Дата 24.2.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



А что же Texture.FromBitmap()?
Странно что в D3D нет D3DFMT_B8G8R8. Или я его просто не нашел?

Цитата

Но работает идеально

Как вообще ты это определил, если у тебя синий и красный каналы одинаковые?  А зеленый вобще пустой smile Девид Блейн 
Короче не самая подходящая картинка для проверки расположения каналов. Поменяй ее на картинку с надписью "красный зеленый синий" и покажи что получилось.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Bitter
Дата 25.2.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Вот пример видео выложил. Тут оказалась проблема не с каналами, а дело в како-то смещении. 

Я получаю указатель на начало памяти текстуры методом LockRect. После чего копирую в него кусок памяти из потока. Но копируется почему-то с каким-то смещением, и получается что информация о красной цветовой составляющей копируется, например, в синюю, синяя в зеленую, зеленая в красную. Но если я копирую со смещением -54, то всё хорошо. 

Цитата

А что же Texture.FromBitmap()?


В IDirect3DTexture9 нет такого.

А формата D3DFMT_B8G8R8 действительно нет, за-то есть D3DFMT_A8B8G8R8, только что-то с каким бы я форматом не создавал текстуру - результат одинаковый.

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  test.jpg 265,05 Kb
PM MAIL ICQ Skype   Вверх
Rickert
Дата 25.2.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



А вы не замечали что у вас в случаях, когда смещение не равно -54, картинка косая? Левая сторона не сходится. Скорее всего в начале записаны какие-то рабочие данные, которые вы пропускаете этим самым смещением.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Bitter
Дата 25.2.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Rickert, да, похоже на то. Может это какой-то заголовок битмапа? 54 байта

Добавлено @ 14:09
Вобщем если это заголовок, а так скорее всего и есть, то тогда правильно не 

Код

CopyMemory(PDWORD (DWORD(lrect.pBits) + offset), str.Memory, str.Size);


а

Код

CopyMemory(lr.pBits, PDWORD (DWORD(str.Memory) + offset), str.Size-offset);


и поменять с -54 на 54. А то получается я затираю 54 байта памяти до текстуры.

Это сообщение отредактировал(а) Bitter - 25.2.2010, 14:11
PM MAIL ICQ Skype   Вверх
Rpahut
Дата 25.2.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Если там битмаповы заголовки, еще правильнее будет учитывать их фактические размеры. Вот тут про них, правда у меня 54 не получается никак  smile 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Bitter
Дата 25.2.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



А! так может это заголовок потока... Я ж битмап сначала сохраняю в поток, а потом память потока копирую.
PM MAIL ICQ Skype   Вверх
Rpahut
Дата 25.2.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Сомневаюсь чтобы у потока был хедер. Даже если это дельфи. Там может быть мусор, тогда его надо Flush'ить перед записью или делать Clear.

И заголовки битмапа все равно следует обрабатывать. Если вдруг попадется картинка с палитрой или 32-битная, нужно использовать соответствующий D3DFMT или в крайнем случае отказывать в обработке.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.