Ich entwickle mein Spiel die meiste Zeit unter ArchLinux. Ich habe vor kurzem beschlossen, es auf dem Ubuntu 16.04 zu versuchen. Die Situation, auf die ich gestoßen bin, war wirklich seltsam:

  1. Nein glGetError() s überhaupt.
  2. Keine Fehler, Warnungen, irgendetwas Schlimmes in der gl-Debug-Ausgabe.
  3. Alle Behauptungen, die ich für alle schlechten Situationen gemacht habe, wurden nicht ausgelöst.
  4. glClear hat die Puffer I erfolgreich gelöscht angegeben, aber:
  5. glDraw* hat nichts gezeichnet.

Zum Glück habe ich eine Lösung gefunden , das glViewport setzen sollte. Ich verstehe jedoch nicht ganz, warum es zum Zeichnen in Ubuntu notwendig ist, aber nicht in ArchLinux? Der Unterschied besteht auch zwischen Grafikadaptern: Unter Archlinux verwende ich NVIDIA 1060, unter Ubuntu verwende ich integrierte HD Graphics P530 (Skylake GT 2) ).

Wenn es wichtig ist, verwende ich SDL2 mit opengl 4.4.

Kommentare

  • Es ' ist wichtig, damit Sie erkennen, dass das Betriebssystem hier nicht relevant ist. OpenGL wird von Ihrem GPU-Anbieter in dessen Treibern implementiert. Die wichtigsten Faktoren sind also Ihre GPUs und deren Treiber. Wo das Betriebssystem interessant sein könnte, ist Wenn Ihr GPU-Anbieter unterschiedliche Codebasen für unterschiedliche Betriebssysteme hat, andernfalls ' keine nützlichen Informationen sind.
  • @MaximusMinimus Dies könnte die Antwort auf die Frage sein.

Antwort

Sie haben bereits zwei gute Antworten, aber für einen Anfänger sind sie möglicherweise schwer zu verstehen, also ich „Ich werde Ihnen sagen, warum wir wirklich -Funktion.

Beim typischen Rendern scheint es keinen Sinn zu haben – Sie erstellen einfach ein Fenster oder ein Renderziel und zeichnen darauf, oder? Ich würde sagen, dass 95 +% der Apps so funktionieren.

Aber sagen wir, Sie schreiben eine App wie 3DS MAX, bei der Ihr Fenster in 4 verschiedene Renderings aufgeteilt ist. Sie erinnern sich an Ihre Die aktuelle geteilte Position und Sie verwalten Mausereignisse. Wenn Sie also mit der Maus über die geteilte Leiste fahren, können Sie den Mauszeiger auf die Größe einer ändern usw. Wenn Sie die geteilte Leiste ziehen, merken Sie sich die neue Position und so weiter.

Wenn Sie Ihre 3D-Ansichten rendern möchten, rufen Sie glViewport mit der Position und Größe Ihres ersten 3D-Unterfensters auf und führen typische GL-Befehle zum Zeichnen aus. OpenGL skaliert das Rendering automatisch so, dass es in das angegebene Ansichtsfenster passt. Sie tun dasselbe für das Rest Ihrer Ansichtsfenster und am Ende erhalten Sie ein Fenster mit wenigen verschiedenen Renderings, jedes mit seinen eigenen Parametern. Auf diese Weise können Sie so viele verschiedene Renderings auf einem einzelnen Fenster / Rendering-Ziel haben, wie Sie möchten.

Warum hat es auf einem Computer nicht funktioniert?

GPUs und ihre Treiber haben viele Implementierungsdetails und Unterschiede, sodass Sie sich im Allgemeinen an solche Probleme gewöhnen müssen. Ein einfaches Beispiel: Im GLSL-Shader können Sie einen 2D-Nullvektor wie folgt erstellen: vec2(0.0,0.0) Sie können auch versuchen, einen Wert zu schreiben: vec2(0.0) und mit diesem Code behandeln einige Treiber ihn als vorherige Version, während andere Fehler zurückgeben und nichts rendern. Denken Sie daran, dass sich Treiber von zwei Anbietern stärker unterscheiden als zwei Versionen desselben Treibers. Daher ist es eine gute Idee, Ihren Code auf nVidia-, ATI- und Intel-GPUs zu testen. In diesem Fall vermute ich, dass dies bei nVidia-Treibern der Fall ist Legen Sie den Vieport nicht selbst fest, sondern gehen davon aus, dass Sie das gesamte Renderziel verwenden möchten, während Intel-Treiber dies nicht tun.

Antwort

glViewport zeigt opengl, wie die NDC-Koordinaten den Framebuffer-Koordinaten zugeordnet werden.

Standardmäßig ist die volle Größe des Bildschirmpuffers eingestellt. Sie müssen ihn also nur im Fenster aufrufen wird in der Größe geändert oder Sie möchten es tatsächlich ändern.

Kommentare

  • Oder beim Rendern in einen Framebuffer, vorausgesetzt, die Größe des Fensters ist unterschiedlich.

Antwort

glViewport gibt die affine Transformation von xx und yy von normalisierten Gerätekoordinaten zu Fensterkoordinaten an. Let (xnd , ynd) xndynd normalisierte Gerätekoordinate inates. Dann werden die Fensterkoordinaten (xw, yw) xwyw wie folgt berechnet:

  • „xw = (xnd + 1) (Breite2) + xxw = xnd + 1⁢Breite2 + x“
  • „yw = (ynd + 1) (height2) + yyw = ynd + 1⁢height2 + y“

Breite und Höhe des Ansichtsfensters werden stillschweigend auf einen Bereich geklemmt, der davon abhängt die Umsetzung. Um diesen Bereich abzufragen, rufen Sie glGet mit dem Argument „GL_MAX_VIEWPORT_DIMS“ auf.

Die Parameter x und y geben die untere linke Ecke des Ansichtsfensters in Pixel an, während width und height die Breite und Höhe des Ansichtsfensters

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.