OpenGL unter SDL

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

OpenGL unter SDL

Beitrag 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
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: OpenGL unter SDL

Beitrag 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
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: OpenGL unter SDL

Beitrag 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
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: OpenGL unter SDL

Beitrag 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
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Antworten