Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Perenderan Segitiga OpenGL Saya Tidak dalam Go, Tetapi Ia Berfungsi dalam C?

Mengapa Perenderan Segitiga OpenGL Saya Tidak dalam Go, Tetapi Ia Berfungsi dalam C?

Barbara Streisand
Barbara Streisandasal
2024-10-26 04:07:02610semak imbas

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

OpenGL Vertex Buffer Not Rendering Triangle in Go

Walaupun mengikut arahan daripada tutorial, pengguna telah menghadapi masalah apabila versi Go gagal untuk memaparkan segi tiga manakala rakan sejawatannya C berjaya melakukannya. Percanggahan ini dikaitkan dengan potensi percanggahan dalam menyediakan argumen kepada kaedah vertexAttrib.AttribPointer().

Dalam kod Go, argumen berikut dihantar kepada kaedah:

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

Walau bagaimanapun , dalam kod C, kaedah yang setara dipanggil dengan set hujah yang berbeza:

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

Argumen yang sepadan dengan ofset penimbal tatasusunan adalah mudah dilihat dengan ketiadaannya dalam kod Go. Argumen ini menentukan offset dalam bait dari permulaan penimbal hingga permulaan data puncak untuk atribut tertentu. Dengan meninggalkan hujah ini dalam kod Go, data bucu mungkin tidak dapat diambil dengan betul.

Untuk menyelesaikan isu ini, cabang kerja pengikatan banthar hendaklah digunakan dan hujah berikut hendaklah dihantar ke vertexAttrib Kaedah .AttribPointer():

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

Selain itu, data yang dihantar ke pelayan hendaklah didarabkan dengan 4 untuk mewakili bilangan bait yang mewakili data. Sebagai contoh, jika data diterangkan sebagai:

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

ia hendaklah digunakan sebagai:

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

Atas ialah kandungan terperinci Mengapa Perenderan Segitiga OpenGL Saya Tidak dalam Go, Tetapi Ia Berfungsi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn