Heim >Backend-Entwicklung >Golang >Warum wird mein OpenGL-Dreieck in Go nicht gerendert, aber in C funktioniert es?

Warum wird mein OpenGL-Dreieck in Go nicht gerendert, aber in C funktioniert es?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 04:07:02692Durchsuche

Why Isn't My OpenGL Triangle Rendering in Go, But It Works in C?

OpenGL-Vertex-Puffer rendert kein Dreieck in Go

Obwohl Benutzer die Anweisungen aus einem Tutorial befolgt haben, sind Benutzer auf ein Problem gestoßen, bei dem die Go-Version fehlschlägt um ein Dreieck anzuzeigen, während sein C-Gegenstück dies erfolgreich tut. Diese Diskrepanz wird auf eine mögliche Diskrepanz bei der Bereitstellung von Argumenten für die vertexAttrib.AttribPointer()-Methode zurückgeführt.

Im Go-Code werden die folgenden Argumente an die Methode übergeben:

<code class="go">vertexAttrib.AttribPointer(
  3,   // Size
  0,   // Normalized?
  0,   // Stride
  nil,  // Array buffer offset
)</code>

Allerdings , im C-Code wird die entsprechende Methode mit einem anderen Satz von Argumenten aufgerufen:

<code class="c">glVertexAttribPointer(
  0,
  3,   // Size
  GL_FLOAT,   // Type
  GL_FALSE,  // Normalized?
  0,   // Stride
  (void*)0   // Array buffer offset
)</code>

Das Argument, das dem Array-Puffer-Offset entspricht, fällt durch seine Abwesenheit im Go-Code auf. Dieses Argument gibt den Offset in Bytes vom Anfang des Puffers bis zum Anfang der Scheitelpunktdaten für ein bestimmtes Attribut an. Wenn Sie dieses Argument im Go-Code weglassen, werden die Vertex-Daten möglicherweise nicht ordnungsgemäß abgerufen.

Um das Problem zu beheben, sollte der Arbeitszweig der Banthar-Bindungen verwendet werden und die folgenden Argumente sollten an vertexAttrib übergeben werden .AttribPointer()-Methode:

<code class="go">vertexAttrib.AttribPointer(
  3,     // Size
  gl.FLOAT,   // Type
  false,  // Normalized?
  0,     // Stride
  nil    // Array buffer offset
)</code>

Zusätzlich sollten die an den Server gesendeten Daten mit 4 multipliziert werden, um die Anzahl der Bytes darzustellen, die die Daten darstellen. Wenn die Daten beispielsweise wie folgt beschrieben wurden:

<code class="go">data := []float32{0, 1, 0, -1, -1, 0, 1, -1, 0}</code>

sollten sie wie folgt verwendet werden:

<code class="go">gl.BufferData(gl.ARRAY_BUFFER, len(data) * 4, data, gl.STATIC_DRAW)</code>

Das obige ist der detaillierte Inhalt vonWarum wird mein OpenGL-Dreieck in Go nicht gerendert, aber in C funktioniert es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn