| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > цветовые каналы у Bitmap и DirectX |
| Автор: Bitter 24.2.2010, 14:12 | ||
| Привет. Вот какой вопрос возник. Раньше загружал текстуру в DirectX путём копирования её из Bitmap по пикселям. Это долго и неудобно. Решил попробовать скопировать кусок памяти, вот что написал:
Получается, только одна проблема - каналы. Синий и красный поменяны местами. Что-то не получается каналы поменять местами. Подскажите как это сделать? Я перепробовал много форматов текстур, и PixelFormat у Bitmapa ставил 32 и 24, но ничего не помогает. Как поменять каналы-то? Вот такое получается: |
| Автор: Bitter 24.2.2010, 14:30 |
| Забыл сказать: Можно для этого использовать функцию D3DXCreateTextureFromFileInMemory, это решает проблему, но копирование памяти напрямую выполняется в несколько раз быстрее, а это в данном случае очень важно, так как я пытаюсь реализовать видео текстуру. |
| Автор: Bitter 24.2.2010, 15:14 |
| Вобщем ответ нашелся как всегда неожиданно. Вместо CopyMemory(lrect.pBits,str.Memory,str.Size); я написал CopyMemory(PDWORD (DWORD(lrect.pBits) + offset),str.Memory,str.Size); при этом offset равен магическому числу -54! |
| Автор: Rpahut 24.2.2010, 22:55 | ||
| А что же Texture.FromBitmap()? Странно что в D3D нет D3DFMT_B8G8R8. Или я его просто не нашел?
Как вообще ты это определил, если у тебя синий и красный каналы одинаковые? А зеленый вобще пустой Короче не самая подходящая картинка для проверки расположения каналов. Поменяй ее на картинку с надписью "красный зеленый синий" и покажи что получилось. |
| Автор: Bitter 25.2.2010, 10:39 | ||
| Вот пример видео выложил. Тут оказалась проблема не с каналами, а дело в како-то смещении. Я получаю указатель на начало памяти текстуры методом LockRect. После чего копирую в него кусок памяти из потока. Но копируется почему-то с каким-то смещением, и получается что информация о красной цветовой составляющей копируется, например, в синюю, синяя в зеленую, зеленая в красную. Но если я копирую со смещением -54, то всё хорошо.
В IDirect3DTexture9 нет такого. А формата D3DFMT_B8G8R8 действительно нет, за-то есть D3DFMT_A8B8G8R8, только что-то с каким бы я форматом не создавал текстуру - результат одинаковый. |
| Автор: Rickert 25.2.2010, 12:19 |
| А вы не замечали что у вас в случаях, когда смещение не равно -54, картинка косая? Левая сторона не сходится. Скорее всего в начале записаны какие-то рабочие данные, которые вы пропускаете этим самым смещением. |
| Автор: Bitter 25.2.2010, 13:56 | ||||
| Rickert, да, похоже на то. Может это какой-то заголовок битмапа? 54 байта Добавлено @ 14:09 Вобщем если это заголовок, а так скорее всего и есть, то тогда правильно не
а
и поменять с -54 на 54. А то получается я затираю 54 байта памяти до текстуры. |
| Автор: Rpahut 25.2.2010, 18:43 |
| Если там битмаповы заголовки, еще правильнее будет учитывать их фактические размеры. Вот http://msdn.microsoft.com/en-us/library/dd183386%28VS.85%29.aspx про них, правда у меня 54 не получается никак |
| Автор: Bitter 25.2.2010, 18:52 |
| А! так может это заголовок потока... Я ж битмап сначала сохраняю в поток, а потом память потока копирую. |
| Автор: Rpahut 25.2.2010, 21:18 |
| Сомневаюсь чтобы у потока был хедер. Даже если это дельфи. Там может быть мусор, тогда его надо Flush'ить перед записью или делать Clear. И заголовки битмапа все равно следует обрабатывать. Если вдруг попадется картинка с палитрой или 32-битная, нужно использовать соответствующий D3DFMT или в крайнем случае отказывать в обработке. |