Apa itu ray tracing dan apakah kita membutuhkannya dalam game? Apa itu Nvidia RTX, bagaimana teknologi ray tracing mengubah grafik dalam game dan mengapa membeli GeForce baru (secara singkat dan disertai contoh).

Langganan
Bergabunglah dengan komunitas “koon.ru”!
Berhubungan dengan:

Selama beberapa tahun terakhir, ray tracing tampaknya telah menjadi "impian nomor satu" di dunia grafis 3D real-time. Ketertarikan terhadap teknologi rendering ini mencapai puncaknya ketika peneliti muda Daniel Pohl mengumumkan proyeknya mengenai teknologi ini pada tahun 2004.

Alasan ketertarikan masyarakat umum terhadap karya ini sebagian besar disebabkan oleh fokus Pohl pada game id Software terkenal Quake III, Quake IV dan franchise penembak Quake Wars 3D. Peneliti menarik banyak perhatian pers, dan para gamer mulai memimpikan masa depan yang cerah ketika game favorit mereka akan dirender menggunakan ray tracing dan menghilangkan rasterisasi.

Intel dengan cepat menarik perhatian pada proyek tersebut, dan perusahaan menemukannya cara yang sempurna untuk membenarkan peningkatan jumlah inti dalam prosesor. Perusahaan dengan cepat meluncurkan program penelitiannya sendiri, dan saat ini Intel tidak pernah melewatkan kesempatan untuk menekankan bahwa ray tracing adalah masa depan game 3D real-time. Tapi benarkah demikian? Realitas teknologi apa yang melatarbelakangi sensasi pemasaran? Apa manfaat sebenarnya dari ray tracing? Bisakah kita mengharapkan ray tracing menggantikan rasterisasi? Kami akan mencoba menjawab pertanyaan-pertanyaan ini.


Klik pada gambar untuk memperbesar.

Prinsip dasar

Ide dasar ray tracing sangat sederhana: untuk setiap piksel pada tampilan, mesin rendering menarik sinar langsung dari mata pengamat (kamera) ke elemen pemandangan yang dirender. Persimpangan pertama digunakan untuk menentukan warna piksel sebagai fungsi dari permukaan elemen yang berpotongan.

Namun hal ini saja tidak cukup untuk menghasilkan pemandangan yang realistis. Penerangan piksel harus ditentukan, yang memerlukan penggambaran sinar sekunder (berlawanan dengan sinar primer, yang menentukan visibilitas berbagai objek yang membentuk pemandangan). Untuk menghitung efek pencahayaan pemandangan, sinar sekunder diambil dari titik perpotongan ke sumber yang berbeda cahaya. Jika sinar-sinar tersebut terhalang oleh suatu benda, maka titik tersebut berada dalam bayangan yang ditimbulkan oleh sumber cahaya yang bersangkutan. Jika tidak, sumber cahaya akan mempengaruhi pencahayaan. Jumlah seluruh sinar sekunder yang mencapai sumber cahaya menentukan kualitas pencahayaan yang mengenai elemen pemandangan kita.

Tapi bukan itu saja. Untuk mencapai rendering yang paling realistis, karakteristik refleksi dan refraksi material harus diperhitungkan. Dengan kata lain, Anda perlu mengetahui berapa banyak cahaya yang dipantulkan pada titik perpotongan berkas utama, serta jumlah cahaya yang melewati material pada titik tersebut. Sekali lagi, sinar refleksi dan bias harus digambar untuk menghitung warna piksel akhir.

Hasilnya, kami mendapatkan beberapa jenis sinar. Sinar primer digunakan untuk menentukan visibilitas suatu objek dan mirip dengan semacam buffer Z yang digunakan dalam rasterisasi. Dan sinar sekunder dibagi menjadi sebagai berikut:

  • sinar bayangan/cahaya;
  • sinar refleksi;
  • sinar bias.

Algoritma penelusuran sinar klasik. Klik pada gambar untuk memperbesar.

Algoritma ray tracing ini merupakan hasil karya Turner Whitted, peneliti yang menemukan algoritma tersebut 30 tahun lalu. Sampai saat itu, algoritma ray tracing hanya bekerja dengan sinar primer. Dan perbaikan yang dilakukan Whitted ternyata menjadi langkah besar menuju realisme dalam rendering adegan.

Jika Anda familiar dengan fisika, Anda mungkin memperhatikan bahwa algoritma ray tracing bekerja “dalam sisi sebaliknya“Dari fenomena yang terjadi di dunia nyata. Bertentangan dengan kepercayaan populer di Abad Pertengahan, mata kita tidak memancarkan sinar cahaya; sebaliknya, mata kita menerima sinar cahaya dari sumber cahaya yang dipantulkan pada berbagai objek di sekitar kita. Pada prinsipnya, ini adalah cara kerja algoritma ray tracing pertama.

Namun kelemahan utama dari algoritma pertama adalah bahwa algoritma tersebut memberikan beban komputasi yang sangat besar. Untuk setiap sumber cahaya, Anda perlu memancarkan ribuan sinar, banyak di antaranya tidak akan mempengaruhi pemandangan yang dirender sama sekali (karena sinar tersebut tidak memotong bidang gambar). Algoritma modern Ray tracing adalah optimasi algoritma yang mendasarinya, menggunakan apa yang disebut reverse ray tracing, karena sinar ditarik ke arah yang berlawanan dari kenyataan.


Algoritma ray tracing asli menghasilkan jumlah yang besar perhitungan yang tidak perlu. Klik pada gambar untuk memperbesar.

Manfaat Penelusuran Sinar

Seperti yang telah Anda lihat, keuntungan utama metode ray tracing adalah kesederhanaan dan keanggunannya. Algoritme ini hanya menggunakan satu objek primitif untuk menampilkan efek yang seringkali memerlukan pendekatan non-sepele dan teknologi stimulasi yang kompleks saat menggunakan metode rasterisasi standar.


Peta lingkungan memberikan perkiraan yang baik untuk mensimulasikan pantulan lingkungan, namun penelusuran sinar bahkan dapat mensimulasikan pantulan mata mobil Luigi di kap mesin. Klik pada gambar untuk memperbesar.

Refleksi adalah salah satu area di mana ray tracing unggul. Hari ini di mesin 3D permainan modern refleksi dihitung menggunakan peta lingkungan. Teknologi ini memberikan perkiraan yang baik terhadap pantulan objek yang terletak “di tak terhingga” atau di lingkungan(seperti namanya), tetapi untuk objek yang letaknya dekat, pendekatan ini menunjukkan keterbatasannya.

Pengembang game balap, khususnya, telah menciptakan trik untuk mensimulasikan pantulan objek di sekitar menggunakan apa yang disebut peta kubus dinamis. Kamera diposisikan setinggi mesin pemain, setelah itu rendering dilakukan ke arah utama. Hasil rendering kemudian disimpan dalam cubemaps, yang digunakan untuk menampilkan refleksi.


Peta kubus dinamis dapat mensimulasikan pantulan objek di sekitar, seperti pesawat terbang di teko. Namun mereka tidak dapat mengatasi pantulan bagian-bagian suatu benda satu sama lain, misalnya semburan teko di badannya. Klik pada gambar untuk memperbesar.

Tentu saja, peta kubus dinamis juga memiliki kekurangan. Menghitung beberapa hasil rendering cukup mahal dalam hal daya komputasi, dan untuk mencegah penurunan performa terlalu banyak, peta kubus tidak dihitung ulang sebanyak gambar utama. Hal ini mungkin menyebabkan sedikit keterlambatan dalam refleksi. Untuk mengurangi beban pada kecepatan pengisian, rendering dilakukan pada resolusi yang lebih rendah, yang dapat menyebabkan pikselasi pada pantulan. Terakhir, teknologi ini seringkali terbatas pada mesin pemain, dan semua objek lainnya menggunakan peta lingkungan (bola) yang lebih sederhana.

Dengan metode ray tracing, pantulan ditampilkan dengan sempurna, dan tanpa algoritma yang rumit, karena semuanya dihitung dengan algoritma rendering utama. Keunggulan lainnya adalah tampilan pantulan bagian-bagian suatu benda satu sama lain, misalnya pantulan kaca spion pada badan mobil, yang sangat sulit diperoleh dengan menggunakan metode rasterisasi - tetapi ini dia refleksi diperoleh dengan cara yang sama seperti yang lain.


Metode ray tracing memungkinkan Anda untuk mensimulasikan pantulan bagian-bagian suatu benda satu sama lain, misalnya pantulan kaca spion pada bodi mobil. Klik pada gambar untuk memperbesar.

Keuntungan lain yang tak terbantahkan dari metode ray tracing adalah pemrosesan berkualitas tinggi efek transparansi. Sangat sulit untuk merender efek transparansi menggunakan algoritma rasterisasi, karena penghitungan transparansi secara langsung bergantung pada urutan rendering. Untuk memperoleh hasil yang baik, Anda perlu mengurutkan poligon transparan dalam urutan terjauh dari kamera hingga yang terdekat, dan baru kemudian merendernya.

Namun dalam praktiknya, tugas ini terlalu sulit dari sudut pandang komputasi, dan kesalahan transparansi juga mungkin terjadi, karena penyortiran dilakukan berdasarkan poligon, bukan piksel. Ada beberapa teknologi yang memungkinkan Anda melewati penyortiran poligon pemandangan (seperti pengelupasan kedalaman dan buffer-A), tetapi saat ini tidak ada satupun yang bisa disebut hemat. Pada saat yang sama, algoritma ray tracing memungkinkan Anda menangani efek transparansi dengan elegan.


Menangani efek transparansi dengan benar menggunakan rasterizer memerlukan penggunaan algoritma kompleks seperti A-buffer. Klik pada gambar untuk memperbesar.

Keuntungan penting lainnya adalah perhitungan bayangan. Dalam dunia rasterisasi, teknologi pemetaan bayangan sudah menjadi standar. Namun ada beberapa masalah, seperti “tangga” di sirkuit dan jumlah memori yang digunakan. Algoritme ray tracing memecahkan masalah bayangan dengan sangat elegan, tanpa menggunakan algoritma yang rumit, menggunakan objek primitif yang sama dan tanpa memerlukan memori tambahan.

Terakhir, keunggulan kuat lainnya dari metode ray tracing adalah kemampuan aslinya untuk bekerja dengan permukaan melengkung. GPU modern telah memiliki dukungan untuk permukaan melengkung selama beberapa tahun (muncul dan menghilang seiring dengan dirilisnya driver baru dan arsitektur baru). Namun jika rasterizer harus melakukan tessellation awal untuk membuat segitiga (yang merupakan satu-satunya primitif yang dapat digunakan oleh mesin rasterisasi), maka mesin ray tracing dapat dengan mudah bekerja dengan perpotongan sinar, tanpa definisi matematis yang tepat dari permukaannya. .

Mitos tentang penelusuran sinar

Namun ray tracing masih belum bisa diidealkan, jadi inilah saatnya untuk membongkar beberapa mitos seputar algoritma ini.

Mari kita mulai dengan fakta bahwa banyak gamer menganggap algoritma ray tracing secara fundamental lebih baik daripada rasterisasi, karena digunakan dalam film. Ini salah. Kebanyakan film sintetik/gambar tangan (seperti semua film Pixar) menggunakan algoritma yang disebut REYES, yang didasarkan pada rasterisasi. Pixar hanya menambahkan ray tracing ke mesin rendering RenderMan nanti, selama produksi Mobil. Namun untuk film ini pun, ray tracing digunakan secara selektif agar tidak membebani daya komputasi yang ada. Sebelum proyek ini, Pixar menggunakan plug-in untuk membatasi penggunaan ray tracing, seperti efek bayangan ambient occlusion (AO).


Klik pada gambar untuk memperbesar.

Mitos umum kedua di kalangan pendukung ray tracing berkaitan dengan kompleksitas pemandangan yang dapat dihasilkan oleh ray tracing dan rasterisasi. Untuk memahaminya, kita perlu melihat lebih dekat setiap algoritma.

Di bawah ini adalah cara kerja algoritma rasterisasi pada setiap segitiga dalam adegan.

  • Satu set piksel ditentukan yang mencakup setiap segitiga;
  • Untuk setiap piksel yang terlibat, kedalamannya dibandingkan dengan kedalaman piksel di sekitarnya.

Keterbatasan utama metode rasterisasi berkaitan dengan jumlah segitiga. Algoritma ini memiliki kompleksitas O(n), dimana n adalah jumlah segitiga. Algoritma di pada kasus ini memiliki kompleksitas linier tergantung pada jumlah segitiga, karena untuk setiap frame disusun daftar segitiga yang akan diproses satu per satu.

Sebaliknya, algoritma ray tracing bekerja sebagai berikut.

Untuk setiap piksel bingkai:

  • sebuah sinar ditarik untuk menentukan segitiga mana yang paling dekat;
  • Untuk setiap segitiga, jarak dari segitiga ke bidang keluaran gambar dihitung.

Seperti yang Anda lihat, urutan pemrosesan menjadi terbalik. Dalam kasus pertama, kami mengambil setiap poligon dan melihat piksel mana yang dicakupnya. Dan dalam kasus kedua, kami mengambil setiap piksel dan melihat poligon mana yang berhubungan dengannya. Oleh karena itu, Anda mungkin berpikir bahwa metode ray tracing kurang bergantung pada jumlah poligon dibandingkan metode rasterisasi, karena jumlah poligon tidak mempengaruhi loop utama. Namun dalam praktiknya tidak demikian. Sebenarnya untuk menentukan segitiga mana yang akan memotong sinar tersebut, kita perlu mengolah semua segitiga yang ada pada gambar tersebut. Di sini, tentu saja, para pembela metode ray tracing akan mengatakan bahwa tidak perlu memproses semua segitiga pemandangan dengan setiap sinar. Jika kita menggunakan jenis struktur data yang sesuai, maka sangat mudah untuk mengatur segitiga-segitiga tersebut sehingga hanya sebagian kecil saja yang diuji dengan setiap sinar, artinya metode ray tracing memiliki kompleksitas O(log n), dimana n adalah jumlah poligon.

Ya, argumen tersebut bisa dianggap benar. Namun pendukung ray tracing sedikit tidak jujur ​​karena hal yang sama juga berlaku untuk rasterisasi. Mesin permainan Pohon BSP (partisi ruang biner) dan metode lain telah digunakan selama bertahun-tahun untuk membatasi jumlah poligon yang perlu dihitung untuk setiap frame. Hal kontroversial lainnya adalah bahwa struktur seperti itu paling efektif untuk data statis. Yang kita butuhkan hanyalah menghitung data satu kali, lalu menyediakan akses ke data tersebut, dan ini memberikan hasil yang sangat baik. Namun apa yang harus dilakukan dengan data dinamis? Dalam hal ini, data harus dihitung ulang untuk setiap gambar, dan tidak ada rumus ajaib untuk ini. Anda masih harus mempelajari setiap poligon.

Algoritma sederhana?

Mitos terakhir menyangkut kesederhanaan alami dan keanggunan algoritma ray tracing. Tentu saja, algoritme ray tracing dapat ditulis dalam beberapa baris kode (beberapa algoritme muat di satu sisi kartu nama), namun algoritme ray tracing berkinerja tinggi adalah masalah yang sama sekali berbeda.

David Luebke, seorang insinyur di nVidia, membuat komentar berikut yang secara sempurna mencerminkan kenyataan: "Rasterisasi berlangsung cepat, namun Anda perlu memikirkan dengan hati-hati tentang cara membuat efek visual yang kompleks. Ray tracing mendukung efek visual yang kompleks, namun Anda perlu berpikir dengan hati-hati tentang bagaimana membuatnya cepat."


Kode ray tracing minimal yang ditulis oleh Paul Heckbert agar muat di kartu nama. Klik pada gambar untuk memperbesar.

Yang perlu Anda lakukan hanyalah membaca beberapa artikel tentang optimasi yang perlu dilakukan pada algoritma ray tracing untuk mengapresiasi apa yang dikatakan Luebke. Misalnya, algoritma ray tracing yang paling canggih tidak memproses sinar secara independen; mereka menggunakan apa yang disebut ray set, yang memungkinkan optimalisasi kinerja dengan sinar yang mempunyai asal dan arah yang sama. Pengoptimalan ini sangat bagus untuk blok fungsi banyak data (SIMD) instruksi tunggal di dalam CPU dan GPU, dan juga sangat efektif untuk sinar inti dengan tingkat koherensi atau sinar bayangan tertentu. Namun di sisi lain, optimasi tersebut sudah tidak sesuai lagi untuk sinar refraksi atau pantulan.

Terlebih lagi, seperti yang ditunjukkan Daniel Pohl dalam artikelnya tentang Quake Wars RT, penggunaan rangkaian sinar dapat menjadi masalah dengan tekstur transparan (tekstur alfa terkenal yang digunakan untuk pepohonan), karena jika semua sinar dalam suatu rangkaian tidak berperilaku sama (ada yang mengenai permukaan, ada yang melewatinya), maka tambahan overhead bisa menjadi jauh lebih besar daripada manfaat optimasi yang diberikan dengan menggunakan kumpulan sinar.


Visualisasi "biaya" rendering setiap piksel, dengan piksel merah menjadi yang paling "mahal". Seperti yang Anda lihat, rendering pohon sangat mahal dalam versi Quake Wars yang ditelusuri dengan sinar. Klik pada gambar untuk memperbesar.

Terakhir, seperti yang telah kami sebutkan, ray tracing memerlukan struktur data yang sesuai untuk menyimpan berbagai elemen pemandangan, dan struktur inilah yang akan memainkan peran yang menentukan dalam performa akhir. Namun memilih dan kemudian bekerja dengan struktur data seperti itu tidaklah sesederhana yang terlihat pada pandangan pertama. Beberapa struktur memilikinya karakteristik terbaik untuk data statis, sementara yang lain dapat diperbarui lebih cepat untuk data dinamis atau menggunakan lebih sedikit memori. Seperti biasa, semuanya bermuara pada menemukan kompromi yang dapat diterima. Tidak ada keajaiban.

Oleh karena itu, seperti yang bisa kita lihat, algoritma ray tracing tidak selalu bisa disebut ideal dalam hal kesederhanaan dan keanggunan, seperti yang diyakini beberapa orang. Untuk mendapatkan kinerja yang baik dari algoritma ray tracing, Anda perlu menemukan solusi pemrograman yang tidak sepele dibandingkan dengan mendapatkan solusi pemrograman yang kompleks. efek visual dalam metode rasterisasi.

Sekarang setelah kita menjernihkan beberapa mitos seputar ray tracing, mari kita lihat masalah sebenarnya yang timbul dari teknologi ini.

Dan kita akan mulai dengan masalah utama yang terkait dengan algoritma rendering ini: kelambatannya. Tentu saja, beberapa penggemar akan mengatakan bahwa ini tidak lagi menjadi masalah, karena algoritma ray tracing sangat dapat diparalelkan dan jumlah inti prosesor meningkat setiap tahun, sehingga kita akan melihat peningkatan linear dalam kinerja ray tracing. Selain itu, penelitian mengenai optimasi yang dapat diterapkan pada ray tracing masih dalam tahap awal. Jika Anda melihat akselerator 3D pertama dan membandingkannya dengan yang tersedia saat ini, memang ada alasan untuk optimis.

Namun, sudut pandang ini tidak diperhitungkan poin penting: Hal yang menarik dari metode ray tracing adalah sinar sekundernya. Dalam praktiknya, menghitung gambar hanya dengan sinar primer tidak akan memberikan banyak peningkatan kualitas gambar dibandingkan dengan algoritma klasik dengan Z-buffer. Namun permasalahan dengan berkas sekunder adalah berkas tersebut sama sekali tidak mempunyai koherensi (codirectionity). Saat berpindah dari satu piksel ke piksel lainnya, data yang sangat berbeda harus dihitung, yang meniadakan semua teknik caching biasa yang sangat penting untuk kinerja yang baik. Artinya penghitungan sinar sekunder sangat bergantung pada subsistem memori, khususnya penundaannya. Ini adalah skenario terburuk yang mungkin terjadi, karena dari semua karakteristik memori, latensi mengalami peningkatan paling sedikit seiring berjalannya waktu. tahun terakhir, dan tidak ada alasan untuk percaya bahwa situasi ini akan membaik dalam waktu dekat. Sangat mudah untuk meningkatkan bandwidth memori dengan menggunakan beberapa chip secara paralel, namun latensinya akan tetap sama.


Untuk kartu video, latensi memori (latensi) menurun jauh lebih lambat dibandingkan peningkatan bandwidth (bandwidth). Jika penundaan meningkat sebesar 10 kali lipat, maka penundaan hanya meningkat sebesar dua kali lipat.

Alasan popularitas GPU terletak pada kenyataan bahwa pembuatan perangkat keras yang berspesialisasi dalam rasterisasi ternyata sangat bermanfaat. solusi yang efektif. Dengan rasterisasi, akses memori dilakukan secara koheren (paralel), terlepas dari apakah kita bekerja dengan piksel, texel, atau simpul. Oleh karena itu, cache yang kecil, dilengkapi dengan bandwidth memori yang besar, akan berguna solusi ideal untuk kinerja yang unggul. Tentu saja peningkatannya lebar pita sangat mahal, namun solusi ini cukup cocok jika membuahkan hasil. Sebaliknya, saat ini tidak ada solusi untuk mempercepat akses memori saat menghitung banyak sinar. Inilah alasan mengapa ray tracing tidak akan pernah seefisien rasterisasi.

Masalah umum lainnya dengan ray tracing adalah anti-aliasing (AA). Sinar dilakukan sebagai abstraksi matematika sederhana, dan ukuran sebenarnya mereka tidak memperhitungkannya. Tes perpotongan segitiga adalah fungsi Boolean sederhana yang memberikan jawaban ya atau tidak, tetapi tidak memberikan rincian seperti "sinar memotong segitiga 40% kelilingnya". Konsekuensi langsung dari efek ini adalah munculnya “tangga”.

Untuk mengatasi masalah ini, beberapa teknologi telah diusulkan, seperti penelusuran sinar dan penelusuran kerucut, yang memperhitungkan ketebalan balok, namun kompleksitasnya menghalangi implementasi yang efektif. Dan satu-satunya teknologi yang dapat memberikan hasil yang baik adalah penghitungan sinar yang lebih banyak daripada jumlah piksel, yaitu supersampling (render pada resolusi yang lebih tinggi). Hampir tidak ada gunanya menyebutkan sekali lagi bahwa teknologi ini jauh lebih mahal secara komputasi dibandingkan multisampling yang digunakan pada GPU modern.

Mesin rendering hibrida?

Jika Anda telah membaca seluruh artikel hingga saat ini, Anda mungkin berpikir bahwa ray tracing belum dapat menggantikan rasterisasi, tetapi mungkin ada baiknya menggabungkan kedua teknologi tersebut? Dan sekilas nampaknya kedua teknologi tersebut saling melengkapi. Sangat mudah untuk membayangkan melakukan rasterisasi segitiga untuk menentukan apa yang terlihat, memanfaatkan kinerja teknologi yang luar biasa, dan kemudian menerapkan ray tracing hanya pada beberapa permukaan, menambahkan realisme jika diperlukan, seperti menambahkan bayangan atau mendapatkan pantulan dan transparansi yang baik. Sebenarnya Pixar menggunakan pendekatan ini untuk kartun "Cars". Model geometris dibuat menggunakan REYES, dan ray tracing digunakan "sesuai permintaan" di mana efek tertentu perlu disimulasikan.


Untuk Mobil, Pixar menggunakan mesin rendering hybrid yang menggabungkan REYES untuk rendering dan penelusuran sinar sesuai permintaan untuk refleksi dan oklusi sekitar. Klik pada gambar untuk memperbesar.

Sayangnya, meskipun metode ini terdengar menjanjikan, solusi hybrid tidak mudah diterapkan. Seperti yang telah kita lihat, salah satu kelemahan penting dari metode ray tracing adalah kebutuhan untuk mengatur struktur data sedemikian rupa untuk membatasi jumlah pemeriksaan perpotongan sinar dan objek. Dan menggunakan model hybrid dibandingkan ray tracing murni tidak mengubah hal tersebut. Penting untuk mengatur struktur data beserta segala kekurangan yang menyertainya. Misalnya, metode ray tracing didasarkan pada data statis, namun data dinamis dirender melalui rasterisasi. Namun dalam kasus ini kita kehilangan semua manfaat ray tracing. Karena tidak ada data dinamis untuk ray tracing, Anda tidak akan dapat memaksa objek untuk menghasilkan bayangan atau melihat pantulan.

Selain itu, dalam hal kinerja, masalah terbesar adalah akses memori yang terkait dengan sinar sekunder, dan sinar inilah yang kami perlukan dalam mesin rendering hibrid kami. Jadi peningkatan kinerja tidak akan sebesar yang Anda harapkan pada awalnya. Karena sebagian besar waktu rendering akan dihabiskan pada sinar sekunder, keuntungan dari tidak merendernya sinar utama akan diabaikan.

Dengan kata lain, dengan mencoba menggabungkan kelebihan kedua metode, kita pasti menggabungkan kekurangannya, sehingga kehilangan keanggunan metode ray tracing dan kinerja rasterisasi yang tinggi.

Seperti yang telah kami sebutkan beberapa kali dalam artikel kami, ada banyak masalah yang harus diselesaikan sebelum ray tracing menjadi a alternatif yang layak rasterisasi dalam rendering waktu nyata. Dan jika dipikir-pikir, apakah cara ini akan menjadi obat mujarab untuk segala penyakit? Manfaat ray tracing tidak begitu revolusioner sehingga dapat membenarkan hukuman kinerja yang signifikan. Kekuatan algoritme ini berkaitan dengan refleksi dan transparansi, karena kedua efek ini adalah yang paling sulit dicapai dengan algoritme rasterisasi yang ada. Namun, sekali lagi, apakah ini merupakan kelemahan yang serius? Dunia di sekitar kita tidak seluruhnya terdiri dari benda-benda yang sangat transparan atau bersinar, sehingga penglihatan kita mungkin akan terpuaskan dengan perkiraan kasar.

Jika melihat simulator mobil terbaru, misalnya Gran Turismo dan Forza, terlihat jelas kualitas rendering yang cukup memuaskan, meski pantulan pada bodinya sepenuhnya palsu. Dan pantulan tepat dari kaca spion pada cat hampir tidak dapat dianggap cukup untuk mengenali langkah lain menuju fotorealisme.


Kenyataannya tidak ada refleksi. Misalnya saja kaca spion yang tidak memantulkan cahaya pada bodi mobil. Namun apakah Anda memerlukan rendering Audi R8 yang "adil" menggunakan ray tracing? Klik pada gambar untuk memperbesar.

Sebagian besar peminat percaya bahwa ray tracing pada dasarnya menghasilkan gambar yang lebih baik daripada rasterisasi - namun mereka sering kali mendasarkan pendapat mereka pada gambar yang dihasilkan oleh mesin offline dan non-real-time. Namun, hasil dari mesin seperti itu jauh lebih baik daripada kemampuan game modern. Selain itu, ada beberapa kebingungan seputar ray tracing. Penggemar sering membandingkan gambar fotorealistik, yang dihasilkan oleh kombinasi beberapa teknik, dengan rasterisasi, seperti penelusuran sinar untuk pantulan langsung, radiositas untuk pantulan difus, pemetaan foton untuk kaustik, dll. Semua teknologi ini digabungkan untuk memberikan kualitas fotorealistik mungkin.


Untuk mencapai rendering fotorealistik, Anda perlu menggabungkan beberapa teknologi. Ray tracing saja tidak cukup untuk mensimulasikan interaksi kompleks antar material jenis yang berbeda dan ringan. Klik pada gambar untuk memperbesar.

Dalam versi dasarnya, ray tracing, jika mempertimbangkan implementasi real-time yang ada, hanya cocok untuk pantulan ideal dan bayangan keras (tajam). Doom 3 membuktikan beberapa tahun yang lalu bahwa adalah mungkin untuk menciptakan mesin 3D yang andal yang dapat menangani bayangan dinamis dan rasterisasi dengan sempurna, namun jika dipikir-pikir, game tersebut juga menunjukkan bahwa bayangan keras tidak realistis.


Klik pada gambar untuk memperbesar.

Untuk menciptakan bayangan lembut atau pantulan yang menyebar (seperti yang Anda lihat pada logam bertekstur, misalnya), diperlukan teknik ray tracing yang lebih canggih seperti path tracing dan atau ray tracing terdistribusi. Namun teknik seperti itu memerlukan jumlah sinar yang jauh lebih besar, sehingga masih kurang cocok untuk real time.

Beberapa pengguna percaya bahwa cepat atau lambat begitu banyak kekuatan pemrosesan akan tersedia sehingga keunggulan kinerja rasterisasi tidak lagi menjadi faktor penentu. Karena hukum hasil yang semakin berkurang, peningkatan kinerja dari rasterisasi akan segera dilupakan demi keanggunan ray tracing. Sama seperti sebelumnya, manfaat produktivitas dari pengkodean bahasa assembly telah dilupakan, yang ternyata tidak cukup untuk melebihi manfaat dari bahasa tingkat tinggi.

Namun, hal ini sepertinya tidak dapat meyakinkan kami. Bagaimanapun, kita masih jauh dari saatnya kita dapat mengorbankan kinerja demi keanggunan dan kesederhanaan. Lihat saja apa yang terjadi 10 tahun terakhir di dunia rendering offline. Sementara satu frame Toy Story membutuhkan rata-rata dua jam untuk dirender, satu frame Ratatouille membutuhkan waktu enam setengah jam, meskipun ada peningkatan kekuatan pemrosesan antara kedua film tersebut lebih dari 400 kali lipat. Dengan kata lain, semakin banyak kekuatan pemrosesan dan sumber daya yang Anda berikan kepada seniman komputer, semakin cepat mereka menggunakannya.

Bahkan jika perusahaan seperti Pixar, yang mampu mendedikasikan beberapa jam komputasi untuk membuat satu frame, memutuskan untuk menggunakan ray tracing hanya sesekali karena dampak negatifnya terhadap kinerja, ini berarti bahwa pada saat sebelumnya kita akan memiliki kekuatan pemrosesan yang cukup dalam Game 3D -real-time untuk melakukan semua rendering menggunakan ray tracing sangatlah jauh. Dan di masa depan, para peminat pasti punya tempat untuk mengeluarkan daya komputasi tersebut.

Metode ray tracing saat ini dianggap paling banyak metode yang ampuh menciptakan gambar yang realistis. Keserbagunaan metode penelusuran sebagian besar disebabkan oleh fakta bahwa metode tersebut didasarkan pada konsep sederhana dan jelas yang mencerminkan pengalaman kita dalam memandang dunia di sekitar kita.

Mari kita lihat bagaimana sebuah gambar terbentuk. Gambar dihasilkan oleh cahaya yang masuk ke kamera. Mari kita lepaskan banyak sinar dari sumber cahaya. Sebut saja sinar primer. Sebagian dari sinar ini akan terbang ke ruang bebas, dan sebagian lagi akan mengenai benda. Sinarnya dapat dibiaskan dan dipantulkan padanya. Dalam hal ini, sebagian energi pancaran akan diserap. Sinar bias dan sinar pantul membentuk banyak sinar sekunder. Kemudian sinar-sinar tersebut akan kembali dibiaskan dan dipantulkan serta membentuk sinar generasi baru. Pada akhirnya, sebagian sinar akan mengenai kamera dan membentuk sebuah gambar.

Ada algoritma yang bekerja berdasarkan algoritma ini. Namun cara ini sangat tidak efektif, karena sebagian besar sinar yang memancar dari sumbernya tidak mencapai kamera. Dan gambaran yang dapat diterima diperoleh jika Anda menelusurinya jumlah yang besar sinar matahari, yang akan memakan waktu sangat lama. Algoritma ini disebut penelusuran sinar langsung.

Metode reverse ray tracing dapat mengurangi pencarian sinar cahaya secara signifikan. Metode ini dikembangkan pada tahun 1980an oleh Whitted dan Kaye. Dalam metode ini, sinar dilacak bukan dari sumbernya, tetapi dari kamera. Demikianlah hal itu ditelusuri nomor tertentu sinar sama dengan resolusi gambar.

Misalkan kita mempunyai kamera dan layar yang terletak pada jarak h darinya. Mari kita bagi layar menjadi beberapa kotak. Selanjutnya, kita akan menggambar sinar dari kamera secara bergiliran ke pusat setiap kotak (sinar primer). Mari kita cari perpotongan setiap sinar tersebut dengan objek pemandangan dan pilih yang paling dekat dengan kamera di antara semua perpotongan. Selanjutnya, dengan menerapkan model pencahayaan yang diinginkan, Anda dapat memperoleh gambaran pemandangan. Ini adalah metode penelusuran sinar yang paling sederhana. Ini hanya memungkinkan Anda memotong tepi yang tidak terlihat.

Tapi kita bisa melangkah lebih jauh. Jika kita ingin mensimulasikan fenomena seperti pemantulan dan pembiasan, kita perlu meluncurkan sinar sekunder dari persimpangan terdekat. Misalnya, jika permukaan memantulkan cahaya dan rata sempurna, maka sinar primer perlu dipantulkan dari permukaan dan sinar sekunder diarahkan ke arah ini. Jika permukaannya tidak rata, maka perlu dilakukan banyak sinar sekunder. Hal ini tidak dilakukan dalam program ini, karena ini akan sangat memperlambat penelusuran.

Jika suatu benda transparan, maka perlu dibuat sinar sekunder sedemikian rupa sehingga bila dibiaskan menghasilkan sinar aslinya. Beberapa benda mungkin memiliki sifat pembiasan difus. Dalam hal ini, tidak hanya satu, tetapi banyak sinar bias yang terbentuk. Mengenai refleksi, saya mengabaikan ini.

Jadi, sinar primer, setelah mendapat perpotongan dengan benda, umumnya terbagi menjadi dua sinar (dipantulkan dan dibiaskan). Kemudian kedua sinar ini terbagi menjadi dua lagi dan seterusnya.

Prosedur penelusuran sinar balik utama dalam program saya adalah prosedur Ray. Ini memiliki struktur berikut:

Jika pembangkitan sinar sama dengan kedalaman rekursi maksimum, maka kami mengembalikan kecerahan rata-rata untuk semua komponen. Jika tidak, lanjutkan

Kami menentukan segitiga terdekat tempat sinar berpotongan.

Jika tidak ada segitiga seperti itu, kembalikan warna latar belakang; jika ada, lanjutkan.

Jika permukaan tempat perpotongan ditemukan bersifat reflektif, maka kita membentuk sinar pantul dan memanggil prosedur Ray secara rekursif dengan pembangkitan sinar bertambah 1.

Jika permukaan tempat perpotongan ditemukan membias, maka kita membentuk sinar bias dan memanggil prosedur Ray secara rekursif dengan pembangkitan sinar bertambah 1.

Kami menentukan iluminasi akhir piksel, dengan mempertimbangkan lokasi sumber, sifat material, serta intensitas sinar yang dipantulkan dan dibiaskan.

Saya telah membahas sejumlah keterbatasan metode penelusuran ketika kita berbicara tentang pembiasan difus dan cermin tidak rata. Mari kita lihat beberapa lainnya.

Hanya objek khusus - sumber cahaya - yang dapat menerangi pemandangan. Bentuknya seperti titik dan tidak dapat menyerap, membiaskan, atau memantulkan cahaya.

Sifat-sifat permukaan reflektif terdiri dari dua komponen - difus dan specular.

Dengan refleksi difus, hanya sinar dari sumber cahaya yang diperhitungkan. Jika sumber menerangi suatu titik melalui cermin (dengan kelinci), maka titik tersebut dianggap tidak diterangi.

Spekulanitas juga dibagi menjadi dua komponen.

refleksi - memperhitungkan pantulan dari objek lain (bukan sumber cahaya)

specular - memperhitungkan silau dari sumber cahaya

Penelusuran tidak memperhitungkan ketergantungan pada panjang gelombang cahaya:

Indeks bias

koefisien penyerapan

koefisien refleksi

Karena saya tidak memodelkan refleksi dan refraksi difus, saya tidak akan bisa mendapatkan cahaya latar. Oleh karena itu, kami memperkenalkan pencahayaan latar belakang minimum. Seringkali ini hanya memungkinkan Anda meningkatkan kualitas gambar secara signifikan.

Algoritme penelusuran memungkinkan Anda menggambar bayangan berkualitas sangat tinggi. Ini tidak memerlukan banyak pengerjaan ulang algoritma. Anda harus menambahkan sesuatu ke dalamnya. Saat menghitung iluminasi titik, perlu menempatkan “Bayangan Depan” di setiap sumber cahaya. "Bayangan depan" adalah sinar yang memeriksa apakah ada sesuatu antara titik dan sumber. Jika ada benda buram di antara keduanya, maka titik tersebut berada pada bayangan. Artinya, sumber ini tidak berkontribusi pada penerangan akhir titik tersebut. Jika suatu benda transparan terletak, maka intensitas sumbernya berkurang. Menggambar bayangan sangat memakan waktu. Jadi, dalam beberapa situasi mereka dinonaktifkan.

Program saya memiliki kemampuan untuk mengaktifkan penghalusan gambar. Antialiasing adalah tentang menentukan warna suatu piksel. Bukan hanya satu sinar, tetapi empat, diluncurkan dan nilai warna rata-rata dari sinar tersebut ditentukan. Jika perlu mencari warna suatu piksel (i,j), maka 4 sinar dikirim ke titik-titik pada bidang layar dengan koordinat (i-0.25,j-0.25), (i-0.25,j+0.25), (i+0,25,j-0,25) , (i+0,25,j+0,25).

Di Gamescom 2018 Nvidia mengumumkan serangkaian kartu video NvidiaGeForce RTX, yang akan mendukung teknologi ray tracing real-time Nvidia RTX. Editor kami mengetahui cara kerja teknologi ini dan mengapa teknologi ini diperlukan.

Apa itu Nvidia RTX?

Nvidia RTX adalah platform yang berisi sejumlah alat yang berguna untuk pengembang yang membuka akses ke grafik komputer tingkat baru. Nvidia RTX hanya tersedia untuk generasi baru Kartu video Nvidia GeForce RTX, dibangun berdasarkan arsitektur Turing. Fitur utama platform ini adalah ketersediaan penelusuran sinar waktu nyata(juga disebut penelusuran sinar).

Apa itu penelusuran sinar?

Ray tracing adalah fitur yang memungkinkan Anda menyimulasikan perilaku cahaya, sehingga menciptakan pencahayaan yang dapat dipercaya. Sekarang dalam permainan, sinar tidak bergerak secara real time, itulah sebabnya gambarnya, meskipun sering kali terlihat indah, masih belum cukup realistis - teknologi yang digunakan sekarang akan membutuhkan sumber daya yang sangat besar untuk penelusuran sinar.

Hal ini diperbaiki dengan seri baru kartu video Nvidia GeForce RTX, yang memiliki kekuatan cukup untuk menghitung jalur sinar.

Bagaimana itu bekerja?

RTX memproyeksikan sinar cahaya dari sudut pandang pemain (kamera) ke ruang sekitarnya dan dengan demikian menghitung di mana piksel warna akan muncul. Ketika sinar matahari mengenai sesuatu, mereka dapat:

  • Refleksikan - ini akan memicu munculnya pantulan di permukaan;
  • Berhenti - ini akan membuat bayangan pada sisi objek yang tidak terkena cahaya
  • Membiaskan kembali - ini akan mengubah arah sinar atau mempengaruhi warna.
Kehadiran fungsi-fungsi ini memungkinkan Anda menciptakan pencahayaan yang lebih dapat dipercaya dan grafik yang realistis. Proses ini sangat memakan sumber daya dan telah lama digunakan dalam pembuatan efek film. Satu-satunya perbedaan adalah ketika merender bingkai film, penulis memiliki akses ke sumber daya dalam jumlah besar dan, bisa dikatakan, jangka waktu tidak terbatas. Dalam permainan, perangkat hanya memiliki waktu sepersekian detik untuk menghasilkan gambar, dan paling sering, satu kartu video digunakan, dan bukan beberapa, seperti saat memproses film.

Hal ini mendorong Nvidia untuk memperkenalkan inti tambahan ke dalam kartu grafis GeForce RTX, yang akan mengambil sebagian besar beban, sehingga meningkatkan kinerja. Mereka juga dibekali dengan kecerdasan buatan yang tugasnya menghitung kemungkinan kesalahan selama proses penelusuran, yang akan membantu menghindarinya terlebih dahulu. Hal ini, menurut pengembang, juga akan meningkatkan kecepatan operasi.

Dan bagaimana ray tracing mempengaruhi kualitas?

Selama presentasi kartu video, Nvidia mendemonstrasikan sejumlah contoh ray tracing: khususnya, diketahui bahwa beberapa game yang akan datang, termasuk Shadow of Makam Raider dan Battlefield 5 akan berjalan di platform RTX. Namun, fungsi ini bersifat opsional dalam game, karena penelusuran memerlukan salah satu kartu video baru. Trailer yang ditampilkan perusahaan saat presentasi dapat dilihat di bawah ini:

Shadow of the Tomb Raider yang akan dirilis pada 14 September tahun ini:

Battlefield 5 yang akan dirilis pada 19 Oktober:

Metro Exodus, dijadwalkan rilis pada 19 Februari 2019:

Kontrol, tanggal rilisnya masih belum diketahui:

Seiring dengan semua ini, Nvidia, game apa lagi yang akan menerima fitur ray tracing.

Bagaimana cara mengaktifkan RTX?

Dalam pandangan fitur Teknik Dengan teknologi ini, penelusuran jejak hanya akan didukung oleh kartu video dengan arsitektur Turing - perangkat yang tersedia saat ini tidak dapat mengatasi jumlah pekerjaan yang diperlukan penelusuran. Saat ini, satu-satunya kartu video dengan arsitektur ini adalah seri Nvidia GeForce RTX, yang modelnya tersedia untuk pre-order mulai dari 48.000 hingga 96.000 rubel.

Apakah AMD punya analog?

AMD memiliki teknologi real-time ray tracing versinya sendiri, yang hadir di mesin Radeon ProRender mereka. Perusahaan mengumumkan perkembangannya kembali di GDC 2018, yang berlangsung pada bulan Maret. Perbedaan utama antara metode AMD dan Nvidia adalah AMD memberikan akses tidak hanya pada penelusuran, tetapi juga rasterisasi, sebuah teknologi yang sekarang digunakan di semua game. Hal ini memungkinkan Anda menggunakan penelusuran, mendapatkan pencahayaan yang lebih baik, dan menghemat sumber daya di tempat di mana penelusuran akan menjadi beban yang tidak perlu pada kartu video.

Teknologi yang akan berjalan pada Vulkan API masih dalam tahap pengembangan.

Seperti yang dinyatakan Nvidia dalam presentasinya, penguasaan teknologi RTX akan meningkatkan komponen grafis game secara signifikan, memperluas rangkaian alat yang tersedia bagi pengembang. Namun, masih terlalu dini untuk membicarakan revolusi grafis secara umum - tidak semua game mendukung teknologi ini, dan biaya kartu video yang mendukungnya cukup tinggi. Presentasi kartu video baru berarti kemajuan detail grafis ada, dan lama kelamaan akan tumbuh dan berkembang.

Metode Pelacakan Balik

metode menelusuri kembali sinar memungkinkan Anda mengurangi secara signifikan jumlah sinar cahaya yang berlebihan. Metode ini dikembangkan pada tahun 80-an, dan karya-karya fundamentalnya dipertimbangkan dipangkas Dan Kaya. Menurut metode ini, sinar dilacak bukan dari sumber cahaya, tetapi dari arah yang berlawanan - dari titik pengamatan. Dengan cara ini, hanya sinar yang berkontribusi pada pembentukan gambar yang diperhitungkan.

Mari kita lihat bagaimana Anda bisa mendapatkan gambar raster dari beberapa adegan tiga dimensi menggunakan metode penelusuran balik. Misalkan bidang proyeksi dibagi menjadi banyak kotak - piksel. Mari kita pilih proyeksi pusat dengan pusat hilang pada jarak tertentu dari bidang proyeksi. Mari kita menggambar garis lurus dari pusat hilang melalui tengah persegi (piksel) bidang proyeksi. Ini akan menjadi sinar penelusuran balik utama. Jika garis lurus sinar ini mengenai satu atau lebih objek pada pemandangan, maka pilihlah titik potong terdekat. Untuk menentukan warna piksel suatu gambar, Anda perlu memperhitungkan sifat-sifat objek, serta radiasi cahaya apa yang jatuh pada titik yang sesuai pada objek tersebut.

Jika benda dicerminkan (setidaknya sebagian), maka kita buatlah sinar sekunder - sinar datang, dengan menganggap sinar primer yang dilacak sebelumnya adalah sinar pantulan. Di atas, kita membahas pemantulan spekuler dan memperoleh rumus vektor sinar pantul berdasarkan vektor sinar normal dan sinar datang yang diberikan. Namun disini kita mengetahui vektor sinar pantul, namun bagaimana cara mencari vektor sinar datang? Untuk melakukan ini, Anda dapat menggunakan rumus pemantulan specular yang sama, tetapi mendefinisikan vektor yang diperlukan dari sinar datang sebagai sinar pantul. Artinya, refleksi sebaliknya Saya.

Untuk cermin ideal, cukup menelusuri titik perpotongan berikutnya antara sinar sekunder dengan suatu benda. Cermin yang tidak sempurna sangat mempersulit penelusuran - Anda perlu melacak bukan hanya satu, tetapi banyak sinar datang, dan memperhitungkan kontribusi radiasi dari objek lain yang terlihat dari titik tertentu.

Jika objeknya transparan, maka Anda perlu membuatnya balok baru, sehingga bila dibiaskan akan menghasilkan sinar yang dilacak sebelumnya. Di sini Anda juga dapat memanfaatkan reversibilitas, yang juga berlaku untuk refraksi.

Jika suatu benda mempunyai sifat pemantulan dan pembiasan difus, maka pada umumnya, seperti halnya cermin tidak ideal, perlu ditelusuri sinar-sinar yang datang dari semua benda yang ada. Untuk pemantulan difus, diketahui intensitas cahaya yang dipantulkan sebanding dengan kosinus sudut antara vektor sinar dari sumber cahaya dan garis normal. Di sini, sumber cahaya dapat berupa benda apa pun yang terlihat dari suatu titik tertentu yang dapat memancarkan energi cahaya.

Ketika ternyata; bahwa sinar lacak balik yang mengalir tidak memotong benda apa pun, tetapi masuk ke ruang bebas, maka penelusuran sinar ini berakhir.

Beras. 14.1 Contoh penelusuran sinar terbalik.

Penelusuran sinar mundur dalam bentuk yang kami pertimbangkan di sini, meskipun mengurangi pencarian, tidak memungkinkan kami menghilangkan jumlah sinar yang dianalisis yang tak terhingga. Faktanya, metode ini memungkinkan Anda untuk segera mendapatkan satu sinar penelusuran balik primer untuk setiap titik gambar. Namun, jumlah sinar refleksi sekunder sudah tidak terbatas. Jadi, misalnya, jika suatu benda dapat memantulkan cahaya dari benda lain, dan jika benda lain tersebut cukup besar, maka titik mana dari benda yang memancarkannya perlu diperhitungkan untuk membentuk sinar yang bersesuaian, misalnya pada pantulan menyebar. ? Jelas, semua poinnya.

Cara kerja metode ray tracing:

1. Sinar imajiner dipancarkan dari mata pengamat melalui piksel tertentu pada layar dan jalurnya dilacak hingga memotong objek.

2. Sinar pantul dipancarkan dari titik potong pertama sinar tersebut dengan bola. Biarkan permukaannya menjadi buram. Maka kita tidak menggambar sinar bias. Kami menunjukkan sinar bayangan dari titik potong ke sumber cahaya. Karena sinar ini tidak memotong permukaan buram lainnya, sumber cahaya secara langsung mempengaruhi intensitas penerangan pada suatu titik tertentu.

3. Biarkan sinar pantul memotong benda lain, kali ini bola tembus pandang yang memantulkan dan meneruskan cahaya. Sinar yang dipantulkan dan dibiaskan dipancarkan bersama dengan sinar bayangan yang menuju ke sumber cahaya. Sinar yang ditransmisikan berubah arahnya sebelum dan sesudah memasuki bola sesuai dengan pengaruh pembiasan.

4. Misalkan titik potong sinar pada bola tidak langsung disinari oleh sumbernya, karena jalur bayangan sinar terhalang oleh permukaan buram. Jika pemandangan tersebut berisi banyak sumber cahaya, maka sinar bayangan harus ditembakkan ke masing-masing sumber tersebut.

5. Pengaruh seluruh sinar yang dihasilkan secara eksplisit maupun implisit oleh sinar awal dijumlahkan dan hasilnya menentukan nilai RGB titik tersebut.

PERKENALAN

Ada beberapa metode untuk menghasilkan gambar realistis, seperti penelusuran sinar maju (penelusuran foton) dan penelusuran sinar terbalik.

Metode ray tracing dianggap yang paling ampuh dan metode universal menciptakan gambar yang realistis. Ada banyak contoh penerapan algoritma penelusuran untuk menampilkan pemandangan tiga dimensi paling kompleks dengan kualitas tinggi. Dapat dicatat bahwa universalitas metode penelusuran sebagian besar disebabkan oleh fakta bahwa metode tersebut didasarkan pada konsep sederhana dan jelas yang mencerminkan pengalaman kita dalam memandang dunia di sekitar kita.

Benda-benda di sekitar kita mempunyai sifat-sifat berikut sehubungan dengan cahaya:

memancarkan;

mencerminkan dan menyerap;

melewati diri mereka sendiri.

Masing-masing sifat ini dapat dijelaskan dengan serangkaian karakteristik tertentu.

Radiasi dapat dicirikan berdasarkan intensitas dan spektrum.

Sifat pemantulan (absorpsi) dapat digambarkan dengan ciri hamburan difus dan pemantulan spekular. Transparansi dapat digambarkan dengan redaman intensitas dan refraksi.

Sinar cahaya memancar dari titik-titik pada permukaan (volume) benda yang memancarkannya. Anda dapat menyebut sinar seperti itu sebagai sinar utama - sinar tersebut menerangi segalanya. Sinar primer yang tak terhitung jumlahnya memancar dari sumber radiasi ke berbagai arah. Sebagian sinar masuk ke ruang bebas, dan sebagian lagi mengenai benda lain.

Akibat aksi sinar primer pada benda, timbullah sinar sekunder. Beberapa di antaranya berakhir di objek lain. Jadi, setelah dipantulkan dan dibiaskan berkali-kali, masing-masing sinar cahaya tiba di titik pengamatan. Dengan demikian, bayangan suatu pemandangan dibentuk oleh sejumlah sinar cahaya tertentu.

Warna masing-masing titik bayangan ditentukan oleh spektrum dan intensitas sinar primer sumber radiasi, serta penyerapan energi cahaya pada benda yang ditemui pada jalur sinar yang bersangkutan.

Implementasi langsung dari model pencitraan sinar ini tampaknya sulit. Anda dapat mencoba membuat algoritme untuk membuat gambar menggunakan metode yang ditunjukkan. Dalam algoritma seperti itu, perlu untuk menghitung semua sinar primer dan menentukan sinar yang mengenai objek dan kamera. Kemudian ulangi semua sinar sekunder, dan perhitungkan hanya sinar yang mengenai objek dan kamera. Dan seterusnya. Algoritma ini disebut penelusuran sinar langsung. Kerugian utama Metode ini melibatkan banyak operasi yang tidak perlu terkait dengan penghitungan sinar, yang kemudian tidak digunakan.

1. PELACAKAN SINAR MUNDUR

Karya ini dikhususkan untuk metode menghasilkan gambar realistis.

Metode reverse ray tracing dapat mengurangi pencarian sinar cahaya secara signifikan. Metode ini dikembangkan pada tahun 80-an, karya Whitted dan Kay dianggap mendasar. Menurut metode ini, sinar dilacak bukan dari sumber cahaya, tetapi dari arah yang berlawanan - dari titik pengamatan. Dengan cara ini, hanya sinar yang berkontribusi pada pembentukan gambar yang diperhitungkan.

Bidang proyeksi dibagi menjadi banyak piksel. Mari kita pilih proyeksi pusat dengan pusat hilang pada jarak tertentu dari bidang proyeksi. Mari kita menggambar garis lurus dari pusat hilang melalui bagian tengah piksel pada bidang proyeksi. Ini akan menjadi sinar penelusuran balik utama. Jika sinar ini mengenai satu atau lebih objek dalam pemandangan, maka pilihlah titik potong terdekat. Untuk menentukan warna piksel suatu gambar, Anda perlu memperhitungkan sifat-sifat objek, serta radiasi cahaya apa yang jatuh pada titik yang sesuai pada objek tersebut.

Jika benda dicerminkan (setidaknya sebagian), maka kita buatlah sinar sekunder - sinar datang, dengan menganggap sinar primer yang dilacak sebelumnya adalah sinar pantulan.

Untuk cermin ideal, cukup menelusuri titik perpotongan berikutnya antara sinar sekunder dengan suatu benda. Cermin ideal mempunyai permukaan yang halus sempurna, sehingga satu sinar pantul hanya berhubungan dengan satu sinar datang. Cermin dapat digelapkan, yaitu menyerap sebagian energi cahaya, tetapi aturannya tetap sama: satu sinar datang, satu sinar dipantulkan.

Jika benda tersebut transparan, maka perlu dibuat sinar baru, yang bila dibiaskan akan menghasilkan sinar yang dilacak sebelumnya.

Untuk pemantulan difus, diketahui intensitas cahaya yang dipantulkan sebanding dengan kosinus sudut antara vektor sinar dari sumber cahaya dan garis normal.

Apabila ternyata sinar lacak balik yang mengalir tidak memotong suatu benda, melainkan masuk ke ruang bebas, maka penelusuran sinar tersebut berakhir.

Pada implementasi praktis Metode penelusuran balik menimbulkan keterbatasan. Beberapa di antaranya diperlukan untuk dapat memecahkan masalah sintesis gambar secara prinsip, dan beberapa pembatasan dapat meningkatkan kinerja penelusuran secara signifikan.

Keterbatasan saat melaksanakan tracing

Di antara semua jenis objek, kami akan menyoroti beberapa, yang kami sebut sumber cahaya. Sumber cahaya hanya dapat memancarkan cahaya, namun tidak dapat memantulkan atau membiaskannya. Kami hanya akan mempertimbangkan sumber cahaya titik.

Sifat-sifat permukaan reflektif dijelaskan oleh jumlah dua komponen - difus dan specular.

Pada gilirannya, spekularitas juga dijelaskan oleh dua komponen. Yang pertama (refleksi) memperhitungkan pantulan dari objek lain yang bukan sumber cahaya. Hanya satu sinar cermin r yang dibuat untuk penelusuran lebih lanjut. Komponen kedua (spekuler) berarti silau dari sumber cahaya. Untuk melakukan hal ini, sinar diarahkan ke semua sumber cahaya dan sudut yang dibentuk oleh sinar ini dengan sinar penelusuran balik yang dipantulkan secara spekuler (r) ditentukan. Dalam pemantulan spekuler, warna suatu titik pada suatu permukaan ditentukan oleh warna hakiki benda yang dipantulkan.

Dengan refleksi difus, hanya sinar dari sumber cahaya yang diperhitungkan. Sinar dari permukaan yang memantulkan cahaya DIABAIKAN. Jika sinar yang diarahkan ke suatu sumber cahaya tertentu terhalang oleh benda lain, maka titik benda tersebut berada dalam bayangan. Dengan refleksi menyebar, warna titik terang pada suatu permukaan ditentukan oleh warna permukaan itu sendiri dan warna sumber cahaya.

Untuk benda transparan, ketergantungan indeks bias pada panjang gelombang tidak diperhitungkan. (Terkadang transparansi dimodelkan tanpa pembiasan sama sekali, yaitu arah sinar bias t bertepatan dengan arah sinar datang.)

Untuk memperhitungkan iluminasi objek oleh cahaya yang dihamburkan oleh objek lain, diperkenalkan komponen latar belakang (ambient).

Untuk menyelesaikan penelusuran, batasan jumlah iterasi (kedalaman rekursi) diperkenalkan.

Kesimpulan dari metode traceback

Keuntungan:

Fleksibilitas metode ini, penerapannya untuk sintesis gambar skema spasial yang agak kompleks. Mewujudkan banyak hukum optik geometris. Berbagai proyeksi diimplementasikan secara sederhana.

Bahkan versi terpotong dari metode ini memungkinkan seseorang memperoleh gambar yang cukup realistis. Misalnya, jika kita membatasi diri hanya pada sinar primer (dari titik proyeksi), maka hal ini mengakibatkan hilangnya titik-titik yang tidak terlihat. Menelusuri satu atau dua sinar sekunder saja akan menghasilkan bayangan dan transparansi spekuler.

Semua transformasi koordinat bersifat linier, sehingga bekerja dengan tekstur cukup mudah.

Kekurangan:

Masalah dengan pemodelan refleksi dan refraksi difus.

Untuk setiap titik pada gambar, banyak operasi komputasi yang harus dilakukan. Tracing adalah salah satu algoritma sintesis gambar yang paling lambat.

2. BAGIAN DESAIN

Algoritma.

Penelusuran sinar mundur.

Beras. 1 - Diagram blok dari algoritma penelusuran sinar terbalik berulang

bahasa pemrograman penelusuran sinar

Dalam program ini, algoritma backtracing diimplementasikan secara berulang. Fungsi penghitungan intensitas sinar primer memanggil dirinya sendiri secara berulang untuk mencari intensitas sinar pantul dan sinar bias.

Algoritma:

Untuk menghitung warna setiap piksel dalam frame buffer, lakukan hal berikut:

Temukan koordinat piksel dalam sistem koordinat dunia.

Temukan koordinat sinar primer.

Memulai fungsi perhitungan intensitas sinar primer.

Temukan perpotongan sinar dengan semua adegan primitif dan pilih yang terdekat.

Jika tidak ditemukan perpotongan, maka balok telah menuju ruang bebas.

Untuk menghitung warna, kita ambil intensitas total sama dengan intensitas latar belakang. Lanjutkan ke langkah 12. Jika ditemukan persimpangan, lanjutkan ke langkah 6.

Kami menghitung intensitas warna "lokal" dari objek yang menjadi titik perpotongannya. Yang kami maksud dengan intensitas “lokal” adalah intensitas yang memperhitungkan intensitas cahaya yang dipantulkan secara menyebar dan intensitas silau.

Jika bahan memantulkan cahaya hanya secara difus, maka intensitas cahaya yang dipantulkan dan dibiaskan dianggap nol. Lanjutkan ke langkah 12. Jika tidak, lanjutkan ke langkah 8.

Jika kedalaman rekursi maksimum tercapai, maka intensitas cahaya yang dipantulkan dan dibiaskan menjadi nol. Lanjutkan ke langkah 12. Jika tidak, lanjutkan ke langkah 9.

Hitung vektor sinar pantul. Menjalankan rekursi untuk mencari intensitas sinar pantul.

Hitung vektor sinar bias. Menjalankan rekursi untuk mencari intensitas sinar bias.

Perhitungan intensitas warna total. Intensitas total meliputi intensitas cahaya tersebar, intensitas lokal, serta intensitas sinar pantul dan sinar bias.

Kembali ke titik di mana fungsi perhitungan intensitas sinar dipanggil.

Jika sinar primer sedang dihitung, maka piksel dari warna yang dihitung ditempatkan di buffer bingkai. Mari kita lanjutkan ke penghitungan piksel berikutnya dari frame buffer.Jika sinar pantul (bias) dihitung, maka intensitas yang dihitung akan diterima sebagai intensitas sinar pantul (bias) pada langkah rekursi sebelumnya.

Konstruksi bayangan.

Bayangan padat.

Untuk membangun bayangan padat dalam algoritma penelusuran, pada tahap penghitungan intensitas warna “lokal” pada suatu titik objek, “visibilitas” setiap sumber cahaya dari titik tersebut diperiksa.

Prinsip pengoperasian algoritma.

Sebuah balok dibangun dari titik yang diperiksa, diarahkan ke sumber cahaya.

Pencarian dilakukan untuk perpotongan sinar ini dengan pemandangan primitif antara titik yang diperiksa dan sumbernya.

Jika ditemukan paling sedikit satu perpotongan, maka titik yang diperiksa berada pada bayangan. Saat menghitung warnanya, sumber tempat pengujian dilakukan tidak diperhitungkan.

sumber yang dapat diverifikasi.

Metode pencarian bayangan ini memberikan hasil yang dapat diterima selama tidak ada objek transparan di dalam pemandangan. Namun, bayangan hitam pekat pada kaca tidak terlihat realistis. Kaca mentransmisikan sejumlah cahaya, sehingga intensitas sumber yang dikaburkan harus diperhitungkan saat menghitung intensitas cahaya pada suatu titik pada suatu benda, namun intensitas tersebut harus dilemahkan saat cahaya melewati kaca.

Latar belakang matematis dan fisik dari algoritma penelusuran sinar terbalik.

Petir.

Intensitas cahaya adalah jumlah dari intensitas iluminasi latar belakang pemandangan, intensitas cahaya yang dipantulkan secara menyebar dari sumber, intensitas silau dari sumber (karakteristik iluminasi “lokal”), intensitas sinar yang dipantulkan secara spekuler. dan intensitas sinar bias, jika ada.

Intensitas lampu latar (IA) diatur oleh beberapa konstanta.

Intensitas cahaya yang dipantulkan secara difus (ID) dihitung menggunakan “hukum kosinus” klasik.

ID = IL cos α,(2.2.1.6)

dimana IL adalah intensitas sumber cahaya, α adalah sudut antara garis normal permukaan dan arah menuju sumber.

Jika pemandangan disinari oleh beberapa sumber, Id dihitung untuk masing-masing sumber dan kemudian dijumlahkan.

IDi =Σ ILi cos αi.(2.2.1.7)

Intensitas sumber suar (IS) dihitung berdasarkan model Phong.

IS = IL cosp β,(2.2.1.8)

dimana IL adalah intensitas sumber cahaya (0<=IL<=1), β - угол между отраженным лучом от источника света и направлением на точку, в которой расположена камера (центр проекции), p - некоторая степень от 1 до 200 -влияет на размытость блика. При

Pada nilai p kecil sorotannya lebih buram.

Seperti halnya menghitung ID, ketika suatu pemandangan disinari oleh beberapa sumber, IS dihitung secara terpisah untuk setiap sumber, dan kemudian hasilnya dijumlahkan.

ISi =Σ ILi cosp β i.(2.2.1.9)

Intensitas cahaya yang dipantulkan (IR) dan dibiaskan (IT) specular dihitung untuk sinar yang dipantulkan dan dibiaskan pada langkah rekursi berikutnya. Jika batas kedalaman rekursi tercapai, maka intensitas tersebut dianggap nol. Dari intensitas IR diambil r persen, dan dari IT - t = 1 - r (lihat bagian sebelumnya).

Selain itu, koefisien berikut diperkenalkan: KD - koefisien refleksi permukaan difus, KS - koefisien silau - koefisien ini merupakan karakteristik kekasaran permukaan refleksi. Semakin tidak rata permukaannya, semakin sedikit cahaya yang dipantulkan secara spekuler dan semakin sedikit cahaya yang ditransmisikan, dan karenanya, semakin banyak cahaya yang dipantulkan secara menyebar.<= KD <= 1.

Pada KD = 0, semua cahaya yang jatuh ke permukaan dipantulkan dan dibiaskan. KD = 1 - semua cahaya dipantulkan secara menyebar. Intensitas cahaya yang dipantulkan secara menyebar dan intensitas penerangan latar belakang dikalikan dengan faktor ini. Intensitas cahaya yang dipantulkan dan dibiaskan secara spekuler dikalikan dengan (1 - KD) - koefisien ini bertanggung jawab atas kecerahan silau dari sumbernya. 0<=KS<=1.

Bila KS = 0 - silau tidak terlihat, bila KS = 1 - kecerahan silau maksimal.

Jadi, rumus akhir untuk menghitung intensitas suatu benda di suatu titik adalah sebagai berikut:

I = IAKD + ​​​​Σ(ILiKDcos αi + ILiKScosp β i) + (1 - KD)(IRr + IT(1 - r)).(2.2.1.10)

Perlu diperhatikan bahwa intensitas akhir tidak boleh lebih besar dari satu. Jika ini terjadi, titik pada gambar ini akan menjadi terlalu terang. Intensitasnya harus diatur ulang menjadi satu.

Untuk memperoleh citra berwarna perlu dilakukan perhitungan secara terpisah untuk komponen cahaya merah, hijau dan biru. Warna suatu piksel gambar akan dihitung dengan mengalikan setiap komponen intensitas dengan angka yang menentukan jumlah maksimum gradasi intensitas pada gambar. Untuk gambar 32-bit sama dengan 255 untuk setiap warna (R, G, B).

255*IR,= 255*IG,= 255*IB.

Di sini IR (jangan bingung dengan intensitas cahaya yang dipantulkan secara spekuler), IG, IB adalah intensitas ketiga komponen cahaya pada suatu titik, diperoleh dengan menggunakan rumus di atas.

Koefisien KD, KS, p adalah ciri individu suatu benda, yang mencerminkan sifat-sifatnya. Selain itu, ada koefisien lain - indeks bias absolut n. n = c/v, dimana c adalah kecepatan cahaya dalam ruang hampa, v adalah kecepatan cahaya dalam medium (di dalam benda). Untuk benda yang benar-benar buram, koefisien ini sama dengan ∞ (karena kecepatan cahaya di dalam benda adalah nol). Dalam program untuk menentukan benda yang sepenuhnya buram, Anda perlu menyetel koefisien ini >> 1 (sekitar 10.000). Dalam hal ini, fraksi cahaya yang dipantulkan secara spekuler r akan cenderung ke satu, dan fraksi cahaya yang dibiaskan, masing-masing, ke nol.

Perhitungan normal.

Dalam algoritma tracing, normals pada objek diperlukan untuk menghitung sinar pantul dan sinar bias, serta untuk menentukan iluminasi sesuai model Phong.

Program ini berisi tiga jenis primitif yang menjadi dasar pembuatan adegan. Ini adalah poligon (segitiga), ellipsoid dan paraboloid. Dua yang terakhir diperkenalkan untuk simulasi kaca yang lebih realistis (bisa saja dibuat dari poligon, tetapi modelnya akan lebih kasar).

Perhitungan normal ke poligon (segitiga).

Menghitung normal segitiga direduksi menjadi operasi perkalian vektor. Misalkan segitiga ABC diberikan koordinat ketiga titik sudutnya:

XA, YA, ZA, XB, YB, ZB, XC, YC, ZC.

Mari kita hitung koordinat dua buah vektor, misalnya AB dan AC:

XB - XA,= XB - XA,

ZAB = XB - XA,(2.2.2.1)= XC - XA,= XC - XA,= XC - XA.

Koordinat vektor normal akan dihitung dengan menggunakan rumus:

YABZAC - YACZAB,= XABZAC - XACZAB,(2.2.2.2)= XABYAC - XACYAB.

Tidak perlu menghitung koordinat vektor normal segitiga setiap kali berada di badan penelusuran, karena garis normalnya sama di setiap titik segitiga. Cukup menghitungnya sekali di bagian inisialisasi program dan menyimpannya. Saat Anda memutar segitiga, Anda juga harus memutar normalnya.

Perhitungan permukaan normal ke orde kedua.

Permukaan orde kedua diberikan dalam kasus umum dengan persamaan bentuk:

Q(x,y,z) = a1x2 + a2y2 + a3z2 + b1yz + b2xz + b3xy + c1x +c2y +c3z + d =0.

Namun kami akan menggunakan bentuk pencatatan yang berbeda. Maka persamaan ellipsoidnya akan terlihat seperti ini:

(x-x0)2/A2 + (y-y0)2/B2 + (z-z0)2 /C2 = 1,(2.2.2.3)

dimana x0, y0, z0 adalah koordinat pusat ellipsoid, A, B, C adalah panjang setengah sumbu ellipsoid.

Persamaan paraboloid:

(x-x0)2/A2 + (y-y0)2/B2 - (z-z0)2 /C2 = 1,(2.2.2.4)

dimana x0, y0, z0 adalah koordinat pusat paraboloid, A, B, C adalah panjang setengah sumbu paraboloid. Sumbu paraboloid terletak di sepanjang sumbu Oz pada sistem koordinat dunia. Untuk menghitung koordinat vektor normal, perlu menghitung turunan parsial terhadap x, y, z.

Koordinat vektor normal ellipsoid:

Yn = 2(y-y0)/B2,= 2(z-z0)/C2.

Arah vektor tidak akan berubah jika seluruh koordinatnya dibagi 2:

Xn = (x-x0)/A2,= (y-y0)/B2,(2.2.2.5)

Zn = (z-z0)/C2.

Koordinat vektor normal paraboloid dihitung dengan cara yang sama:

Xn = (x-x0)/A2,= (y-y0)/B2,(2.2.2.6)

Zn = - (z-z0)/C2.

Normal untuk permukaan orde kedua harus dihitung langsung di badan penelusuran, karena normalnya berbeda di berbagai titik pada gambar.

Perhitungan sinar pantul.

Misalkan vektor sinar datang S diketahui dan diketahui vektor normal N. Kita perlu mencari vektor sinar pantul R.

Mari kita perhatikan vektor satuan R1, S1 dan N1. Karena vektor-vektor garis normal, sinar datang, dan sinar pantul berada pada bidang yang sama, kita dapat menulis R1 + S1 = N`, dengan N` adalah vektor yang bersesuaian dengan diagonal belah ketupat dan searah dengan garis normal. . Panjang vektor N` adalah 2cosθ. Karena vektor N` berimpit dengan arah N1, maka

N` = N`2cosθ.

Dari sini kita mencari vektor satuan sinar pantul:

R1 = N1 2cosθ - S1 = N/|N| 2cosθ - S/|S|.

Mari kita cari cosθ. Hal ini dapat dilakukan dengan menggunakan perkalian skalar dari vektor N dan S:


Dengan asumsi vektor sinar pantul yang diinginkan mempunyai panjang yang sama dengan vektor sinar datang, yaitu R = |S| R1, kita dapat

N 2NS/|N|2 - S.

Ini adalah solusi dalam bentuk vektor. Mari kita tuliskan koordinat vektornya:

2xN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) - xS,= 2yN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) - yS,(2.2.3.1)= 2zN(xNxS+yNyS +zNzS)/(xN2+yN2+zN2) - zS.

Perhitungan sinar bias.

Misalkan diberikan dua vektor satuan: S1 adalah vektor sinar datang, dan N1 adalah vektor normal antarmuka antara dua media. Selain itu, dua indeks bias untuk media ini harus diketahui - n1 dan n2 (atau rasionya).

Diperlukan untuk mencari vektor satuan sinar bias T1. Untuk mengatasinya, mari kita lakukan beberapa konstruksi geometris.

Vektor T1 yang diperlukan sama dengan jumlah dua vektor:

Mari kita cari dulu vektornya NT. Arahnya berlawanan dengan vektor normal, dan panjangnya |T1| cos α2 = cos α2 (karena T1 adalah satuan). Jadi, NT = -N1 cos α2. Penting untuk menentukan cos α2. Mari kita tuliskan hukum pembiasan n1 sin α1 = n2 sin α2 dalam bentuk:

dosa α2 = n dosa α1,

dimana n = n1 / n2.

Mari kita gunakan identitas cos2α + sin2α = 1. Maka

cos α2 = √ 1 - sin2α2 = √ 1 - n2 sin2α1

cos α2 = √ (1 + n2 (cos2α1 - 1)

Nilai cos α1 dapat dinyatakan melalui perkalian skalar vektor satuan S1 dan N1, yaitu cos α1 = S1N1. Kemudian kita dapat menulis ekspresi berikut untuk vektor NT:

N1√1+n2((S1N1)2 - 1).

Masih mencari ekspresi untuk vektor B. Letaknya pada garis yang sama dengan vektor A, dan A = S1 - NS. Mengingat NS sama dengan N1 cos α1, maka A = S1 - N1 cos α1. Karena cos α1 = S1N1, maka A = S1 - N1 (S1N1).

Karena panjang vektor A sama dengan sin α1, dan panjang vektor B sama dengan sin α2, maka

|B|/|SEBUAH| = dosa α2/ dosa α1 = n2/n1 = n,

dimana |B| = n |A|. Dengan memperhatikan posisi relatif vektor A dan B, kita peroleh

TIDAK =n(N1(S1N1) - S1).

Sekarang kita dapat menuliskan ekspresi yang diinginkan untuk vektor satuan sinar bias T1:

T1 = nN1 (S1N1) - nS1 - N1√1 + n2 ((S1N1)2 - 1).(2.2.4.1)

Perhitungan titik potong dengan primitif.

Dalam algoritma penelusuran, untuk membuat suatu gambar, perlu menghitung titik potong sinar dengan pemandangan primitif. Sinar diberikan oleh persamaan parametrik garis lurus. Titik mana pun pada sinar tersebut memenuhi persamaan

R = SEBUAH + Vt,(2.2.5.1)

dimana R adalah vektor jari-jari suatu titik sembarang milik sinar, A adalah vektor jari-jari titik awal sinar, V adalah vektor arah sinar, t adalah parameter.

Jika vektor arah V dinormalisasi, maka parameter t secara numerik sama dengan jarak dari titik awal sinar A ke titik R.

Anda dapat menulis persamaan ini dalam bentuk koordinat:

x = x1 + pada,= y1 + bt,(2.2.5.2)= z1 + ct.

Disini x1, y1, z1 adalah koordinat titik awal sinar pada sistem koordinat dunia kartesius persegi panjang, a, b, c adalah koordinat vektor pemandu sinar.

Perhitungan titik potong sinar dengan permukaan orde kedua.

Untuk mencari titik potong sinar yang diberikan persamaan (2) dengan permukaan orde kedua yang diberikan persamaan (2.2.2.3) atau (2.2.2.4):

(x-x0)2/A2 + (y-y0)2/B2 + (z-z0)2 /C2 = 1 (ellipsoid)

(x-x0)2/A2 + (y-y0)2/B2 - (z-z0)2 /C2 = 1 (paraboloid),

Anda perlu mengganti persamaan sinar yang sesuai ke dalam persamaan permukaan orde kedua, bukan x, y, dan z. Sebagai hasilnya, setelah membuka semua tanda kurung dan membawa tanda kurung yang serupa, kita memperoleh persamaan kuadrat terhadap parameter t. Jika diskriminan suatu persamaan kuadrat kurang dari nol, maka sinar dan permukaan orde kedua tidak mempunyai titik potong yang sama. Jika tidak, dua nilai untuk parameter t dapat dihitung. Diskriminan bisa sama dengan nol - ini sesuai dengan kasus pembatas sinar yang menyentuh permukaan, dan kita akan mendapatkan dua nilai parameter t yang bertepatan.

Untuk mencari koordinat titik potong sinar dan permukaan, cukup dengan mensubstitusikan nilai parameter t yang ditemukan ke dalam persamaan sinar (2).

Dalam program ini, ketika dua persimpangan ditemukan, persimpangan terdekat dipilih untuk visualisasi. Persimpangan terdekat ditentukan dengan membandingkan parameter yang ditemukan t. Lebih dekat ke titik pengamatan adalah persimpangan yang sesuai dengan parameter t yang lebih kecil. Di sini perlu dicatat bahwa sebagai hasil penyelesaian persamaan kuadrat, salah satu atau kedua nilai parameter t mungkin menjadi negatif. Artinya, titik potongnya terletak “di belakang” relatif terhadap titik asal sinar, pada separuh garis lurus yang terletak “di sisi kita” relatif terhadap bidang gambar. Titik-titik tersebut dibuang saat mencari persimpangan.

Selain itu, program ini mencakup bidang potong atas dan bawah untuk setiap gambar. Hanya bagian gambar yang terletak di antara keduanya yang ditampilkan.

Untuk melakukan ini, setelah menemukan titik potong, dianalisis koordinat z-nya.

Perhitungan titik potong sinar dengan poligon (segitiga).

Untuk menghitung titik potong sinar yang diberikan oleh persamaan (2), pertama-tama perlu ditentukan titik potong sinar tersebut dengan bidang yang memuat segitiga tersebut.

Persamaan bidangnya terlihat seperti ini:

Q(x, y, z) = Kapak + Oleh + Cz +D = 0.(2.2.5.3)

Di sini koefisien A, B, C bertepatan dengan koordinat garis normal bidang ini. Koordinat normal bidang bertepatan dengan koordinat normal segitiga yang kita hitung pada tahap pemuatan pemandangan.

Untuk mencari suku bebas D, perlu mengganti koordinat titik mana pun dalam segitiga, misalnya salah satu titik sudut.

Kapak -Oleh - Cz.(2.2.5.4)

Selama eksekusi program, nilai D tidak akan berubah, jadi disarankan untuk menghitungnya saat menginisialisasi adegan dan menyimpannya, seperti koordinat normal. Perhitungan ulang hanya perlu dilakukan jika posisi segitiga berubah.

Sekarang, untuk mencari titik potongnya, kita substitusikan persamaan sinar (2) ke dalam

persamaan bidang.

(x1 + at) + B (y1 + bt) + C (z1 + ct) + D = 0

Dari mana kita mendapatkannya?

= - (Ax1 + By1 + Cz1 + D) / (Aa + Bb + Cc)(2.2.5.5)

Jika penyebut pecahan tersebut nol, maka sinarnya sejajar dengan bidang tempat segitiga berada. Tidak ada titik persimpangan.

Untuk mencari koordinat titik potong, Anda perlu mensubstitusikan nilai parameter t yang ditemukan ke dalam persamaan sinar (2). Sebut saja titik potongnya D. Kita peroleh koordinat xD, yD, zD.

Sekarang Anda perlu menentukan apakah titik D berada di dalam segitiga. Carilah koordinat vektor AB, BC, CA (A, B, C adalah titik sudut segitiga) dan koordinat vektor AD, BD, CD. Kemudian kita menemukan tiga produk vektor:

nA = AB x IKLAN,= BC x BD,(2.2.5.6)= CA x CD.

Vektor-vektor ini akan kolinear. Jika ketiga vektor tersebut searah, maka titik D terletak di dalam segitiga. Co-directionity ditentukan oleh persamaan tanda-tanda koordinat yang bersesuaian dari ketiga vektor.

Pengoperasian pengecekan apakah titik D termasuk dalam segitiga ABC dapat dipercepat. Jika kita memproyeksikan segitiga ABC dan titik D secara ortogonal pada salah satu bidang xOy, yOz, atau xOz, maka proyeksi titik yang masuk ke dalam proyeksi segitiga berarti titik itu sendiri yang jatuh ke dalam segitiga (tentu saja jika sudah diketahui bahwa titik D terletak pada bidang yang memuat segitiga ABC ). Pada saat yang sama, jumlah operasi berkurang secara signifikan. Jadi, untuk mencari koordinat semua vektor, Anda perlu mencari dua koordinat untuk setiap vektor, dan saat mencari produk vektor, Anda perlu mencari satu koordinat saja (sisanya sama dengan nol).

Untuk memeriksa arah bersama dari vektor-vektor yang diperoleh saat menghitung perkalian vektor, Anda perlu memeriksa tanda-tanda koordinat tunggal ini untuk ketiga vektor. Jika semua tanda lebih besar dari nol atau kurang dari nol, maka vektor-vektor tersebut searah. Jika salah satu hasil kali vektornya nol, hal ini sesuai dengan kasus ketika titik D jatuh pada garis yang memuat salah satu sisi segitiga.

Selain itu, uji dimensi sederhana dapat dilakukan sebelum menghitung vektor dan perkalian silang. Jika proyeksi titik D terletak ke kanan, kiri, atas, atau bawah setiap proyeksi titik sudut segitiga, maka titik tersebut tidak dapat terletak di dalam.

Perlu ditambahkan bahwa untuk proyeksi lebih baik memilih bidang yang luas proyeksi segitiganya lebih besar. Dalam kondisi ini, kasus memproyeksikan segitiga menjadi suatu segmen dikecualikan (asalkan segitiga yang diuji tidak merosot menjadi suatu segmen). Selain itu, seiring bertambahnya area proyeksi, kemungkinan kesalahan berkurang. Untuk menentukan bidang proyeksi seperti itu, cukup dengan memeriksa ketiga koordinat segitiga normal. Jika koordinat z dari garis normal lebih besar (dalam nilai absolut) x dan y, maka harus diproyeksikan ke bidang xOy. Jika y lebih besar dari x dan z, maka kita proyeksikan ke xOz. Dalam kasus yang tersisa - di yOz.

Deskripsi tipe data. Struktur program.

Deskripsi modul program

Daftar modul:.h-deskripsi struktur TTex.h-deskripsi struktur TPlaneTex dan TEllipsoidTex.h-deskripsi struktur TPoint2d dan TPoint3d.h-deskripsi struktur TRGBColor.h-deskripsi kelas TLamp .h-deskripsi kelas TCam.h-deskripsi kelas TPrimitif Deskripsi kelas h Deskripsi kelas TFrstSurface.h Deskripsi kelas TScndSurface.h Deskripsi kelas TTriangle.h Deskripsi kelas TEllipsoid.h Deskripsi kelas TCylinder.h deskripsi kelas THyperboloidVert.h deskripsi kelas THyperboloidHor.h deskripsi TScene.h- deskripsi kelas TTracer

Modul implementasi, antarmuka program:

Options.h-module dari formulir "Opsi".

ExtraCamOptions.h-modul dari formulir "Properti Kamera".

MainUnit.h-module dari bentuk utama program

Penjelasan singkat tentang struktur dan kelas program: TPoint3d - struktur yang menggambarkan suatu titik dalam sistem koordinat dunia, TPoint2d - struktur yang menggambarkan suatu titik pada bidang (dalam tekstur) dengan koordinat bilangan bulat, TRGBColor - sebuah struktur yang mendeskripsikan warna dalam tiga komponen (RGB), TTex - struktur yang mendeskripsikan tekstur - berisi alamat larik piksel dan dimensinya, TPlaneTex - struktur yang mendeskripsikan pengikatan tekstur ke bidang.

Berisi tiga titik yang dilampirkan tekstur: TLamp ​​​​- kelas yang mendeskripsikan sumber cahaya.

Berisi objek coord TPoint3d dengan koordinat sumber dan tiga variabel float (Ir, Ig, Ib) untuk menyimpan intensitas tiga komponen cahaya.TCam adalah kelas yang mendeskripsikan kamera.

Berisi dua sudut (a,b) yang menunjukkan arah pandang kamera, titik yang ditunjuk kamera (viewP), dan jarak kamera ke titik tersebut (r). TPrimitive adalah kelas primitif abstrak. Permukaan orde pertama dan kedua diwarisi darinya.TFrstSurface adalah kelas abstrak dari permukaan orde pertama. Kelas segitiga diwarisi darinya. TScndSurface adalah kelas permukaan abstrak orde kedua. Kelas ellipsoid dan paraboloid diwarisi darinya.TTiangle adalah kelas segitiga. Berisi tiga simpul segitiga dan normalnya. TCylinder - kelas silinder. THyperboloidVert - kelas hiperboloid satu lembar yang terletak di sepanjang sumbu oZ. THyperboloidHor - kelas hiperboloid satu lembar yang terletak di sepanjang sumbu oX. TEllipsoid - kelas dari sebuah ellipsoid.TScene - kelas sebuah adegan. Berisi informasi tentang semua primitif, sumber, dan kamera.TTracer adalah kelas yang bertanggung jawab untuk membuat gambar. Berisi buffer berukuran 400x400 piksel, tempat terbentuknya gambar pemandangan. Sebelum pembuatan, Anda perlu memanggil fungsi tersebut, meneruskannya sebagai parameter penunjuk ke adegan yang perlu dibuat. Untuk menghasilkan, panggil fungsi render.

Semua kelas turunan TPrimitive menyediakan fungsi berikut: getT(TPoint3d p0, TPoint3d viewDir) - mengembalikan jarak dari titik awal (p0) sinar viewDir ke titik persimpangan terdekat dengan primitif.

void getTArr(float* arr, int& n, TPoint3d p0, TPoint3d viewDir) - mengisi array arr dengan jarak dari titik awal (p0) sinar viewDir ke semua titik persimpangan terdekat dengan primitif.

void getNormal(TPoint3d& n, const TPoint3d& p) - mengembalikan koordinat vektor normal ke primitif di titik p.

void getColor(TRGBColor& c, const TPoint3d& p) - mengembalikan warna primitif pada titik p (dengan mempertimbangkan tekstur).

3. BAGIAN TEKNOLOGI

Memilih bahasa pemrograman.

Saat mengembangkan program, bahasa pemrograman tingkat tinggi C++ digunakan sebagai bagian dari lingkungan pemrograman visual CodeGear RAD Studio untuk Windows.

Bahasa ini dipilih karena menyediakan cara yang paling nyaman untuk bekerja dengan RAM dan memungkinkan Anda mengimplementasikan algoritma dengan lebih efisien dibandingkan dengan bahasa tingkat tinggi lainnya. Program yang ditulis dalam C++ berjalan lebih cepat dan menggunakan lebih sedikit ruang disk.

Selain itu, lingkungan pemrograman visual CodeGear RAD Studio untuk Windows

menyediakan sejumlah besar komponen visual standar untuk membuat antarmuka, dan sejumlah perpustakaan dengan berbagai fungsi berguna yang umum digunakan. Selain itu, penulis karyanya memiliki pengalaman pemrograman terhebat dalam lingkungan pemrograman visual ini.

Formulir pilihan. Tab pencahayaan.

Tab ini berisi alat untuk mengatur pencahayaan pemandangan.

Koordinat sumber - koordinat dalam sistem koordinat dunia dari sumber cahaya yang dipilih dalam daftar drop-down.

Intensitas sumber - nilai dari tiga komponen intensitas sumber cahaya yang dipilih dalam daftar drop-down.

Intensitas latar belakang - nilai dari tiga komponen intensitas latar belakang.

Tombol "+" (di sebelah daftar drop-down) - menambahkan sumber cahaya baru.

Tombol “-” (di sebelah daftar drop-down) - menghapus sumber cahaya yang dipilih dalam daftar drop-down.

Formulir pilihan. Tab kamera.

Tab ini berisi alat untuk mengonfigurasi opsi kamera.

Pratinjau - di sini Anda dapat melihat perkiraan tampilan gambar sebelum dibuat.

Navigasi - pengaturan posisi kamera.

Selain itu - ketika Anda mengklik tombol ini, sebuah formulir muncul

Properti kamera dengan opsi kamera tambahan.

Bentuk properti kamera.

Radius - jarak dari kamera ke titik yang dituju.

Langkah perubahan radius - menambah radius kamera dengan menekan tombol “-” sekali pada tab “Kamera” pada formulir “Opsi” (atau menguranginya dengan menekan tombol “+” sekali).

Formulir pilihan. tab "bahan".

Menu ini menampilkan parameter material meja tempat panggung berdiri.

Warna – warna bahan meja.

Koefisien. refleksi difus - koefisien Kd dari bahan tabel (lihat bagian 2.2.1).

Tekstur - jika kotak centang dicentang, tekstur akan ditampilkan pada tabel

Pilih tekstur - pilih file gambar (*.bmp) yang akan digunakan sebagai tekstur tabel.

Lanjutan - ketika Anda mengklik tombol ini, formulir Properti Tabel muncul dengan parameter tambahan untuk materi tabel.

Bentuk properti tabel.

Koefisien silau adalah koefisien KS dari bahan tabel (lihat bagian 2.2.1).

Kekaburan sorotan adalah eksponen p dari materi tabel.

Pengulangan tekstur - berapa kali tekstur tabel akan diulang sepanjang sumbu OX dan OY.

Formulir pilihan. Tab sistem.

Pada tab ini Anda dapat mengonfigurasi algoritma yang diterapkan dalam program.

Kedalaman rekursi - parameter ini menetapkan kedalaman rekursi dalam algoritma penelusuran. Dengan nilai parameter ini yang lebih besar, kualitas gambar yang dihasilkan akan meningkat.

PERHATIAN!

Kedalaman rekursi SANGAT mempengaruhi kecepatan pembuatan gambar. Tidak disarankan untuk menyetel parameter ini ke nilai lebih besar dari 10.

Antialiasing - mengaktifkan algoritma penghalusan gambar.

Jenis bayangan - pilih algoritma pembuatan bayangan.

4. BAGIAN PENELITIAN

Penelitian dilakukan pada komputer dengan konfigurasi sebagai berikut:

CPU - Intel Core 2 Duo T5850- 2048Mb DDR2 - Nvidia GForce 9300M 256Mb- Windows 7

4.1 Ketergantungan waktu pembangkitan pada kedalaman rekursi

Tes ini menguji ketergantungan waktu pembuatan gambar pada kedalaman rekursi. Studi dilakukan untuk pemandangan yang disinari oleh satu sumber cahaya. - Waktu pembangkitan tanpa bayangan dalam hitungan detik. - Waktu pembangkitan dengan bayangan padat dalam hitungan detik. - Kedalaman rekursi.


4.2 Ketergantungan waktu pembangkitan pada jumlah sumber


4.3 Analisis hasil penelitian

Dari studi pertama terlihat jelas bahwa waktu pembangkitan meningkat pesat seiring dengan jumlah level rekursi. Hal ini sesuai dengan teori, karena jumlah sinar meningkat dengan meningkatnya kedalaman rekursi.

Perlu dicatat bahwa untuk adegan dengan jumlah poligon yang sedikit, tidak perlu menetapkan nilai yang besar untuk kedalaman rekursi maksimum, karena perbedaan kualitas gambar yang dihasilkan tidak akan signifikan.

Studi kedua menunjukkan bahwa ketergantungan waktu pembangkitan terhadap jumlah sumber cahaya adalah linier. Dari nilai yang diperoleh, Anda dapat menghitung waktu yang diperlukan untuk menghitung satu sumber. Pada mesin tempat penelitian dilakukan, dengan kedalaman rekursi 5, waktu ini kira-kira 0,5 detik.

KESIMPULAN

Program ini mendemonstrasikan hasil algoritma untuk menghasilkan gambar realistis - reverse ray tracing.

Implementasi ini menunjukkan kemampuan algoritme untuk membuat gambar mendekati fotorealistik. Tracing adalah salah satu algoritma paling canggih untuk menghasilkan gambar realistis. Kualitas gambar yang dihasilkan jauh lebih baik dibandingkan kualitas gambar yang diperoleh dengan menggunakan algoritma seperti Z-buffer. Namun, persyaratan daya komputasi yang diperlukan untuk menghasilkan satu bingkai gambar jauh lebih tinggi dibandingkan dengan buffer Z yang sama. Saat ini, algoritme penelusuran sinar balik waktu nyata hanya digunakan untuk tujuan penelitian pada komputer super canggih yang tidak dapat diakses oleh pengguna rata-rata. Tentu saja, ada penggemar yang membuat game 3D dan aplikasi grafis real-time lainnya yang didasarkan pada algoritma penelusuran sinar terbalik, tetapi biasanya mereka memiliki FPS yang sangat rendah, atau dasar dari semua objek dalam pemandangan adalah sebuah bola - yang paling mudah untuk melacak permukaan sinar. Namun agar algoritme ini menguntungkan untuk digunakan dalam proyek massal, seperti game 3D, diperlukan terobosan nyata di bidang perangkat keras komputer desktop.

Bahkan dengan menggunakan contoh permainan komputer, orang dapat dengan mudah melihat redundansi algoritma reverse ray tracing. Lagi pula, pemain, yang terpikat oleh gameplaynya, kemungkinan besar tidak akan mengagumi rendering bayangan dan pantulan objek game yang benar secara geometris. Dalam hal ini, perkiraan menggambar menggunakan poligon merupakan keuntungan yang signifikan saat ini, karena tidak memerlukan komputer yang kuat, dan hasilnya mendekati kenyataan.

Algoritme penelusuran sinar juga diyakini ideal untuk gambar objek buatan dengan bentuk geometris sederhana, misalnya mobil, pesawat terbang, bangunan, dll. Menghasilkan objek seperti wajah manusia, bulu binatang, atau hutan adalah tugas yang sangat sulit untuk dilakukan. algoritmanya, yang meningkat Jadi ada banyak persyaratan untuk perangkat keras komputer.

Namun, saat ini Anda sudah bisa melihat penelitian tentang penerapan algoritma reverse ray tracing secara real time. Biasanya, dalam proyek semacam itu, mobil digunakan sebagai panggung. Namun fotorealisme absolut pada gambar telah tercapai, dan selain itu, hanya diperlukan sedikit waktu untuk menghasilkan satu bingkai. Tentu saja, proyek-proyek ini diimplementasikan pada komputer yang sangat kuat, tetapi tidak lama lagi aplikasi 3D tersebut akan tersedia untuk rata-rata pengguna.

BIBLIOGRAFI

1. Rogers D. Dasar-dasar algoritma grafik mesin: trans. dari bahasa Inggris - M.: Mir, 1989. - 512 hal.

Porev V. N. Grafik komputer. - SPb.: BHV-Petersburg, 2002. - 432 hal.

Nikulin E.A. Geometri komputer dan algoritma grafik komputer. Sankt Peterburg: BHV-Petersburg, 2003. - 560 hal.

Angel E. Grafik komputer interaktif. - “Williams”, 2001. - 592 hal.: sakit. - Paralel. Titus Dari bahasa Inggris

Avdeeva S.M., Kurov A.V. Algoritma untuk grafik komputer tiga dimensi: Buku Teks. - M.: Penerbitan MSTU im. NE. Bauman, 1996. - 60 hal.


Kembali

×
Bergabunglah dengan komunitas “koon.ru”!
Berhubungan dengan:
Saya sudah berlangganan komunitas “koon.ru”