Shader nicht kompiliert werden
Bin ich mir Folgendes Buch "OpenGL Programming Guide 8th Edition". Ich möchte nur das erste Programm eingeführt, das Buch auf meinem Mac.
Es ist Mavericks + Xcode 4.6.1 + Intel HD-graphics 4000. Also das problem ist, das die shader nicht kompiliert werden.
Shader-codes:
#version 410 core
layout(location = 0) in vec4 vPosition;
void
main()
{
gl_Position = vPosition;
}
Und die Fehlermeldung ist:
Shader compilation failed: ERROR: 0:1: '' : version '410' is not supported
ERROR: 0:1: '' : syntax error #version
ERROR: 0:3: 'layout' : syntax error syntax error
Habe ich versucht version 420/400/330, keiner von Ihnen arbeitet.
Durch die Art und Weise, das Programm verwendet die neuesten glew 1.10(http://glew.sourceforge.net), und ich fand, dass ich eingestellt habe "glewExperimental = GL_TRUE;" vor dem Aufruf glewInit. Ansonsten "glGenVertexArray" ist ein NULL-Zeiger. So Frage ich mich, vielleicht glew nicht unterstützt Mavericks?
- Haben Sie sich für das core-Profil für Ihr rendering? Ich glaube nicht, verwenden glew, ich benutze nur glfw zum erstellen der rendering-Kontext und Fenster, und die standard-Header. Unter MacOS habe ich nicht wirklich brauchen, glew, weil macos hat alle Funktionen und Konstanten, die das system/Treiber unterstützt.
- Ein weiterer Hinweis, weil ich vergaß zu erwähnen, MacOS hat nur die
legacy
und die3_2Core
Profil, das Sie auswählen können. Aber für3_2Core
es gibt höchsten ein Profil der system - /gpu-unterstützt, das ist rückwärts kompatibel zu3_2Core
. - Danke, aber wie "wählen Sie die core-Profil für Ihr rendering"?
- Das hängt davon ab, was Sie verwenden, um erstellen Sie Ihre rendering-Kontext. (GLUT, Native MacOS-Funktionen, glwf, QT, ...)
- Ich Wette, Sie können entfernen
layout(location = 0)
und#version 410 core
und es wird funktionieren. - Es funktioniert nicht, das habe ich versucht. Der shader-compiler beschwert sich, dass die "in" ist unbekannt.
- was passiert, wenn Sie es ändern, um
attribute
- Hinzugefügt
glut
tag, um Ihre Frage aus Ihrem Kommentar. Wie ich nicht glut auf macos kann ich nur vermuten, dassglutInitDisplayMode(GLUT_3_2_CORE_PROFILE)
wäre der richtige Befehl. Wahrscheinlich haben Sie bereits verwendenglutInitDisplayMode
mit anderen Optionen, dann müssen SieGLUT_3_2_CORE_PROFILE
mit ODER so, es würde wahrscheinlich so AussehenglutInitDisplayMode(GLUT_3_2_CORE_PROFILE | GLUT_RGBA | GLUT_DOUBLE);
varying
undattribute
sind veraltet, also beim lernen von modernen OpenGL (3.2+) Sie sollten nicht mehr verwendet werden.- Ja, das ist wahr, ich wollte, um sicherzustellen, dass die shader kompiliert irgendwie
- Ja, es funktioniert! Dies ist zwar nicht dokumentiert, in glutInitDisplayMode ' s manual. Danke, t.niese!
- Hm... wie ändere ich t.niese, Kommentare zu beantworten?
- Ich erstelle eine Antwort aus der es später. Ich schrieb es als Kommentar, denn es war mehr raten durch Erfahrung dann wissen, ob es wirklich funktioniert 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
MacOS verwendet Legacy-Profil als Standard für alle erstellten OpenGL-Kontext. Dafür standardmäßig nur OpenGL bis zu 2.1 und GLSL bis zu 1.20 unterstützt wird.
Mit OpenGL 3.2+ Sie wechseln müssen, um die Core Profile. Die Namensgebung ist da ein bisschen verwirrend, weil es die stats nur 3.2 Kern-Profil, aber eigentlich ist dies 3.2 oder höher (alle OpenGL-Profil, das unterstützt wird durch das system/Treiber, der ist rückwärts kompatibel zu 3.2)
Für die glut (hängt von der version von glut-wenn es funktioniert) den Befehl auf MacOS ist:
Wo
| ...
wäre die andere Option, die Sie übergeben möchtenglutInitDisplayMode
.Über
glew
du normalerweise nicht benötigenglew
auf MacOS durch die Art und Weise, wie der OpenGL-Schicht implementiert wird, ist in MacOS. Sie beschränkt sich auf die OpenGL-Funktionen MacOS bietet/macht. Also entweder die Funktionen sind über die Header von MacOS oder nicht. Es header wäre#include <OpenGL/gl3.h>
wo auch die Namensgebung ist missleading, es bedeutet nicht nur OpenGL 3 ist es das gleiche wie mit dem Kontext.Ich würde empfehlen GLFW es ist eine große cross-Plattform-Bibliothek, ähnlich
GLUT
aber wie ich finde besser zu nutzen.Dort würden Sie wechseln den Zusammenhang wie diesem:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
glutInitDisplayMode( GLUT_3_2_CORE_PROFILE );
arbeiten. Könnten Sie mir bitte sagen, was ich falsch mache. Hier ist mein code. gist.github.com/dhirajbodicherla/11238004glutInitDisplayMode( GLUT_3_2_CORE_PROFILE );
nachglutCreateWindow
diese änderungen haben keine Auswirkungen auf die OpenGL-context des Fensters. So müssen Sie legen Sie es vor dieglutCreateWindow
. Wie Sie bereitsglutInitDisplayMode
in der Zeile 85 (in dercreateGlutWindow
- Funktion), könnten Sie einfach es dort hinzufügen, so dass Sie nicht überschreiben die Einstellungen:glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_3_2_CORE_PROFILE );
GLUT_3_2_CORE_PROFILE
ist schwarzarbeit, aber die anderenglut
- Funktionen arbeiten, dann ist es entweder eine ältere GLUT (GLUT_MACOSX_IMPLEMENTATION < 4
), oder nicht die glut im Lieferumfang von OS X. Wenn diese nicht helfen, dann öffnen Sie bitte eine neue Frage, Blatt-mir hier einen Kommentar mit dem link.Kann es sein, dass dein Treiber nicht unterstützt, die GLSL-version, die Sie benötigen. Ich hatte dieses problem auf einem laptop mit Intel HD-Grafikkarte auf frischen Installation von Ubuntu vor einem halben Jahr.
Verwenden glGetString, um herauszufinden, welche version für Sie verfügbar ist:
http://www.opengl.org/sdk/docs/man/xhtml/glGetString.xml.
Zum Beispiel,
Hier finden Sie über glewExperimental:
http://www.opengl.org/wiki/Extension_Loading_Library