ホームページ  >  記事  >  バックエンド開発  >  OpenGL Triangle が Go ではレンダリングされないのに、C では動作するのはなぜですか?

OpenGL Triangle が 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?

Go で OpenGL 頂点バッファーが三角形をレンダリングしない

チュートリアルの指示に従っているにもかかわらず、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 Triangle が Go ではレンダリングされないのに、C では動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。