Kinerja grafik vektor versus bitmap atau grafik raster

20

Kadang-kadang saya menggunakan grafik vektor, hanya karena mereka terlihat sedikit lebih bagus dalam beberapa kasus, dan di lain waktu, saya menggunakan bitmap / raster graphics.

Saya bertanya-tanya, apakah ada perbedaan kinerja yang signifikan antara kedua opsi ini?

Ethan Bierlein
sumber
6
Sungguh, itu tergantung pada banyak faktor. NVIDIA menyediakan akselerasi perangkat keras untuk grafik vektor. Pernahkah kamu melihatnya? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Jawaban:

15

Seperti yang dikatakan TheBuzzSaw, itu tergantung pada banyak hal, termasuk implementasi grafik raster vs grafis vektor.

Berikut adalah beberapa metode grafis vektor kinerja tinggi yang dirender menggunakan metode rasterisasi tradisional.

Loop dan Blinn menunjukkan cara membuat grafik vektor kurva bezier kuadratik dengan merender segitiga tunggal, dan menggunakan koordinat tekstur dalam pixel shader untuk mengatakan apakah sebuah pixel berada di atas atau di bawah kurva: http: //www.msr-waypoint. net / en-us / um / people / cloop / LoopBlinn05.pdf

Ide dasarnya adalah bahwa Anda mengatur posisi sudut segitiga Anda menjadi 3 posisi titik kontrol, dan Anda mengatur koordinat tekstur di masing-masing sudut menjadi (0,0), (0,5,0) dan (1,1) masing-masing. Di shader Anda, jika koordinat tekstur interpolasi (x * xy) adalah <0, piksel di bawah kurva, selain itu di atas kurva.

Anda dapat melihat implementasi palsu di shadertoy di sini: https://www.shadertoy.com/view/4tj3Dy

Adapun metode kedua, inilah metode dari Valve, di mana jarak ke suatu bentuk disimpan dalam tekstur, bukan data piksel, yang memungkinkan grafik vektor untuk diambil dengan menggunakan sampling tekstur. Penguraiannya sangat sederhana, dapat diimplementasikan bahkan pada perangkat keras fungsi tetap hanya menggunakan uji alpha! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Untuk memberi Anda gambaran tentang seberapa baik teknik kedua bekerja, gambar kumis 1024x768 ini dihasilkan dari gambar sumber 64x32 yang memiliki saluran warna tunggal! (alias 2KB tidak terkompresi)

masukkan deskripsi gambar di sini

Saya juga menulis beberapa hal tentang itu di blog saya: http://blog.demofox.org/2014/06/30/distance-field-textures/

Berikut ini beberapa contoh kode OpenCL untuk menunjukkan betapa sederhananya:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Kedua teknik ini sangat cepat, dan sedikit mengaburkan garis antara vektor dan grafik raster. Mereka dirender menggunakan teknik rasterisasi, tetapi memiliki sifat pembesaran / penskalaan seperti teknik grafik vektor.

Alan Wolfe
sumber
1
Lihat juga valvesoftware.com/publications/2007/...
internet dibuat dari catz
ya itu teknik yang sangat keren, itu teknik kedua yang saya sebutkan, dan saya tautkan ke pdf yang sama di atas juga.
Alan Wolfe
Aduh, ketinggalan, maaf.
Internet dibuat dari catz
1
Solusi adaptif untuk tepi anti-aliasing bidang jarak dapat ditemukan di sini: essentialmath.com/blog/?p=151 .
Jim Van Verth
8

Mungkin ada.

Kurang jawaban teknis:

Jika Anda sedang membangun situs web atau aplikasi lain di mana Anda tidak ada hubungannya dengan pemrograman grafik maka jawabannya mungkin ya. API yang mendasarinya akan mencoba menerka cara merendernya dan menyimpannya secara efisien. Namun, ketika aplikasi Anda berjalan dan API kadang-kadang menebak dengan tidak benar, ia mungkin harus merender ulang hal-hal dan memengaruhi kinerja.

Lebih teknis:

Ingatlah bahwa kecuali Anda menggunakan salah satu GPU terbaru dan perpustakaan untuk menggambar jalur vektor pada GPU, maka itu semua tekstur bitmap yang dihasilkan oleh GPU.

Saya akan mempertimbangkan kasus umum di mana grafik vektor dirender menjadi tekstur. Di sini kinerjanya akan tergantung pada rantai alat Anda, apakah aplikasi Anda secara dinamis membuat tekstur dari aset vektor, dan apakah gambar dilihat pada berbagai tingkat zoom. Ada dua masalah yang terlibat: sumber daya dan generasi tekstur. Jika Anda hanya menampilkan grafik pada ukuran statis maka saya akan mengatakan tidak ada perbedaan dan mungkin toolchain Anda dapat mengubah aset menjadi grafik bitmap sebelum runtime. Namun, jika mereka ditampilkan dalam berbagai ukuran atau dalam dunia 3D maka Anda akan memerlukan tekstur yang dipetakan yang membutuhkan lebih banyak memori. Mereka akan mengambil banyak memori jika Anda benar-benar ingin melihat kesetiaan mereka 'dari dekat' dengan tekstur yang lebih besar.

Saya harap ini membantu.

ShaneC
sumber
6

Ada beberapa cara rendering grafik vektor. Seperti yang TheBuzzSaw sebutkan, NVIDIA memiliki ekstensi yang dapat membuat jalur umum cukup cepat (tapi tentu saja itu hanya berfungsi pada GPU NVIDIA). Dan Alan Wolfe menyebutkan metode permukaan implisit (bidang Loop-Blinn / jarak), yang mendefinisikan fungsi yang mengatakan apakah Anda di dalam atau di luar bentuk, dan warna piksel berdasarkan fungsi tersebut. Metode lain adalah stensil dan penutup, di mana Anda merender jalur ke buffer stensil dan menggunakan penghitungan genap untuk menentukan apakah jalur tersebut mencakup piksel.

Secara umum, bagaimanapun, tradeoffnya adalah bahwa rendering raster akan lebih cepat, tetapi lebih rentan terhadap aliasing (bahkan medan jarak memecah pada skala rendah dan tinggi). Path rendering membutuhkan banyak pengaturan tetapi secara teori dapat ditingkatkan ke resolusi apa pun.

Jim Van Verth
sumber