C++ SDL2 Bild wird nicht gerendert

hofi64

Newbie
Registriert
März 2014
Beiträge
3
Hallo Leute.

Ich beschäftige mich seit kurzem mit SDL2 und möchte ein Bitmap rendern.
Ich bekomme jedoch von SDL_CreateTextureFromSurface "invalid texture" als Fehler und
es wird nur das Fenster mit meiner Renderfarbe dargestellt.
Wäre nett wenn mir jemand einen Tipp geben könnte.
Ich verwende Visual C++ 2013.

Danke im Vorraus,

hofi64

Code:
#include "SDL.h"
#include <stdio.h>

SDL_Event events;

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main(int argc, char *args[])
{
	//Variablen
	SDL_Window *wind = NULL;
	SDL_Surface *img = NULL;
	SDL_Texture *backg = NULL;
	SDL_Renderer *ren1 = NULL;
	bool inrun = true;

	//SDL Initialisieren
	if (SDL_Init(SDL_INIT_VIDEO) < 0)
	{
		printf("Error: %s\n", SDL_GetError());
	}

	//Fenster erstellen
	wind = SDL_CreateWindow("Another Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
	if (wind == NULL)
	{
		printf("Fenster konnte nicht erstellt werden, %s\n", SDL_GetError());
	}

	//Bild in Surface laden
	img = SDL_LoadBMP("back.bmp");
	if (img == NULL)
	{
		printf("back.bmp konnte nicht geladen werden, %s\n", SDL_GetError());
	}

	//Hier muss der Fehler liegen (invalid texture)
	backg = SDL_CreateTextureFromSurface(ren1, img);
	if (backg == NULL)
	{
		printf("Textur konnte nicht erstellt werden, %s\n", SDL_GetError());
	}
	
	SDL_FreeSurface(img);
	
	//Linearer Filter
	if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
	{
		printf("SDL_HINT_RENDER_SCALE_QUALITY wird nicht unterstützt!, %s", SDL_GetError());
	}
	
	//Render und Renderfarbe erstellen
	ren1 = SDL_CreateRenderer(wind, -1, SDL_RENDERER_ACCELERATED);
	if (ren1 == NULL)
	{
		printf("Renderer konnte nicht erstellt werden, %s\n", SDL_GetError());
	}
	
	SDL_SetRenderDrawColor(ren1, 0xFF, 0xFF, 0xFF, 0xFF);
	
	while (inrun != false)
	{
		while (SDL_PollEvent(&events) != 0)
		{
			//Events abfragen
			if (events.type == SDL_QUIT)
			{
				inrun = false;
			}
			if (events.key.keysym.sym == SDLK_ESCAPE)
			{
				inrun = false;
			}
		}
		//Rendern
		SDL_RenderClear(ren1);
		SDL_RenderCopy(ren1, backg, NULL, NULL);
		SDL_RenderPresent(ren1);
}

	//Schließen
	SDL_DestroyWindow(wind);
	SDL_DestroyRenderer(ren1);
	SDL_DestroyTexture(backg);
	SDL_Quit();
	
	return 0;
}
 
Sind Breite und Höhe deiner Bitmap jeweils eine Potenz von 2? Also 2,4,8,16,32,64,128,256,512 etc. ? Wenn nicht könnte das der Fehler sein, da das soweit ich weiß auch bei SDL Bedingung ist. Ich habe sonst allerdings keine Ahnung von SDL.
 
Ich hab das Bild jetzt von 640x480 auf 512x256 geändert, aber leider hat sich nichts getan.
 
Ich weiß nicht viel über SDL, aber musst du nicht erst den "rendering context" erstellen? Zum Zeitpunkt der Texturerstellung hast du ja nichts weiter als einen Nullzeiger:

Code:
SDL_Renderer *ren1 = NULL;
 
OK, Jetzt seh ichs auch.

Vielen Danke ph4nt0m! Hat geklappt ;)
 
Zuletzt bearbeitet: (verlesen)
Ich bin mir nicht sicher, ob wir uns richtig verstehen. Ich habe gesehen, dass du weiter unten den Renderer erzeugst. ;) Das muss aber wahrscheinlich vor der Texturerzeugung geschehen, weil die Methode SDL_CreateTextureFromSurface den Renderer bereits benötigt. Wie sollte SDL sonst wissen, welche Fähigkeiten deine Grafikkarte hinsichtlich der Texturformate beherrscht?
 
Zurück
Oben