Seite 1 von 1

OpenGL unter SDL

Verfasst: 10.03.2016, 16:58
von starcow
Tach Zusammen

Eine kurze Frage an euch:
Ich möchte mich wieder ein bisschen mit OpenGL auseinandersetzen und habe deshalb ein SDL-Projekt aufgesetzt.
Ich hatte vor die SDL fürs Erzeugen des Fenster und fürs Input-Handling zu verwenden und zum konkreten rendern dann OpenGL.

Ich bin mir aber jetzt bezüglich dem Verwenden von OpenGL nicht sicher: Brauche ich nun neben der SDL noch weitere Libs wie z.B. GLUT oder GLEW oder kann ich OpenGL direkt über die SDL verwenden? Den auf opengl.org ist die SDL als Windwostoolkit neben CPW aufgeführt (https://www.opengl.org/resources/librar ... wtoolkits/).

Falls man doch noch zusätzliche Libs benötigt, zu was würdet ihr mir da raten?
Ich habe mir GLEW angeschaut, doch da besteht das Problem, dass man die Files nur über Sourcefrage downloaden kann - und die haben ja bekanntermassen ein Malware/Addware Problem.
Wie stehts um CPW?
Ich habe jetzt noch nicht die grossen Ambitionen. Ich möchte nur mal wieder ein bisschen meine Programmier-Kenntnisse auffrischen und etwas Grafik Programmieren.
Quasi Persönliche Grundlagenforschung betreiben. :-)
Etwas das jetzt nicht so den grossen Overhead mit sich zieht und leicht zu handhaben ist wäre daher wünschenswert :-)

Gruss starcow

Re: OpenGL unter SDL

Verfasst: 10.03.2016, 18:20
von xq
Hey!

Ich persönlich nutze immer SDL2 in Kombination mit gl3w (https://github.com/skaslev/gl3w).

SDL2 hat die bessere API (mehrere Fenster, einige überarbeitete Sachen, OpenGL-Kontext-Erstellung ist einfacher). gl3w brauchst du, wenn man irgendwas mit opengl extensions oder > OpenGL 3 arbeiten will und ist imho der flachste und angenehmste Wrapper/Loader den es gibt.

Ich hab mal was aus nem Projekt rausgerissen:

Code: Alles auswählen

void Framework::initialize()
{
	if(SDL_Init(SDL_INIT_EVERYTHING) != 0) {
		throw InitializationException(SDL_GetError());
	}
	atexit(SDL_Quit);

	this->mWindow = SDL_CreateWindow(
		"Destoroya - Tank war arising",
		SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
		this->mScreenSize.x, this->mScreenSize.y,
		SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
	if(this->mWindow == nullptr) {
		throw InitializationException("Failed to create window.");
	}

	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); // Das hier ausschalten für OpenGL ;)

    this->mContext = SDL_GL_CreateContext(this->mWindow);
    if(this->mContext == nullptr) {
		SDL_DestroyWindow(this->mWindow);
        throw InitializationException(SDL_GetError());
    }

	// Register OpenGL debugging callback.
#if defined(GL_KHR_debug)
	glDebugMessageCallbackKHR(printOpenGLDebug, nullptr);
	glEnable(GL_DEBUG_OUTPUT_KHR);
#endif

	/*
	static struct {
		int major, minor;
	} version;
	*/
	// glGetIntegerv(GL_MAJOR_VERSION, &version.major);
	// glGetIntegerv(GL_MINOR_VERSION, &version.minor);
	std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << std::endl;
	// std::cout << "OpenGL Version: " << version.major << "." << version.minor << std::endl;
	std::cout << "GLSL Version:   " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
	std::cout << "Renderer:       " << glGetString(GL_RENDERER) << std::endl;
	std::cout << "Vendor:         " << glGetString(GL_VENDOR) << std::endl;
}

void Framework::render()
{
    glViewport(0, 0, this->mScreenSize.x, this->mScreenSize.y);
    glClearColor(0.0f, 0.0f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

	if(this->mCurrentState != nullptr) {
		this->mDebugDraw->makeCurrent();
        this->mCurrentState->render(this->mGraphics);
	}

    SDL_GL_SwapWindow(this->mWindow);
}
Ich nutze hier zwar OpenGL ES, aber es macht praktisch keinen Unterschied, muss man bei der Initialisierung das Flag wegnehmen, dann geht das auch mit klassischem OpenGL.

Grüße
Felix

Re: OpenGL unter SDL

Verfasst: 11.03.2016, 16:57
von starcow
Super! Ich danke dir Felix! :-)
Verstehe ich das richtig, das ich Python installieren muss, damit mir im Anschluss dann die verschiedenen inculde Files erstellt werden?
Zum Ausführen von meinem compilierten Programm muss dann aber kein Python mehr installiert sein?

Gruss starcow

Re: OpenGL unter SDL

Verfasst: 11.03.2016, 18:02
von xq
Ja genau. Das phython-skript ist nen "fauler" trick, damit hast du danach auf jeden Fall die aktuellen Header und der Repo maintainer braucht sich darum nicht zu kümmern.
Das Skript läuft mit Phyton2 und Phyton3