Kubus yang ingin saya gambar:

Kubus di atas cukup mudah dibuat di OpenGL dengan fungsi glPolygonMode(GL_FRONT_AND_BACK, GL_LINE), tetapi diketahui bahwa OpenGL ES tidak menyertakan fungsi yang ingin saya gunakan. Singkatnya, saya tidak ingin menggambar kubus seperti ini:

Saya ingin mengucapkan terima kasih kepada orang-orang yang dapat memberikan bantuan.

======================= Setidaknya perbarui gambar ======================= =====

Tepi belakang sedikit lebih tipis dari tepi depan. Apakah ada solusi untuk mengatasi masalah ini?

Kode saat ini:

    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDisable(GLES20.GL_POLYGON_OFFSET_FILL);
    // Draw edge
    GLES20.glDrawElements(GLES20.GL_LINES, lineIndices.length,
            GLES20.GL_UNSIGNED_SHORT, lineIndexBuffer);

    GLES20.glEnable(GLES20.GL_POLYGON_OFFSET_FILL);
    GLES20.glPolygonOffset(1.0f, 1.0f);
    // Apply background color and draw faces
    GLES20.glUniform4fv(mColorHandle, 1, faceColor, 0);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, triangleIndices.length,
            GLES20.GL_UNSIGNED_SHORT, triangleIndexBuffer);
4
Blaise Wang 1 Juni 2015, 09:33
Mengapa tidak langsung menarik garis? Cukup gunakan GL_LINES untuk tipe primitif.
 – 
Reto Koradi
2 Juni 2015, 07:05
Karena saya ingin menggambar model 3D, dan kubus akan memiliki sudut pandang yang berbeda.
 – 
Blaise Wang
2 Juni 2015, 07:47
Bahkan jika Anda menggunakan GL_LINES, Anda dapat melihatnya dari semua sudut, dan itu juga merupakan model 3d.
 – 
VivekParamasivam
3 Juni 2015, 11:47

1 menjawab

Jawaban Terbaik

Berikut adalah trik standar (dengan asumsi buffer kedalaman diaktifkan):

  1. Gambar tepi jala (garis)
  2. Isi poligon jala dengan warna latar belakang (untuk menutupi garis tersembunyi)

Karena tepi jala dan permukaan jala akan memiliki nilai-z yang sama saat bertemu, Anda perlu menyelesaikan masalah z-fighting. Cara paling sederhana menggunakan offset poligon sehingga ujung-ujungnya "melayang" sedikit "di atas" poligon menghadap:

gl.disable(gl.POLYGON_OFFSET_FILL)
/* draw polygon edges */
gl.enable(gl.POLYGON_OFFSET_FILL);
gl.polygonOffset(1.0, 1.0);
/* fill polygons in background color */

Berikut ini adalah wireframe wineglass yang mengilustrasikan masalah z-fighting:

enter image description here

Di sini saya memecahkan masalah z-fighting menggunakan offset poligon:

enter image description here

3
wcochran 2 Juni 2015, 21:01
Kita harus mengubah judul menjadi "Bagaimana cara menggambar wireframe mesh dengan garis tersembunyi dihapus di OpenGL ES?" Dan jika Anda menyukai jawabannya, Anda dapat meningkatkannya :)
 – 
wcochran
3 Juni 2015, 18:53
Ketika saya mencoba solusi Anda untuk masalah menggambar kubus. Saya menemukan itu berhasil, tetapi Anda dapat melihat tepi belakang lebih tipis daripada tepi depan dalam gambar paling sedikit yang saya posting. Apakah Anda punya solusi untuk memecahkan masalah baru.
 – 
Blaise Wang
3 Juni 2015, 19:03
Saya berasumsi Anda menggunakan glLineWidth(w) dengan w > 1?
 – 
wcochran
3 Juni 2015, 19:07
Ya. Apakah saya perlu menggambar model yang lebih kompleks untuk menyelesaikannya? @wcochran
 – 
Blaise Wang
3 Juni 2015, 19:10
Apakah Anda juga menggunakan glEnable(GL_LINE_SMOOTH)? Ada kemungkinan bahwa poligon offset perlu lebih besar (misalnya, gl.polygonOffset(1.0, 2.0)) karena poligon yang diisi menutupi sebagian garis.
 – 
wcochran
3 Juni 2015, 19:19