Maison >développement back-end >Golang >Pourquoi mon triangle OpenGL ne s'affiche-t-il pas en Go, mais il fonctionne en C ?

Pourquoi mon triangle OpenGL ne s'affiche-t-il pas en Go, mais il fonctionne en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 04:07:02686parcourir

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

Le tampon de vertex OpenGL ne rend pas le triangle dans Go

Malgré le fait d'avoir suivi les instructions d'un didacticiel, les utilisateurs ont rencontré un problème d'échec de la version Go. pour afficher un triangle alors que son homologue C le fait avec succès. Cet écart est attribué à un écart potentiel dans la fourniture des arguments à la méthode vertexAttrib.AttribPointer().

Dans le code Go, les arguments suivants sont transmis à la méthode :

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

Cependant , dans le code C, la méthode équivalente est appelée avec un ensemble d'arguments différent :

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

L'argument correspondant au décalage du tampon du tableau brille par son absence dans le code Go. Cet argument spécifie le décalage en octets entre le début du tampon et le début des données de sommet pour un attribut donné. En omettant cet argument dans le code Go, les données du sommet risquent de ne pas être correctement récupérées.

Pour résoudre le problème, la branche work des liaisons banthar doit être utilisée et les arguments suivants doivent être transmis au vertexAttrib Méthode .AttribPointer() :

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

De plus, les données envoyées au serveur doivent être multipliées par 4 pour représenter le nombre d'octets représentant les données. Par exemple, si les données étaient décrites comme :

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

elles doivent être utilisées comme :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn