OpenGL ist sehr maschinenspezifisch

8

Vor kurzem habe ich OpenGL in C ++ für 3D-Rendering verwendet, aber seltsamerweise scheint es nur auf einigen wenigen Rechnern zu funktionieren. Ich benutze OpenGL 3.0 oder höher (im Moment ist es auf 3.0 gesetzt) ​​mit Vertex-Array-Objekte (nicht sicher, wie es aufgerufen wird, aber die API-Revision, die glBegin, glEnd und dergleichen entfernt).

Bevor ich es auf einem anderen Rechner teste, frage ich immer nach ihren GPU-Treibern, die meisten unterstützen OpenGL 4.2, wenn nicht, stelle ich sicher, dass sie mindestens 3.0 unterstützen. Doch auf einigen Rechnern stürzt meine Anwendung einfach ab oder gibt nichts wieder, OpenGL wirft keine Fehler (Ich überprüfe Fehler mindestens einmal pro Frame). Es funktioniert jedoch einwandfrei auf meiner eigenen Maschine, und in einigen Fällen ist meine Maschine sogar älter als einige Maschinen, auf denen es nicht funktioniert.

Ich habe nur OpenGL selbst und GLEW benutzt, bin aber auf SFML und GLEW umgestiegen, um die Bedienung zu vereinfachen und einige andere Features, die ich mag, OpenGL selbst hat sein Verhalten nicht geändert. Ich habe die Engine, an der ich gearbeitet habe, irgendwann umgeschrieben, um alle GL-Aufrufe zu kapseln und Vertex-Array-Objekte und einige andere Features zu integrieren. Tatsächlich kann ich Ihnen eine Liste aller API-Aufrufe geben, die die Anwendung verwendet. Offensichtlich benutzt es nicht alle von ihnen in der Testanwendung, aber das sind alle Aufrufe, die ich in der Engine verwende (das ist das absolute Minimum, um rendern zu können, also ja, die Engine ist nicht annähernd fertig):

  • glAttachShader
  • glBindAttribLocation
  • glBindBuffer
  • glBindVertexArray
  • glBufferData
  • glBufferSubData
  • glClear
  • glClearColor
  • glClearDepth
  • glCompileShader
  • glCreateProgram
  • glCreateShader
  • glCullFace
  • glDeleteBuffers
  • glDeleteProgramm
  • glDeleteShader
  • glDeleteVertexArrays
  • glDepthFunc
  • glDepthMask
  • glDepthRange
  • glDisableVertexAttribArray
  • glDrawElements
  • glEnable
  • glEnableVertexAttribArray
  • glFrontFace
  • glGenBuffers
  • glGenVertexArrays
  • glGetAttribLage
  • glGetBufferParameteriv
  • glGetBufferSubData
  • glGetError
  • glGetIntegerv
  • glGetProgramInfoLog
  • glGetProgrammiv
  • glGetShaderInfoLog
  • glGetShaderiv
  • glGetShaderSource
  • glGetUniformLocation
  • glisProgramm
  • glIsShader
  • glLinkProgramm
  • glMapBufferRange
  • glPixelStorei
  • glShaderSource
  • glUniform (1i, 1ui, 1f, 2f, 3f, 4f, Matrix3fv, Matrix4fv)
  • glUnmapBuffer
  • glUseProgramm
  • glVertexAttrib (1i, 1ui, 1f, 2f, 3f, 4f)
  • glVertexAttribPointer

Kurz gesagt, der Shader- und ShaderProgramm-Teil ist nichts besonderes, ich habe einige Methoden, um sie zu erstellen / zu kompilieren, einige Attributpositionen vorher festzulegen und schließlich Attribute / Uniformen zu setzen. Die Pufferobjekte sind auch nichts besonderes, Sie können die Puffer schreiben, lesen und zuordnen, im Moment verwende ich nur GL_ARRAY_BUFFER und GL_ELEMENT_ARRAY_BUFFER. Schließlich verwende ich Vertex-Array-Objekte, um tatsächlich Objekte zu rendern, offensichtlich setze ich Attribut-Zeigern, und verkapselte Zeichenaufrufe und Programmverwendung, es verwendet immer indizierte Zeichnung.

Auch habe ich extensiv auf Google und auf Stack-Overflow selbst nach einer Antwort gesucht. Aber alle Probleme haben damit zu tun, dass OpenGL nirgends funktioniert, z. Einige API-Aufrufe wurden nicht nacheinander oder gar nicht aufgerufen. Leider funktioniert keine dieser Antworten für mich, es hat immer an meiner eigenen Maschine und anderen Maschinen gearbeitet, auf die ich direkt zugreifen kann, aber es hat nie funktioniert, wenn ich die Anwendung an jemand anderen sendete, um es auf ihrer Maschine zu testen.

Hoffe, das war spezifisch genug XD

BEARBEITEN, kopiere von unten nach oben

Jeder Test wird entweder auf Windows Vista oder Windows 7 durchgeführt. Ich habe eine OpenGL-Fehlerprüfung für jeden API-Aufruf durchgeführt, und keiner scheint irgendeinen Fehler zu bemerken. Ich bin nicht in der Lage, es auf meiner eigenen Maschine zu reproduzieren, aber nach etwas mehr Verfolgung auf anderen Maschinen habe ich festgestellt, dass es nicht zum Rendern stürzt. Das Setup funktioniert gut, es erstellt alle Puffer und Objekte völlig in Ordnung, aber sobald ich versuche, ein Mesh (VAO) zu rendern, stürzt es ohne Fehler ab (gut, außer .exe funktioniert nicht mehr). Ich vermute die Befehle glUseProgram oder glDrawElements

Über ein Beispiel, außer Sie möchten etwa 10 Klassen durchsuchen, kann ich Ihnen kein kurz Beispiel geben

EDIT, ein kleines bisschen Code, der ein Objekt rendert

Die Mesh-Klasse fügt diese Strukturen dem Objekt hinzu, damit sie weiß, was gezeichnet werden muss:

%Vor%

Oh, übrigens, ein 'Geometrie-Tag' ist nur eine Zeichenkette, unter der mehrere Zeichenaufrufe 'gesetzt' werden können, Paare Definitionen:

%Vor%

Für jeden 'draw' Aufruf gibt es einen String zurück, so dass die Mesh Klasse das entsprechende Material binden kann.

%Vor%

BEARBEITEN, das Gitter ruft alle obigen Methoden auf, um das Objekt tatsächlich zu rendern

Die lockVertexAttributes () stellt nur sicher, dass alle Attributzeiger an den richtigen Vertexpuffer gebunden sind. Die bind-Methode des HardwareProgramms überprüft lediglich, ob die Programme kompiliert sind und ruft glUseProgram

auf %Vor%     
Invalid 01.08.2012, 11:03
quelle

1 Antwort

4

Meine Wette wäre, dass Sie die GL_ELEMENT_ARRAY_BUFFER über Ihren VAO binden.

Ich hatte in der Vergangenheit (vor einigen Jahren) Probleme mit bestimmten Versionen von NVidia-Treibern (ich habe keine Aufzeichnungen darüber, welche Version (en) es hat), wo dies die Anwendung stürzte.

Meine Problemumgehung zu dieser Zeit war, dass VAO GL_ARRAY_BUFFER Binding- und Vertex-Attributindikatoren gesetzt hat, aber ich habe die GL_ELEMENT_ARRAY_BUFFER -Bindung nach der glBindVertexArray explizit neu definiert.

Ich denke, das Problem ist jetzt gelöst, aber einige alte Fahrer können das Problem aufweisen.

Können Sie ein Muster für die Konfiguration von Plattformen sehen, die das Problem haben?

    
rotoglup 01.08.2012, 18:57
quelle

Tags und Links