OpenGL 3.3 Core Profil

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

OpenGL 3.3 Core Profil

Beitrag von Raphael »

Hi Leute,

ich bin gerade an einer kleinen 2D-Engine mit GLFW3 und GLEW und schaffe es nicht, dass etwas in mein Fenster gerendert wird, wenn ich das Core-Profil von OpenGL 3.3 in GLFW einstelle. Sowohl unter Linux mit Mesa und Intel als auch unter Windows mit Radeon bleibt das Bild schwarz. Folgende Zeilen nutze ich um in GLFW3 das Core-Profil zu aktivieren. Ohne diese Zeilen wird alles wie gewünscht gerendert:

Code: Alles auswählen

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
Meines Wissens nach benutze ich ausschließlich OpenGL 3.3 Core Profil kompatible Befehle und Shader. Mit CodeXL von AMD habe ich mein Programm mal geprofiled: Es scheinen alle ShaderPrograms, VertexArrayObjects und Texturen usw. im Context vorhanden zu sein. Bei der Kompilierung der Shader wird auch kein Log ausgegeben, sprich es gibt keine Fehler. In den Shadern ist natürlich die Version 330 core angegeben. CodeXL nennt ohne die Zeilen oben die OpenGL Version 4.4 und GLSL Version 4.4. Füge ich die Zeilen oben hinzu, wird die OpenGL Version zu 3.3 und die GLSL Version ist weiterhin 4.4. In beiden Fällen wurden die Shader angeblich erfolgreich zu Programs gelinked. Gibt es eine Möglichkeit herauszufinden, ob bestimme OpenGL Befehle im Code nicht im Core-Profil definiert sind?

PS: Hier noch die Shader:
Vertex Shader

Code: Alles auswählen

#version 330 core

uniform mat4 modelMatrix;
uniform mat4 projectionViewMatrix;
in vec3 vertex;
in vec2 textureCoordinate;
out vec2 uv;

void main ()
{
	uv = textureCoordinate;
	gl_Position = projectionViewMatrix * modelMatrix * vec4(vertex, 1.0);
}
Fragment Shader

Code: Alles auswählen

#version 330 core

uniform sampler2D diffuse;
uniform vec4 diffuseMuliplier;
in vec2 uv;
out vec4 frag_colour;

void main ()
{
	vec4 color = diffuseMuliplier * texture(diffuse, uv);
	frag_colour = color;
}
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: OpenGL 3.3 Core Profil

Beitrag von dot »

Hast du ein Vertex Array Object gesetzt?
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: OpenGL 3.3 Core Profil

Beitrag von Raphael »

Jep, die Erstellung sieht so aus:

Code: Alles auswählen

	/* Vertex Array Object */
	mVertexArrayObject = 0;
	glGenVertexArrays(1, &mVertexArrayObject);
	glBindVertexArray(mVertexArrayObject);

	/* Vertices */
	_int vertexAttrib = glGetAttribLocation(mpShader_OGL33->getProgramHandle(), "vertex");
	glEnableVertexAttribArray(vertexAttrib);
	glBindBuffer(GL_ARRAY_BUFFER, mpMesh_OGL33->getVerticesBufferHandle());
	glVertexAttribPointer(vertexAttrib, 3, GL_FLOAT, GL_FALSE, 0, NULL);

	/* Texture coordinates */
	_int uvAttrib = glGetAttribLocation(mpShader_OGL33->getProgramHandle(), "textureCoordinate");
	glEnableVertexAttribArray(uvAttrib);
	glBindBuffer(GL_ARRAY_BUFFER, mpMesh_OGL33->getTextureCoordinateBufferHandle());
	glVertexAttribPointer(uvAttrib, 2, GL_FLOAT, GL_FALSE, 0, NULL);

	/* Unbind as current VAO */
	glBindVertexArray(0);
Wird vor dem Rendern dann natürlich alles passend gebindet.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: OpenGL 3.3 Core Profil

Beitrag von Sternmull »

Ich würde mal noch gucken ob eine der Debug-Extensions vielleicht einen nützlichen Hinweis ausspuckt. Ansonsten nur eine ganz wilde Spekulation: Musst du vielleicht an der Pufferumschaltung was ändern? Vielleicht ist ja nur dieser Schritt dran schuld das das Bild nicht ankommt.
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: OpenGL 3.3 Core Profil

Beitrag von Raphael »

Meines Wissens nach sollte glfwSwapBuffers(window); funktionieren. Ich hab mich auch durch einige Google-Ergebnisse zu dem Thema gekämpft und kann eigentlich nichts finden, dass ich falsch mache. Nach den OpenGL Debug Extensions muss ich mal schauen, noch nie benutzt. Wäre cool, wenn die mir sagen würden, mit welchem Aufruf der nicht zurecht kommt :-/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: OpenGL 3.3 Core Profil

Beitrag von Schrompf »

Siehst Du im Frame Debugger, ob zum Zeitpunkt des DrawCalls alle States richtig sind, so wie Du sie erwartest? Ich habe ehrlich gesagt keine Ahnung, was anders ist, wenn Du bei GLFW das Core Profile bestellst, aber nach meiner Vermutung müssten dann ein paar der glBla()-Funktionszeiger NULL sein. Und das würdest Du unmittelbar beim Aufruf um die Ohren bekommen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: OpenGL 3.3 Core Profil

Beitrag von Spiele Programmierer »

Vielleicht dumme Frage, aber hast du mal "glGetError" überprüft? Wenn nein, solltest du das als erstes machen.
Die Debug-Ausgabe ist in der Tat auch nützlich und ersetzt theoretisch "glGetError".

Wenn du eine OpenGL-Funktion verwendest, die in dem Profil nicht vorhanden ist, sollte das auf beiden Wegen gemeldet werden.
Wenn du den obsoluten Müll gleich komplett weg haben willst, gibt es auch noch die Option den OpenGL Loader Generatorzu verwenden. Im Gegensatz zu GLEW stellt er dir nur genau die Funktionen zur Verfügung die auch brauchst. Die Compatiblity Extension verseucht also nicht den Header.

Ich kann mich auch erinnern, dass ich in GLEW für die Verwendung mit einem Core Profile immer "glewExperimental" auf "GL_TRUE" setzen musste, weil sonst GLEW selbst veraltete Funktionen verwenden mochte. (Ich glaube "glGetString(GL_EXTENSIONS)", welches in OpenGL 3.3 nicht mehr existiert, war damals das Problem)
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: OpenGL 3.3 Core Profil

Beitrag von Raphael »

Ok, glGetError() war eine gute Idee. Jetzt konnte ich das Problem (oder auch eines der Probleme) mit ein wenig Logging Gehacke auf eine unschöne Stelle eingrenzen:

Code: Alles auswählen

    {int i = glGetError(); if(i>0) Logger::info("A: ", i);}

	/* Make the window's context current */
	glfwMakeContextCurrent(window);

    {int i = glGetError(); if(i>0) Logger::info("B: ", i);}

	/* Initialize GLEW */
    glewExperimental = true;
	glewInit();

    {int i = glGetError(); if(i>0) Logger::info("C: ", i);}

	/* Initialization of rendering */
	mspRenderInterface->setupInterface();

    {int i = glGetError(); if(i>0) Logger::info("D: ", i);}

	/* Initialization method filled by user */
	init();

    {int i = glGetError(); if(i>0) Logger::info("E: ", i);}

	/* Run it */
	run();
So sieht dann das Log aus:

INFO : C: 1280
INFO : D: 1280

Die Initialisierung von GLEW geht wohl schon schief :-/
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: OpenGL 3.3 Core Profil

Beitrag von Spiele Programmierer »

Welche Version von GLEW verwendest du?
Vielleicht mal updaten?
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: OpenGL 3.3 Core Profil

Beitrag von Raphael »

Die aus dem ArchLinux Repository :-P
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: OpenGL 3.3 Core Profil

Beitrag von Spiele Programmierer »

Die Feststellung hilft und leider nicht wirklich weiter.
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: OpenGL 3.3 Core Profil

Beitrag von Raphael »

Naja, Arch ist Rolling Release und sollte soweit aktuell sein:

https://www.archlinux.org/packages/extra/x86_64/glew/
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: OpenGL 3.3 Core Profil

Beitrag von Spiele Programmierer »

Hast du mal versucht den Fehler einfach zu ignorieren?
Das OpenGL Wiki schreibt dazu, dass ämlich teilweise trozt "glewExperimental = GL_TRUE;" ein GL_INVALID_ENUM-Fehler auftreten kann, den man allerdings ignorieren kann.

Ich habe bisher auch noch meistens mit GLEW gearbeitet, aber wenn es Probleme gibt solltest du vielleicht tatsächlich zum Beispiel auf den OpenGL Loader Generator umsteigen.
Benutzeravatar
Raphael
Beiträge: 65
Registriert: 22.12.2011, 13:39
Echter Name: Raphael Menges

Re: OpenGL 3.3 Core Profil

Beitrag von Raphael »

Spiele Programmierer hat geschrieben:Ich habe bisher auch noch meistens mit GLEW gearbeitet, aber wenn es Probleme gibt solltest du vielleicht tatsächlich zum Beispiel auf den OpenGL Loader Generator umsteigen.
Genau das habe ich gerade versucht. Belasse ich glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE) im Code, öffnet sich kein Fenster. Kommentiere ich es aus, kommt die Meldung error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES. Unter ArchLinux mit Intel und Mesa. Ich hab jetzt aber wieder eine glGetError Ausgabe von 1280 pro Frame, mal sehen was da schief läuft.

EDIT: Ach, kann es sein, dass GL_QUADS deprecated sind? Mal zu Triangles wechseln...

EDIT2: Jap, das wars. Danke!
Antworten