2017-11-12 1 views
0

Also mein Hauptziel ist es, die Pixeldaten einer bestimmten Textur zu lesen. Um dies zu testen, habe ich eine neue Textur mit Zielzugriff erstellt und dann rot gezeichnet.Warum kann ich in SDL2 keine Textur zeichnen?

Das Problem ist, dass, wenn ich auf die Pixeldaten zugreifen, sagt SDL_RenderReadPixels() die Tonhöhe ist 0, und alle Pixeldaten sind 0. Auch wenn ich versuche, die neue Textur zu zeichnen, kommt es schwarz.

SDL_Texture* tempChar = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 3, 5); 

if (SDL_SetRenderTarget(renderer, tempChar) != 0) { 
    cout << "SDL_SetRenderTarget() Error! " << SDL_GetError() << endl; 
} else { 
    cout << "SDL_SetRenderTarget() success" << endl; 
} 

if (SDL_RenderClear(renderer) != 0) { 
    cout << "SDL_RenderClear() Error! " << SDL_GetError() << endl; 
} else { 
    cout << "SDL_RenderClear() success" << endl; 
} 

if (SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255) != 0) { 
    cout << "SDL_SetRenderDrawColor() Error! " << SDL_GetError() << endl; 
} else { 
    cout << "SDL_SetRenderDrawColor() success" << endl; 
} 

if (SDL_RenderFillRect(renderer, NULL) != 0) { 
    cout << "SDL_RenderClear() Error! " << SDL_GetError() << endl; 
} else { 
    cout << "SDL_RenderClear() success" << endl; 
} 

int w; 
int h; 
Uint32 format; 
int access; 

if (SDL_QueryTexture(tempChar, &format, &access, &w, &h) != 0) { 
    cout << "SDL_QueryTexture() ERROR : " << SDL_GetError() << endl; 
} else { 
    cout << "SDL_QueryTexture() no error" << endl; 
} 

cout << "width is : " << w << " height is : " << h << endl; 

if (access == SDL_TEXTUREACCESS_TARGET) { 
    cout << "TARGET" << endl; 
} 

if (format == SDL_PIXELFORMAT_RGBA8888) { 
    cout << "format is : SDL_PIXELFORMAT_RGBA8888" << endl; 
} 

void* readPixels = NULL; 
int pitch; 

if (SDL_RenderReadPixels(renderer, NULL, 0, readPixels, pitch) != 0) {//12 pitch, 3x4bytes 
    //an error occurred 
    cout << "SDL_RenderReadPixels() Error, text probably wont work... :-/\n" << SDL_GetError() << endl; 
} else { 
    cout << "SDL_RenderReadPixels() success" << endl; 
} 

cout << "pitch returned : " << pitch << endl; 

menuMouse = tempChar; 

for (int i = 0; i < 5; i++) { 
    cout << "i is : " << i << endl; 
    char* rowStart = ((char*) readPixels) + i * pitch; 
    cout << "pix data is : " << int(rowStart) << endl; 
} 

Antwort

2

Aus irgendeinem Grund Sie davon ausgehen, dass SDL_RenderReadPixels Pixel-Array und kehrt Tonhöhe ordnet führt; tut es auch nicht. Rufenden Seite übergibt Pixel-Array groß genug, um Daten zu halten, und seine korrekte Tonhöhe, zB:

Uint32 pixels[3*5]; 
int pitch = sizeof(Uint32)*3; 

in C/C++, Funktionen nicht Eingabeparameter direkt ändern, es sei denn, Parameter ein Referenztyp (in C++) ist, oder Wert wird indirekt durch Zeiger geändert, also wenn Funktion int nimmt - es ist offenbar Eingangsparameter, nicht ausgegeben. Z.B. Werfen Sie einen Blick auf SDL_CreateWindowAndRenderer, die Fenster und Renderer-Zeiger ausgibt und daher seine Parametertypen Zeiger auf Zeiger sind.

+0

Aaah ja, das ist genau das was ich von den Pixeldaten angenommen habe, da die Dokumentation wirklich nicht so oder so aussagt. Und für die Tonhöhe, omg wie dumm von mir. Gibt es auch einen besseren Ort für die Dokumentation? [link] (https://wiki.libsdl.org/SDL_RenderReadPixels) Das Wiki scheint sehr spezifisch zu sein. – Tristus

+0

@Tristus Entschuldigung, ich habe nie wirklich nach einem gesucht. Im Zweifelsfall und wenn Wiki zu kurz kommt, schaue ich lieber in den Quellcode. – keltar

Verwandte Themen