Heim >Backend-Entwicklung >Golang >Warum wird mein OpenGL-Dreieck in Go nicht gerendert, aber in C funktioniert es?
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!