Saya tahu bahwa ini lebih efisien daripada uji stensil, tetapi apakah saya benar dengan asumsi bahwa fungsi yang sama dapat dicapai dengan menggunakan transformasi proyeksi dengan viewport?
Mereka lebih saling melengkapi daripada alternatif satu sama lain. Anda hampir selalu ingin mengatur persegi panjang gunting ke nilai yang sama dengan viewport.
glViewport () menentukan transformasi dari ruang proyeksi yang dinormalisasi ke ruang layar. Poligon terpotong ke tepi ruang proyeksi, tetapi operasi draw lainnya seperti glClear () tidak. Jadi, Anda menggunakan glViewport () untuk menentukan lokasi dan ukuran wilayah viewport ruang layar, tetapi rasterizer kadang-kadang masih dapat membuat piksel di luar wilayah itu.
Di situlah gunting masuk. GlScissor () mendefinisikan persegi panjang ruang layar di mana tidak ada yang ditarik (jika tes gunting diaktifkan).
Jadi misalnya, kode berikut ini akan menghapus seluruh layar, meskipun viewport diatur ke sebagian kecil dari jendela yang lebih besar:
glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);
Menambahkan glScissor () dan mengaktifkan tes gunting (yang dinonaktifkan secara default) membatasi yang jelas.
glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
Kadang-kadang Anda menemukan implementasi yang secara otomatis gunting ke wilayah viewport, tetapi itu melanggar spesifikasi GL.
Selain itu, persegi panjang gunting dapat digunakan untuk sementara waktu membatasi gambar menjadi sub-persegi panjang viewport, untuk efek khusus, elemen UI, dll.
Viewport
klip perhitungan vertex. Jika Anda menggambar garis dengan ketebalan garis> 1 atau titik dengangl_PointSize
>> Anda juga akan menggambar di luar viewport.Mereka beroperasi di dua bagian yang sama sekali berbeda dari pipa grafis.
glViewport sebenarnya menentukan transformasi, dan itu adalah transformasi yang terjadi setelah vertex shader tetapi sebelum fragmen shader. Jika itu membantu untuk melihat di mana itu cocok secara konseptual, berpikir dalam hal itu menjadi bagian dari transformasi yang digunakan untuk mendapatkan data verteks Anda dari ruang dunia ke ruang layar (yaitu itu relatif terkait erat dengan modelview dan proyeksi).
Tes gunting terjadi setelah shader fragmen, bersama dengan semua operasi per-fragmen lain yang terjadi pada waktu itu, seperti pencampuran, kedalaman / stensil, dll. Ketika sebuah fragmen diuji dengan uji gunting, maka itu telah melalui transformasi viewport.
Ya, uji gunting dapat lebih cepat menggunakan stensil karena ini adalah penerimaan / penolakan sederhana berdasarkan pada papan spasi layar fragmen, sedangkan stensil perlu dibandingkan dengan nilai saat ini dalam buffer stensil, kemungkinan kenaikan atau penurunan nilai saat ini, juga mempertimbangkan hasil tes kedalaman, dan sebagainya.
Jadi menyatukan semua itu Anda bisa melihat mengapa tes gunting ada. Ini memberi Anda kemampuan untuk membatasi ops per-fragmen ke bagian persegi panjang layar, tetapi tanpa benar-benar mengubah transformasi viewport saat ini.
sumber
Saya suka hal-hal semacam ini dijelaskan secara visual.
Di OnpenGL kami memiliki koordinat 2D yang bergerak dari -1 ke +1 untuk sumbu X dan Y.
Maka gambar ini perlu dipetakan ke koordinat jendela.
Mari kita bayangkan bahwa kita memiliki jendela yang memiliki warna gelap sebagai latar belakang, dan kita memiliki putih sebagai warna bening.
Kasing yang paling umum adalah memiliki viewport dan gunting menutupi seluruh layar.
Tapi kita bisa mengaturnya menjadi wilayah layar yang lebih kecil.
Wilayah ini bisa berbeda. Dalam contoh berikut viewport mencakup seluruh layar, sedangkan gunting adalah kotak yang lebih kecil.
Dan dalam hal ini gunting terakhir menutupi seluruh layar, sedangkan viewport adalah kotak yang lebih kecil. Perhatikan bahwa
glClear
mempengaruhi seluruh layar, karena itu ditentukan oleh wilayah gunting.sumber
glScissors menyelesaikan kliping geometri pada sebagian layar.
Anda akan menginginkan ini, misalnya, jika Anda merender kotak GUI yang memiliki teks yang bergulir mulus di dalamnya. Anda ingin memotong semua geometri di luar bagian layar yang ditutupi oleh GUI, tetapi simpan sebagian teks atau poligon yang masih di dalam.
glViewport memetakan koordinat proyeksi ke koordinat perangkat, tetapi tidak memotong.
glStencil digunakan untuk menutupi piksel individu dalam pola yang lebih kompleks, seperti bentuk yang tidak beraturan. Dengan demikian, glScissors lebih cepat.
sumber
glScissor lebih sederhana daripada transformasi proyeksi dengan viewport.
Tes glScissor menentukan piksel apa yang harus diubah saat rendering, sementara glViewport mengubah cara gl harus memetakan dari koordinat perangkat ke koordinat jendela.
Lalu apa bedanya dengan mengatur viewport ke persegi panjang yang ingin Anda render dan menyesuaikan matriks proyeksi untuk membatalkan penskalaan yang dilakukan oleh viewport.
sumber