首页  >  文章  >  后端开发  >  为什么我的 OpenGL 三角形渲染在 Go 中不行,但在 C 中却可以?

为什么我的 OpenGL 三角形渲染在 Go 中不行,但在 C 中却可以?

Barbara Streisand
Barbara Streisand原创
2024-10-26 04:07:02610浏览

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

OpenGL 顶点缓冲区未在 Go 中渲染三角形

尽管按照教程中的说明进行操作,用户还是遇到了 Go 版本失败的问题显示一个三角形,而其 C 对应部分成功显示。这种差异归因于为 vertexAttrib.AttribPointer() 方法提供参数时存在潜在差异。

在 Go 代码中,以下参数传递给该方法:

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

但是,在 C 代码中,使用一组不同的参数调用等效方法:

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

与数组缓冲区偏移量相对应的参数在 Go 代码中不存在,这一点很明显。此参数指定从缓冲区开头到给定属性的顶点数据开头的偏移量(以字节为单位)。在 Go 代码中省略此参数,可能无法正确检索顶点数据。

要解决此问题,应使用 banthar 绑定的工作分支,并将以下参数传递给 vertexAttrib .AttribPointer() 方法:

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

另外,发送到服务器的数据要乘以4来表示代表数据的字节数。例如,如果数据被描述为:

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

,则应将其用作:

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

以上是为什么我的 OpenGL 三角形渲染在 Go 中不行,但在 C 中却可以?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn