Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 6. listopad 2011, 19:46:25 Předmět: Přehození vlastního a SDL framebufferu |
|
|
Zdravím, vykresluji si do vlastního bufferu a řeším problém, jak elegantně a pokud možno rychle prohodit framebuffery. Původně jsem chtěl nějak jednoduše zkopírovat data přes memcpy() - formát pixelu 32 bit RGBA - ale je tu problém, data pixelu jsou v SDL uložené ve struktuře, takže RGBA hodnoty nejsou uložené jako jeden blok paměti. Můžu to přes cykly for "vyseparovat" bod po bodu, ale to mně přijde jako hodně pomalé a neefektivní... Existuje ještě nějaký lepší postup, o kterém nevím? Předem díky za odpovědi, costa |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 6. listopad 2011, 22:54:53 Předmět: |
|
|
v akej strukture. SDL ma framebuffer ulozeny sice v struct SDL_Surface ale ta obsahuje void *pixels. takze nevidim problem s memcpy. samozrejme traba pouzit SDL_LockSurface() a potom Unlock _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 6. listopad 2011, 23:50:43 Předmět: |
|
|
Takže void *pixels ukazuje na pole pouze RGBA hodnot, pokud nastavím bpp u surface na 32 bit? Nemusím řešit žádné masky jednotlivých složek a pod? |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. listopad 2011, 01:45:19 Předmět: |
|
|
A masky jsou nějaký problém? To ti jenom říká, kde je jaká barva v paměti. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 7. listopad 2011, 07:03:11 Předmět: |
|
|
On to chce ale zřejmě zkopírovat jako raw data, bez nutnosti konverze či swapování kanálů u jednotlivých pixelů.
Nevím jak je to u SDL, ale řekl bych že ten interní formát toho surfacu bude BGRA a nebo ABGR, takže jedině to kopírovat po pixelech.
Jestli jsou ty pixel formáty shodné, a chceš to kopírování ještě (až nechutně) urychlit, tak si zapni ve VS podporu pro SIMD SSE2, přes příkaz "/arch: SSE2", a nebo si najdi na webu memcpy pro SSE2. _________________
|
|
Návrat nahoru |
|
|
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 7. listopad 2011, 09:42:23 Předmět: |
|
|
Ještě je tu jedna možnost.... Vytvořím si pomocný SDL buffer pomocí SDL_CreateRGBSurfaceFrom(), a pak prohodím jednoduše 2 SDL buffery... |
|
Návrat nahoru |
|
|
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 9. listopad 2011, 16:30:27 Předmět: |
|
|
Zdravím, ještě bych se rád vrátil k tomuto tématu... Když jenom zkopíruju data z mého bufferu do SDL bufferu (oba by měly hodnoty jednotlivých složek RGBA uloženy stejně), tak ve výsledku se zobrazí pouze stupně šedi, tzn od bílé po černou... Nevíte, kde by mohl být problém, resp. nesetkal se někdo s něčím podobným? |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 9. listopad 2011, 17:30:36 Předmět: |
|
|
kod ako to kopirujes? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 9. listopad 2011, 18:43:22 Předmět: |
|
|
memcpy(surface->pixels, buffer, (width*height*sizeof(int))) |
|
Návrat nahoru |
|
|
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 11. listopad 2011, 17:08:18 Předmět: |
|
|
Tak problém částečně vyřešený, memset() "konvertuje" int na unsigned char, což v důsledku znamená, že z čísla 0x1234abcd najednou vznikne číslo 0xcdcdcdcd, což je ten buffer ve stupních šedi |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 11. listopad 2011, 19:30:32 Předmět: |
|
|
Pouzi napriklad
kód: |
std::fill_n<uint*, size_t, uint>((uint*)pole, (size_t)pocet, (uint)0x12345678); |
_________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 11. listopad 2011, 20:50:11 Předmět: |
|
|
Díky za odpověď, píšu v pure C .. Vyřešil jsem to cyklem for a memcpy, doufám že to nebude na rychlost až tak kritické |
|
Návrat nahoru |
|
|
|