2016-07-08 6 views
2

Angesichts einer einkanaligen Bitmap (Alpha), die durch unsigned char* dargestellt wird, was sind die Möglichkeiten, ein SDL_Texture daraus zu machen? Die Bitmap enthält keine zusätzlichen Daten.1-Kanal-Bitmap zu einem SDL_Texture

Von dem, was ich verstehe, wird es getan, indem zuerst SDL_CreateRGBSurfaceFrom(bitmap, width, height, depth, pitch, r, g, b, amasks) aufgerufen wird.

1) Ein (naive & schmutzig), wie ich versuchte, wurde von unsigned int* repräsentiert eine Bitmap zu schaffen, wobei 75% davon Raum ist war 0xFF, dann ein Anruf an:
SDL_CreateRGBSurfaceFrom(bitmap, width, height, 32, 4 * width, 0xff000000, 0xff0000, 0xff00, 0xff) für mich hat es geschafft. (Opak ist weiß und wieder transparent, weil 0xFF verwendet wurde).
Aber ich würde einen anderen Weg bevorzugen, denn auf diese Weise muss ich Speicher reservieren und eine große for-Schleife machen.

auto pixelsNum = width * height; 
auto bitmap = new unsigned[pixelsNum]; 
for(auto i = 0; i < pixelsNum; ++i) { 
    bitmap[i] = tmpBitmap[i] | 0xffffff00; 
} 


2) Der zweite Weg ich versuchte, war durch Verwendung von Tiefe = 8, und deshalb musste ich keine neue Bitmap zuzuweisen, und statt (notwendig?) Ein SDL_Pallete.

auto surf = SDL_CreateRGBSurfaceFrom(bitmap, width, height, 8, width, 0, 0, 0, 0xff); 
SDL_Color colors[256]; 
for(int i = 0; i < 256; ++i) { 
    colors[i].r = colors[i].g = colors[i].b = 0xff; 
    colors[i].a = i; 
} 
SDL_SetPaletteColors(surf->format->palette, colors, 0, 256); 

Dies ist bei weitem billiger im Speicher und ist konstant.

Aber Leistung ist nicht der Grundstein für mich, wie ich gerne wissen würde, wenn es einen Weg gibt, konnte ich noch den ursprünglichen Aufruf von CreateRGBSurface verwenden und einfach eine bessere Maske oder etwas geben. Danke.

p.s. Ich habe ein paar versucht, noch in der Nähe und lustigsten ich bekam, war dies, wo es ist alles Blut und die Textur wiederholt sich 3-mal in der Breite:
http://i.stack.imgur.com/kvBkW.png

+0

C++ ist nicht C ist nicht C++! – Olaf

+1

Nun, ich weiß es nicht. Aber SDL ist C, und wenn mir jemand eine reine C-Lösung geben würde, hätte es für mich funktioniert. – iwat0qs

+0

@ iwat0qs Ich habe gerade den Schnitt überprüft und gesehen, dass du ihn ursprünglich * * * markiert hast. Das scheint mir gut zu sein, da es sich technisch um SDL und nicht um C++ handelt. Ignoriere meinen vorherigen Kommentar. – Dan

Antwort

1

SDL_CreateRGBSurface(0, w, h, 8, 0, 0, 0, 0xff); reicht nur alpha zu haben. Bei der Konvertierung in Textur wird der Renderer jedoch versuchen, die Grafikhardwarehilfsmittel mit dem engsten Format zu wählen, und es gab für eine ganze Zeit keine Palettenunterstützung in der Hardware. Resultierende Textur wird höchstwahrscheinlich SDL_PIXELFORMAT_ARGB8888 Format unabhängig von Ihrem Ansatz haben. Ich sehe keine Unterstützung in SDL für 1-Kanal-Texturen, aber es ist möglicherweise immer noch möglich, OpenGL-Texturen direkt zu verwenden (z. B. SDL_GL_BindTexture). Natürlich werden Sie gezwungen, bei einer bestimmten SDL_Renderer-Implementierung zu bleiben.

+0

Ich habe die Pixelformat-Werte durchgesehen, und nur Index8 (benutzerdefinierte Palette) und RGB332 sind verfügbar. Ich werde mit der Palette gehen :) – iwat0qs