Gambar kontur di sekitar objek di OpenGL

8

Saya perlu menggambar kontur di sekitar objek 2d dalam ruang 3d. Saya mencoba menggambar garis di sekitar objek (+ poin untuk mengisi celah), tetapi karena lebar garis, beberapa bagian darinya (~ 50%) menutupi objek. Saya mencoba menggunakan penyangga stensil, untuk menghilangkan masalah ini, tetapi saya mendapatkan sth seperti ini (kontur berwarna hijau):

http://goo.gl/OI5uc (maaf saya tidak dapat mengirim gambar, karena reputasi saya)

Anda dapat melihat (di mana panah menunjuk), bahwa beberapa bagian garis berada di belakang objek, dan beberapa di atas. Ini berubah ketika saya memindahkan kamera, tetapi selalu ada beberapa bagian, yang menutupinya. Berikut adalah kode, yang saya gunakan untuk menggambar objek:

    glColorMask(1,1,1,1);
    std::list<CObjectOnScene*>::iterator objIter=ptr->objects.begin(),objEnd=ptr->objects.end();
    int countStencilBit=1;
    while(objIter!=objEnd)
    {
        glColorMask(1,1,1,1);
        glStencilFunc(GL_ALWAYS,countStencilBit,countStencilBit);
        glStencilOp(GL_REPLACE,GL_KEEP,GL_REPLACE );
        (*objIter)->DrawYourVertices();

        glStencilFunc(GL_NOTEQUAL,countStencilBit,countStencilBit);
        glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
        (*objIter)->DrawYourBorder();

        ++objIter;
        ++countStencilBit;
    }

Saya sudah mencoba berbagai pengaturan buffer stensil, tetapi saya selalu mendapatkan sth seperti itu. Inilah pertanyaannya: 1. Apakah saya salah mengatur penyangga stensil?

2. Apakah ada cara sederhana lain untuk membuat kontur pada objek seperti itu?

Terima kasih sebelumnya.

EDIT:

1. Saya tidak memiliki objek normal.

2. Objek bisa cekung.

3. Saya tidak bisa menggunakan shader (lihat alasannya di bawah).

therealszaka
sumber
Anda dapat memeriksa 'toon' atau shading sel, di mana ada kontur yang digambar di sekitar objek. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell
Kasusnya adalah, saya tidak bisa menggunakan shader dalam proyek ini ...
therealszaka
@ Macekp Mengapa Anda tidak bisa menggunakan shader? Apakah ini pekerjaan rumah?
Jonathan Connell
Aplikasi ini harus bekerja pada banyak komputer, tidak selalu yang terbaru (itu 1 poin) .2. Ini bukan permainan, ini adalah aplikasi dengan grafik sebagai bagian dari itu + itu harus bekerja di mac, win, linux.
therealszaka
1
Mungkin seharusnya telah diposting di SO jika bukan karena GameDev dan Anda harus memberikan informasi sebanyak mungkin jika Anda ingin pertanyaan Anda dijawab.
Jonathan Connell

Jawaban:

12
  • Gambar seluruh adegan Anda, kecuali objek yang disorot.
  • Gambar objek yang ingin Anda sorot, dalam warna murni, disortir dari belakang ke depan, dan dengan skala kecil diterapkan (1,05f - 1.1f).
  • Gambarlah objek terakhir, sekali lagi, dari belakang ke depan.

Untuk tambahan eye-candy, cobalah menggambar pass kontur ke target render terpisah dan menerapkan blur kecil, lalu gabungkan tekstur ini dengan adegan terakhir Anda menggunakan nilai Z yang sesuai.

r2d2rigo
sumber
Ini adalah trik Barba yang hebat!
FxIII
Ini adalah trik lama yang mereka gunakan untuk garis besar ketika pipa gfx masih diperbaiki.
Jonathan Connell
2
Itu tidak akan berfungsi untuk objek cekung
therealszaka
@ Maciekp Pertanyaan Anda adalah tentang objek 2D (pesawat) dalam ruang 3D, di mana cekung masuk ke dalamnya? Hanya skala sepanjang dua sumbu! = Ke arah wajah.
Jonathan Connell
Ini akan berfungsi untuk objek cekung jika Anda membalikkan normals (Anda harus mengaktifkan face culling) saat menggambar kontur.
r2d2rigo
0

Saya akan melakukan ini seperti itu:

  • Mengurutkan objek dalam urutan depan-belakang (jarak dari kamera)

  • Gambar batas objek (sebagai garis dan titik) dengan dinonaktifkan GL_DEPTH_TEST

  • Draw objek dengan diaktifkan GL_DEPTH_TEST

  • Lakukan dua langkah terakhir untuk setiap objek

Saya akan mencoba melakukan ini seperti itu, tetapi jika ada yang punya ide solusi yang lebih baik untuk masalah ini (MIND CONCAVE OBJECTS, TOLONG) - jangan ragu untuk berbagi dengan kami.

PS. Saya tidak sepenuhnya puas dengan kondisi OpenGL yang mengubah solusi sehingga seringkali dapat berbahaya. Tetapi jika tidak ada yang bisa membantu saya dengan pengaturan buffer stensil, saya kira itu satu-satunya cara bagi saya.

therealszaka
sumber