Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > работа с палитрой в Direct3D


Автор: cossack5 14.6.2012, 18:46
Возникла острая необходимость перенести проект с DirectDraw на Direct3D (чтобы можно было использовать преимущества последнего). Все было бы хорошо, если не палитра, которая используется в проекте. В DirectDraw для палитры отведен отдельный интерфейс, да и функций там больше. Вариант остаться на DirectDraw или не юзать палитру не предлагать (слишком много спрайтов "запалитренных" этой палитрой).  Пример кода создания рабочей и палитры средствами DirectDraw:
Код

PALETTEENTRY PAL[256];
//заполняем PAL
LPDIRECTDRAW DD;
//создаем DirectDraw
LPDIRECTDRAWSURFACE DSURFACE;
// создаем поверхность
LPDIRECTDRAWPALETTE DDPAL;
bool PaletteLoaded=false;
if (!PaletteLoaded){
  DD->CreatePalette(DDPCAPS_8BIT,&PAL[0],&DDPAL,NULL); // создаем 8-битную палитру.
  DSURFACE->SetPalette(DDPAL); 
  PaletteLoaded=true;
  }else{
    DDPAL->SetEntries(0,0,256,PAL);
};

Что касается Direct3D (Direct3D9), то там есть лишь одна функция. IDirect3DDevice9::SetPaletteEntries
Код

HRESULT SetPaletteEntries(
  [in]  UINT PaletteNumber,
  [in]  const PALETTEENTRY *pEntries
);


В MSDN говорится, что PaletteNumber - порядковый номер палитры. Возник вопрос, где взять этот порядковый номер? И например, если установить его в 0, то функция не вернет D3D_OK. 
Код

HRESULT dd=g_pd3dDevice->SetPaletteEntries(0,PAL);
if (dd==D3D_OK)
{
};

 Даже если и вернет D3D_OK, цвета останутся теми же. Если создать поверхность с D3DFMT_A8 или D3DFMT_P8 вместе каких бы то ни было корявых изображений белый экран, работает так (но без палитры, все в сером цвете):
g_p3dDevice->CreateOffscreenPlainSurface(width,height,D3DFMT_L8,D3DPOOL_DEFAULT,&g_p2DSurface,NULL);
В GDI нашел http://msdn.microsoft.com/en-us/library/dd183507(v=vs.85).aspx, но похоже она не годится для этого, хотя я не уверен. Даже великий гугл ничего не может дать (за исключенем кучи сайтов не отличающихся от MSDN).
Также не вызывается метод GetPaletteEntries(UINT PaletteNumber, PALETTEENTRY *pEntries): выдает access violation.
Код

// д3д уже создан, девайс создан, поверхность создана
    PALETTEENTRY PAL[256];
    memset(PAL,0,sizeof PAL);
         if (g_pd3dDevice->GetPaletteEntries(0,PAL)==D3D_OK) 
{
// действия 
};


Автор: BEOWOLF 16.6.2012, 15:35
В Direct3D при отрисовке через интерефейс спрайта, можно передавать цвет-маску, это частично заменяет использование палитры. Ещё можно спрайты-маски делать. Ещё можно натягивать разные текстуры и по-разному микшировать... Ну и предлагаю вообще не работать с сурфейсами, а лучше с текстурами smile

Добавлено через 5 минут и 38 секунд
да, ещё есть мысль: можно при отрисовке конкретного спрайта использовать пиксельный шейдер, заменяющий одни цвета на другие smile

Автор: cossack5 24.6.2012, 22:06
Может кто-нибудь знает, как использовать формат D3DFMT_P8? Поверхность с таким форматом не создается. Мне лишь удалось узнать, что именно он должен использоваться при работе с палитрой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)