Apa itu warna titik?

31

Pertanyaan saya adalah apa yang tertulis dalam judul. Istilah "warna titik" ini banyak muncul. Saya kesulitan memahami ini.

Sebagai contoh:

Bukankah titik sederhana titik pada ruang 3D? Jika demikian, bagaimana suatu titik memiliki warna? Atau apakah "warna" ini berarti sesuatu yang lain?

Ada simpul "Vertex Color" di editor materi engine yang tidak nyata.

Bisakah seseorang menjelaskan pertanyaan saya? Saya tidak dapat menemukan sesuatu yang berguna ketika saya mencari di Google "apa itu warna titik", tetapi dokumentasi yang terlalu teknis untuk saya.

Bora
sumber
2
Dalam geometri, titik hanyalah titik di ruang angkasa. Tetapi untuk rendering 3D Anda ingin segala sesuatunya terlihat bagus, yang mungkin berarti melampirkan lebih banyak informasi ke setiap titik, seperti warna, atau koordinat tekstur, atau bobot kerangka sehingga Anda dapat menggerakkan mesh lebih mudah, atau arah normal untuk digunakan dalam pencahayaan perhitungan.
user253751
3
Saya pikir sebagian besar kebingungan Anda adalah karena seringnya terjadi penyatuan istilah “vertex” dan “position” dalam 3D / grafik. Secara matematis, pernyataan Anda “Bukankah titik sederhana pada ruang 3D?” Benar, tetapi di ranah mesin game & grafik, tidak, posisi adalah titik sederhana dalam ruang 3D; dan simpul (mesh) adalah potongan data yang hampir selalu memiliki posisi, tetapi mungkin juga memiliki koordinat normal, garis singgung, tekstur, warna, dan / atau banyak bagian data lainnya . Vertex mesh sebenarnya hanya sepotong data yang diproses pada tahap rendering vertex.
Slipp D. Thompson

Jawaban:

29

Warna vertex tidak relevan ketika Anda memiliki 3d mesh yang sepenuhnya bertekstur. Tapi itu menjadi menarik ketika Anda memiliki mesh yang tidak bertekstur tetapi berwarna. Dalam hal ini Anda menetapkan warna untuk setiap titik. Shader kemudian akan mewarnai setiap piksel poligon dengan menginterpolasi antara warna dari tiga simpul.

Warna vertex kadang-kadang juga bisa menarik dalam kombinasi dengan tekstur. Saat Anda ingin menggunakan algoritme bayangan seperti Gouraud Shading , Anda cukup menghitung intensitas cahaya pada setiap titik, menetapkan warna terang ke titik sebagai warna titik, dan ketika Anda membuat tekstur, Anda menggandakan nilai warna setiap piksel tekstur dengan warna interpolasi. Ini memungkinkan Anda menghitung sumber cahaya di vertex shader alih-alih pixel shader. Ini biasanya jauh lebih cepat, karena vertex shader biasanya dieksekusi jauh lebih jarang.

Philipp
sumber
2
btw, warna titik digunakan dalam beberapa game yang lebih tua yang tidak memiliki petir / bayangan dinamis. Misalnya Richard Burns Rally dari 2004 menggunakan warna titik untuk membuat tekstur tampak berbeda dan menerapkan bayangan.
martin
The Witness adalah game terbaru yang banyak menggunakan warna dan light vertex, tetapi tidak banyak tekstur.
user253751
@ Pilip "karena vertex shader biasanya dieksekusi jauh lebih jarang" Kenapa? Bukankah vertex shader merupakan bagian dari render pipeline dan dengan demikian mengeksekusi setiap frame? Kenapa lebih jarang? Bukankah "warna" vertex harus dihitung setiap frame juga, sama seperti jika itu ada di pixel shader?
Nikos
1
@ Nikos Vertikal shader disebut sekali per titik. Pixer shader kemudian disebut sekali per pixel. Poligon dengan 3 simpul biasanya menghasilkan lebih dari 3 piksel pada layar (jika gim Anda menghitung banyak poligon yang mencakup kurang dari 3 piksel, Anda mungkin ingin melihat apa yang dapat Anda lakukan mengenai pemusnahan dan LOD).
Philipp
25

Secara teori, Vertex Color memungkinkan untuk mewarnai model tanpa harus repot dengan tekstur. Ini sangat umum di CAD.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Dalam praktiknya, ini hanya satu slot lagi yang dapat Anda gunakan untuk mendorong data ke dalam vertex, yang kemudian Anda gunakan dalam vertex shader untuk melakukan hal-hal gila .

"Bukankah titik sederhana titik pada ruang 3D?"

Itulah yang saya pikirkan, ketika saya mulai dengan 3D. Saya belajar dengan cepat bahwa saya salah .

Anda dapat menganggap sebuah simpul sebagai gumpalan data yang membentuk sudut segitiga yang ingin Anda lukis di layar (dan bukan bagian "sudut" maupun bagian "segitiga", "cat", atau "layar" selalu benar ). Posisi adalah satu-opsional - aspek gumpalan data yang kita sebut Vertex.

Ada banyak yang bisa Anda lakukan dengan melampirkan data tambahan ke vertex. Contoh paling terkenal adalah Anda dapat menambahkan koordinat uv untuk menggambar tekstur pada segitiga itu. Anda (biasanya) tidak dapat memutuskan bagian mana dari tekstur untuk menggambar pada segitiga jika Anda hanya memiliki satu titik - Anda perlu koordinat tekstur juga.

Contoh standar lain dari apa yang ada di dalam gumpalan itu adalah normal, dan garis singgung. Yang penting adalah semuanya opsional, termasuk posisinya. Vertex Color hanyalah salah satu dari input opsional ini yang dapat Anda gunakan atau penyalahgunaan untuk membuat gambar yang cantik di layar.

Peter
sumber
2
".. sebagai gumpalan data yang membentuk tepi segitiga" bahkan itu belum tentu. Vertex dapat diterjemahkan sebagai poin dengan baik.
Kromster berkata mendukung Monica
3
Untuk beberapa contoh hebat efek shader yang dapat Anda capai menggunakan warna titik, saya sangat merekomendasikan untuk memeriksa pembicaraan GDC Natalie Burke dari tahun lalu, "Animating With Math" (video hanya untuk anggota saat ini, tetapi slide gratis di sini ) . Dia menunjukkan berapa banyak animasi di gigi Destiny, rambut karakter dan kain, dan bahkan bagian dari musuh dan lingkungan mereka dicapai dengan menggunakan vertex shaders, dibentuk dan dikendalikan dengan saluran warna vertex.
DMGregory
5
Saya berpendapat, bahwa itu bukan warna titik, tetapi atribut titik ditampilkan sebagai warna untuk persepsi yang lebih mudah.
Kromster berkata mendukung Monica
Ada beberapa kegunaan serupa dari vertex shaders dalam pembicaraan tentang FortNite ini , meskipun jika saya ingat dengan benar, saya pikir mereka lebih banyak menggunakan saluran UV simpul daripada saluran warna.
DMGregory
3
Sebenarnya dari sudut pandang berbasis geometri / matematika sebuah titik hanyalah titik di luar angkasa. 'Warna titik' adalah atribut yang diterapkan pada titik oleh 'ide' titik yang digunakan oleh GPU. Itu sama dengan lingkaran yang memiliki warna atau tidak. 'Gagasan' geometris / matematis dari suatu lingkaran tidak memiliki warna tetapi 'gagasan' peranti lunak dari suatu lingkaran mengaitkan suatu warna dengan lingkaran tersebut. Jadi argumen @ Kromster secara teknis lebih benar.
Pharap
8

Verteks dapat memiliki warna, ini adalah properti seperti biasanya.

Dalam lingkungan 3d, segitiga diberi warna berdasarkan informasi warna simpulnya. Fragmen terdekat dengan vertex A mendapatkan warna itu, closesr ke vertex B mendapatkan colornof B, dan warna interpolasi antara 2.

Ini bekerja dengan cara yang sama seperti pencahayaan per-simpul

Ini adalah cara mudah untuk menambahkan warna ke model tanpa menggunakan tekstur.

Bálint
sumber
+1 untuk memberi (mudah-mudahan) contoh yang akrab dari atribut simpul serupa lainnya
AC
Masalah dengan warna dan normal vertex adalah bahwa mereka menganggap verteks adalah bagian dari mesh (perkiraan permukaan melengkung). Jika Anda ingin tepi yang tajam atau wajah berwarna berbeda (seperti pada kubus), Anda perlu simpul terpisah untuk setiap wajah, yang sangat meningkatkan penggunaan memori (dan memperlambat rendering).
amI
@ aml Anda dapat menggunakan "operator" flat dalam glsl untuk membuat bayang-bayang tampak datar. Ini tidak sepenuhnya sama, tetapi berfungsi.
Bálint
atribut interpolasi lainnya: koordinat tekstur dan z-buffer! kami memiliki vertex shader menghitung beberapa data untuk masing-masing dari 3 simpul segitiga, yang diinterpolasi ketika menggambar segitiga di layar (atau dalam beberapa buffer), dan pixel shader disebut dengan nilai interpolasi untuk setiap piksel yang diambil
user1952009
@aml Tentu saja x2 bukan hambatan. Dan shader geometri dibuat untuk itu, saya katakan (misalnya: mengubah tekstur kedalaman menjadi segitiga )
user1952009
2

Sudah ada jawaban yang solid di sini - Saya hanya ingin berpadu dengan satu lagi cara umum Anda akan melihat warna titik digunakan:

Memvariasikan warna objek (atau atribut lainnya) dalam satu panggilan batch / draw.

Anda akan melihat ini digunakan dalam rendering sistem partikel, teks, dan sprite (biasanya bertingkat).

Bayangkan Anda memiliki emitor partikel yang memunculkan partikel dengan warna awal acak, atau yang memudar menjadi 0 alpha selama masa hidup partikel. Jika kita menggunakan seragam shader untuk mengirim data warna ini, kita perlu menggambar setiap partikel dengan warna yang berbeda dalam panggilan undiannya sendiri, membuat sistem partikel jauh lebih mahal. Sebagai gantinya, kita dapat memanggang warna-warna ini ke dalam data titik untuk partikel-partikel, dan membuat seluruh kumpulan bersama-sama dalam satu panggilan.

Unity tampaknya menggunakan teknik ini untuk variasi warna partikel, serta untuk mewarnai masing-masing karakter dalam TextMesh atau Sprite yang dibuat bersama dalam satu batch.

Saya percaya Anda dapat melakukan sesuatu yang mirip dengan geometri instancing, tetapi saya tidak tahu bagaimana keduanya membandingkan dalam kinerja. Ada kemungkinan bahwa saat ini melakukan jenis tweaking instances melalui warna vertex lebih dari penangguhan untuk mendukung perangkat keras pra-OpenGL 3.1 / DX9 seperti beberapa perangkat mobile, daripada praktik terbaik untuk PC modern. Saya akan menerima komentar dari orang-orang yang telah melakukan lebih banyak penyetelan kinerja dengan batch & instancing untuk membantu menjernihkan apakah teknik ini telah menggantikan warna titik untuk tujuan ini. :)

DMGregory
sumber