Pelacakan sinar secara real time. DirectX Raytracing: penelusuran sinar waktu nyata

Belum lama ini, 4A Games, pencipta game Metro yang sangat realistis, merilis video menggunakan teknologi RTX Nvidia menggunakan METRO: EXODUS sebagai contoh. Inovasi grafis ini merupakan langkah maju yang besar dan percaya diri dalam ray tracing. Tapi apa artinya semua ini?

Di balik tabir kerahasiaan

Mari kita mulai dari awal. Pertama, rendering ray tracing adalah salah satu jenis visualisasi dasar yang digunakan dalam film dan berbagai jenis desain: dari industri hingga arsitektur. Artinya, apa yang Anda lihat di situs web sebagai foto peralatan sebenarnya adalah render 3d.

Inti dari teknologi ini adalah bahwa komputer memodelkan perilaku fisik cahaya dengan menghitung lintasan foton cahaya individu bersyarat, yaitu, jika seberkas sinar jatuh pada suatu objek, maka sinar itu dibiaskan di dalamnya atau dipantulkan darinya pada satu objek. sudut atau lainnya. Hasilnya adalah jejak tertentu dari sinar cahaya ini, maka nama "ray tracing".

Gambar yang dihasilkan komputer ini oleh Enrico Cerica menggunakan OctaneRender menunjukkan sinar, bayangan, dan pantulan pada permukaan lantai yang kompleks.

Satu-satunya masalah adalah bahwa banyak sinar diperlukan dan untuk masing-masing sinar itu perlu untuk menghitung berulang kali setiap tumbukan sinar dengan rintangan. Faktanya, ini adalah masalah matematika sederhana. Pertama, Anda perlu menghitung di mana balok mengenai objek yang ada, yaitu menghitung tumbukan, kemudian, berdasarkan properti yang ditentukan, Anda perlu membuat transformasi matematis lebih lanjut.


Skema ray tracing yang disederhanakan

Misalnya, ada permukaan matte dengan kekasaran bersyarat tertentu, tetapi tidak sepenuhnya kasar, dan balok menyimpang darinya dengan probabilitas tertentu dengan beberapa sudut yang berbeda dari sudut datang. Perlu diperhatikan bahwa jika benda memiliki sifat licin tak terhingga, maka sudut datang sama dengan sudut pantul. Jika sifat-sifat permukaan berbicara tentang kabut, maka secara matematis hal ini diwujudkan dengan penyimpangan sudut pantul dari sudut datang.

Dalam kehidupan, ini benar, permukaannya hampir selalu tidak sepenuhnya mulus. Oleh karena itu, ketika cahaya mengenai satu titik atau yang lain, itu dipantulkan relatif terhadap lokasi permukaan, yang entah bagaimana dapat diputar relatif terhadap bidang yang tampak genap bagi kita, dan sinar yang berdekatan dipantulkan ke arah yang sama sekali berbeda. Dengan demikian, menjadi sangat jelas bahwa tidak ada gunanya membuat model objek terlalu poligonal, sehingga ketidakteraturan ditentukan oleh sifat-sifat permukaan. Hasilnya mirip dengan hamburan cahaya sebenarnya dari permukaan matte.

Sekarang dalam permainan mereka menggunakan objek yang terlihat seperti diolesi dengan sesuatu seperti lapisan gula. Tidak diragukan lagi, semua orang telah melihat dinding dan lantai yang aneh dalam permainan yang terlihat seperti diolesi dengan sejenis lendir. Nah, Anda tidak perlu melakukan ini dengan ray tracing - permukaan dapat menyebarkan cahaya secara alami. Ini ditunjukkan dengan sempurna dalam demo, ada sejumlah area dari yang paling banyak dicerminkan hingga yang paling matte.

Terutama terlihat bahwa di area matte, pantulan sangat bergantung pada kedekatan objek dengan permukaan. Artinya, semakin jauh objek dari permukaan, semakin kabur. Ini adalah properti penting yang bahkan tidak kita sadari dalam hidup, meskipun itu ada.

Tapi yang paling penting adalah bayangannya. Tidak ada yang lebih buruk dari bayangan di game apa pun.

Ini biasanya hanya proyeksi objek yang memiliki tepi tajam dan tidak alami. Namun, ada bayangan yang lebih baik, menurut standar permainan. Ini adalah opsi lunak dengan garis transisi, yaitu bayangan dan penumbra.


Untuk membuat bayangan lembut atau pantulan yang menyebar (seperti yang Anda lihat pada logam yang disikat, misalnya), diperlukan teknik ray tracing yang lebih canggih.

Satu-satunya masalah adalah bahwa itu tidak bekerja seperti itu dalam kehidupan nyata. Jika sumber cahaya bukan sebuah titik dan jaraknya tidak terhingga, maka besar penumbra tergantung pada perbandingan jarak sumber cahaya dari benda dan jarak benda dari bayangannya. Artinya, tepi penumbra di tempat yang berbeda bisa lebih lebar atau lebih sempit, terutama jika menyangkut sumber cahaya yang besar.

Misalnya, cahaya dari jendela dalam cuaca berawan memberikan bayangan yang begitu lembut sehingga jika Anda menempatkan objek yang jauh lebih kecil dua meter dari jendela ini, Anda dapat melihat bayangan yang jelas dan bayangan sebagian di alasnya, dan mungkin tidak ada bayangan di semua dari bagian atas objek, dan penumbra tidak akan memiliki batas yang jelas. Dalam game dengan rasterisasi tradisional, ini tidak terjadi.

Pelacakan sinar tidak sulit, tetapi ada banyak sinar, dan, sayangnya, saat ini tidak mungkin untuk melakukan semuanya secara real time. Faktanya adalah bahwa dalam kehidupan sinar menyimpang ke arah yang sama sekali berbeda. Akan ideal jika sinar datang dibagi menjadi jumlah sinar yang tak terbatas, kecerahan total yang akan tergantung pada properti objek yang memantulkan dan kecerahan awal sinar datang.

Untuk mengurangi beban, Anda dapat membatasi jumlah sinar, jumlah tumbukan, tetapi pembatasan ini mengarah pada fakta bahwa dalam gambar Anda mendapatkan sedikit bayangan dan titik terang yang tidak wajar dari sumber cahaya. Artinya, jumlah data yang tidak mencukupi menyebabkan munculnya kebisingan, dan seluruh kesulitan terletak pada kenyataan bahwa tidak mungkin untuk menghitung adegan sekali dan kemudian mengubahnya hanya apa yang berubah dari bingkai ke bingkai, karena setiap objek bergerak berubah. semua rute dari semua sinar. Dari setiap gerakan kamera dan objek, Anda perlu "membangun kembali" seluruh adegan lagi, itulah sebabnya film dibuat oleh peternakan render dan banyak server yang terus-menerus, selama beberapa bulan, membuat grafik. Namun sayangnya, secara real time dalam game hal ini masih belum bisa dilakukan.

Oleh karena itu, muncul pertanyaan, bagaimana Nvidia dan mitra keluar dari situasi ini: apa yang mereka korbankan untuk mencapai pelacakan waktu nyata?

Dua bagian dari satu keseluruhan

Jika Anda dengan cermat mengikuti bagaimana gambar ditampilkan secara bertahap, Anda dapat melihat bahwa di suatu tempat setelah integrasi kelima, bayangan dan cahaya itu sendiri hampir tidak berubah secara nyata. Menjadi jelas di mana, apa dan bagaimana tampilannya dalam bentuk akhir. Untuk ini, pada prinsipnya, perangkat lunak waktu nyata diperlukan sehingga Anda dapat memutar sumber cahaya, memahami di mana akan ada beberapa silau dan kemudian memulai rendering akhir. Masih harus dilihat bagaimana bingkai terakhir dapat dipahami dari gambaran yang berlumpur. Faktanya, komputer pertama-tama memodelkan gambar bising asli, kemudian menganalisisnya dan, berdasarkan data yang diperoleh, menggambar yang lain - yang terakhir. Seperti yang telah ditunjukkan oleh praktik, pendekatan ini lebih sederhana dalam hal biaya sumber daya.

Faktanya, lompatan progresif dalam pengembangan pelacakan waktu nyata adalah pembuatan algoritme yang memungkinkan kami mengevaluasi gambar dari keadaan bising dan menggambarnya menjadi normal. Ini adalah inovasi kunci. Segala sesuatu yang lain banyak digunakan sebelumnya. Banyak perender memiliki rendering GPU dan plugin OpenGL yang didukung oleh kartu grafis apa pun yang kompatibel dengan OpenGL.

Hari ini diklaim bahwa teknik pengurangan kebisingan ini hanya berfungsi pada inti tender di kartu masa depan dari Nvidia. Tetapi pada kenyataannya, teknologi ini hanya ditampilkan dalam jumlah besar sekarang, dan tampaknya, tahun lalu, sejak Oktober, di salah satu acara, Unity menunjukkan teknologi ini untuk menghilangkan kebisingan dalam pelacakan waktu nyata.

Triknya adalah tidak semua objek berpartisipasi dalam ray tracing sebagaimana mestinya. Dalam hal ini, kami akan menyentuh topik iluminasi global - mekanisme penelusuran paling intensif sumber daya. Dalam kehidupan, objek apa pun yang terkena cahaya memantulkan sebagian dari cahaya ini. Misalnya, jika Anda mengarahkan sumber cahaya ke dinding hijau, maka semua pencahayaan akan berubah menjadi hijau, karena dinding hijau tidak menyerap cahaya dengan baik.


Pemantulan sinar cahaya dari permukaan

Tidak ada efek seperti itu dalam demo. Alih-alih memantulkan cahaya dan mengubah pola cahaya bingkai tergantung pada sumber cahaya, seluruh ruang dipenuhi dengan gambar-gambar cerah, yang membuat cahaya tampak dinamis. Faktanya, pengembang tidak menerapkan ray tracing ke detail seperti kabut dan api.

Faktanya adalah bahwa sinar cahaya harus dihitung terlepas dari apakah mereka jatuh pada benda atau tidak. Artinya, menambahkan sejumlah besar lampu adalah tugas yang agak sulit untuk menelusuri perhitungan. Selain itu, tidak ada objek dalam demo tekno mana pun yang meniru objek transparan.

Kapan kita akan melihat manfaatnya?

Berdasarkan kriteria yang dijelaskan di atas (kekaburan gambar dan penelusuran tidak semua objek), kita dapat mengatakan bahwa grafik dalam game belum dapat terlihat sedetail dan realistis seperti di film.

Namun, pasti ada kemajuan. Pertama, refleksi sekarang lebih mudah dilakukan, tidak perlu membuat peta bayangan dan cahaya - semua ini diselesaikan dengan tracing. Kedua, setidaknya beberapa kemiripan refleksi tersebar muncul. Ketiga, pencahayaan dan bayangan objek telah meningkat secara signifikan. Secara keseluruhan, dapat dikatakan bahwa ini dapat dianggap sebagai teknologi kunci dalam game yang tidak akan melepaskan posisinya dalam sepuluh tahun ke depan.

Teks: Alexey Kharitonov, QA, Bytex

Metode jejak kembali

metode jejak kembali sinar memungkinkan Anda untuk secara signifikan mengurangi pencarian sinar cahaya. Metode ini dikembangkan pada tahun 80-an, karya-karyanya dianggap fundamental diputihkan dan Kay. Menurut metode ini, ray tracing dilakukan bukan dari sumber cahaya, tetapi dalam arah yang berlawanan - titik pengamatan. Dengan cara ini, hanya sinar yang berkontribusi pada pembentukan gambar yang diperhitungkan.

Pertimbangkan bagaimana Anda bisa mendapatkan gambar bitmap dari beberapa adegan tiga dimensi menggunakan metode penelusuran belakang. Misalkan bidang proyeksi dibagi menjadi banyak kotak - piksel. Mari kita pilih proyeksi pusat dengan pusat menghilang pada jarak tertentu dari bidang proyeksi. Mari kita menggambar garis lurus dari pusat keturunan melalui tengah bujur sangkar (piksel) bidang proyeksi. Ini akan menjadi sinar jejak belakang utama. Jika garis lurus sinar ini mengenai satu atau lebih objek pemandangan, maka pilih titik perpotongan terdekat. Untuk menentukan warna piksel gambar, perlu memperhitungkan sifat-sifat objek, serta jenis radiasi cahaya apa yang jatuh pada titik objek yang sesuai.

Jika objeknya spekular (setidaknya sebagian), maka kita membangun sinar sekunder - sinar datang, dengan mempertimbangkan sinar jejak primer sebelumnya sebagai sinar refleksi. Di atas, kami mempertimbangkan refleksi spekular dan memperoleh rumus untuk vektor sinar pantul yang diberikan vektor sinar normal dan datang. Tapi di sini kita tahu vektor sinar pantul, tetapi bagaimana menemukan vektor sinar datang? Untuk melakukan ini, Anda dapat menggunakan rumus refleksi spekular yang sama, tetapi menentukan vektor sinar datang yang diperlukan sebagai sinar pantul. Artinya, refleksi kebalikannya saya.

Untuk cermin yang ideal, maka cukup untuk melacak hanya titik persimpangan berikutnya dari balok sekunder dengan beberapa objek. Cermin yang tidak ideal sangat memperumit penelusuran - perlu untuk melacak bukan hanya satu, tetapi banyak sinar datang, dan memperhitungkan kontribusi radiasi dari objek lain yang terlihat dari titik tertentu.

Jika objeknya transparan, maka perlu untuk membuat sinar baru, yang jika dibiaskan, akan memberikan sinar jejak sebelumnya. Di sini Anda juga dapat menggunakan reversibilitas, yang juga berlaku untuk pembiasan.

Jika suatu benda memiliki sifat pemantulan dan pembiasan difus, maka, dalam kasus umum, untuk cermin non-ideal, perlu untuk melacak sinar yang datang dari semua benda yang tersedia. Untuk pemantulan difus, intensitas cahaya yang dipantulkan diketahui sebanding dengan kosinus sudut antara vektor sinar dari sumber cahaya dan garis normal. Di sini, sumber cahaya dapat berupa objek apa pun yang terlihat dari titik tertentu, yang mampu mentransmisikan energi cahaya.

Ketika ternyata; bahwa arus tracing ray tidak memotong objek apapun, tetapi masuk ke ruang bebas, maka tracing untuk ray ini berakhir.

Beras. 14.1 Contoh penelusuran sinar terbalik.

Pelacakan sinar dalam bentuk yang kami pertimbangkan di sini, meskipun mengurangi pencacahan, tidak memungkinkan untuk menghilangkan tak terhingga jumlah sinar yang dianalisis. Memang, metode ini memungkinkan untuk segera mendapatkan satu sinar mundur primer untuk setiap titik gambar. Namun, sudah ada sinar refleksi sekunder dalam jumlah tak terbatas. Jadi, misalnya, jika suatu objek dapat memantulkan cahaya dari objek lain, dan jika objek lain ini cukup besar, maka titik mana dari objek yang memancarkan harus diperhitungkan untuk membangun sinar yang sesuai, misalnya, dalam refleksi difus? Jelas semua poin.

Cara kerja ray tracing:

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

2. Dari titik perpotongan pertama balok dengan bola, sinar pantul dipancarkan. Biarkan permukaan menjadi buram. Maka kita tidak menggambar sinar bias. Kami menunjuk sinar bayangan dari titik persimpangan ke sumber cahaya. Karena sinar ini tidak melintasi permukaan buram lainnya, sumber cahaya secara langsung mempengaruhi intensitas iluminasi pada titik tertentu.

3. Biarkan sinar yang dipantulkan memotong objek lain, kali ini bola tembus cahaya yang memantulkan dan mentransmisikan cahaya. Sinar pantul dan sinar bias dipancarkan bersama dengan sinar bayangan menuju sumber cahaya. Sinar yang ditransmisikan berubah arahnya sebelum dan sesudah memasuki bola sesuai dengan efek pembiasan.

4. Biarkan titik di mana sinar melintasi bola tidak secara langsung disinari oleh sumbernya, karena jalur sinar bayangan terhalang oleh permukaan buram. Jika pemandangan itu mengandung banyak sumber cahaya, maka sinar bayangan harus dilemparkan ke masing-masing sumber cahaya itu.

5. Pengaruh semua sinar yang dibangkitkan secara eksplisit atau implisit menggunakan sinar awal dijumlahkan dan hasilnya menentukan nilai RGB dari titik ini.

Di Gamescom 2018, Nvidia mengumumkan serangkaian kartu grafis Nvidia GeForce RTX yang akan mendukung teknologi ray tracing real-time Nvidia RTX. Editor kami menemukan cara kerja teknologi ini dan mengapa itu diperlukan.

Apa itu Nvidia RTX?

Nvidia RTX adalah platform yang berisi sejumlah alat yang berguna untuk pengembang yang membuka akses ke tingkat baru grafik komputer. Nvidia RTX hanya tersedia untuk kartu grafis Nvidia GeForce RTX generasi baru berdasarkan arsitektur Turing. Fitur utama dari platform adalah kemungkinan penelusuran sinar waktu nyata(juga disebut penelusuran sinar).

Apa itu penelusuran sinar?

Ray tracing adalah fitur yang memungkinkan Anda untuk mensimulasikan perilaku cahaya, menciptakan pencahayaan yang dapat dipercaya. Sekarang dalam permainan, sinar tidak bergerak dalam waktu nyata, itulah sebabnya gambar, meskipun sering terlihat indah, masih tidak cukup realistis - teknologi yang saat ini digunakan akan membutuhkan banyak sumber daya untuk penelusuran sinar.

Ini dikoreksi oleh seri kartu grafis Nvidia GeForce RTX baru, yang memiliki kekuatan yang cukup untuk menghitung jalur sinar.

Bagaimana itu bekerja?

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

  • Refleksikan - ini akan memicu munculnya pantulan di permukaan;
  • Berhenti - ini akan membuat bayangan di sisi objek yang tidak terkena cahaya
  • Bias - ini akan mengubah arah sinar atau mempengaruhi warna.
Kehadiran fungsi-fungsi ini memungkinkan Anda untuk membuat pencahayaan yang lebih dapat dipercaya dan grafik yang realistis. Proses ini sangat intensif sumber daya dan telah lama digunakan dalam pembuatan efek film. Satu-satunya perbedaan adalah bahwa ketika merender bingkai film, penulis memiliki akses ke sejumlah besar sumber daya dan, dapat dianggap, periode waktu yang tidak terbatas. Dalam permainan, perangkat memiliki sepersekian detik untuk membentuk gambar, dan kartu video digunakan, paling sering, satu, dan bukan beberapa, seperti dalam pemrosesan gambar bergerak.

Hal ini telah mendorong Nvidia untuk memperkenalkan core tambahan dalam kartu grafis GeForce RTX yang akan mengambil sebagian besar beban kerja, meningkatkan kinerja. Mereka juga dilengkapi dengan kecerdasan buatan, yang bertugas menghitung kemungkinan kesalahan selama proses penelusuran, yang akan membantu menghindarinya terlebih dahulu. Ini, seperti yang dikatakan pengembang, juga akan meningkatkan kecepatan kerja.

Dan bagaimana ray tracing mempengaruhi kualitas?

Selama presentasi kartu video, Nvidia menunjukkan sejumlah contoh cara kerja ray tracing: khususnya, diketahui bahwa beberapa game yang akan datang, termasuk Shadow of the Tomb Raider dan Battlefield 5, akan bekerja pada platform RTX. Fungsi ini, bagaimanapun, akan menjadi opsional dalam permainan, karena salah satu kartu video baru diperlukan untuk pelacakan. Trailer yang ditampilkan oleh perusahaan selama 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 yang dijadwalkan rilis pada 19 Februari 2019:

Control , yang belum memiliki tanggal rilis:

Bersamaan dengan itu, Nvidia, game apa lagi yang akan mendapatkan ray tracing.

Bagaimana cara mengaktifkan RTX?

Karena fitur teknis teknologi ini, hanya kartu video dengan arsitektur Turing yang akan mendukung ray tracing - perangkat yang tersedia saat ini tidak dapat mengatasi jumlah pekerjaan yang diperlukan untuk tracing. Saat ini, satu-satunya kartu video dengan arsitektur ini adalah seri Nvidia GeForce RTX, model yang tersedia untuk pra-pemesanan dari 48.000 hingga 96.000 rubel.

Apakah ada analog untuk AMD?

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

Teknologi yang akan berjalan di Vulkan API masih dalam pengembangan.

Seperti yang dinyatakan Nvidia selama presentasinya, pengembangan teknologi RTX akan secara signifikan meningkatkan komponen grafis game, memperluas seperangkat alat yang tersedia untuk pengembang. Namun demikian, masih terlalu dini untuk membicarakan revolusi grafis secara umum - tidak semua game akan mendukung teknologi ini, dan biaya kartu video dengan dukungannya cukup tinggi. Presentasi kartu video baru berarti ada kemajuan dalam detail grafis, dan seiring waktu akan tumbuh dan berkembang.

PENGANTAR

Ada beberapa metode untuk menghasilkan gambar yang realistis, seperti penelusuran sinar maju (photon tracing) dan penelusuran sinar belakang.

Metode ray tracing dianggap sebagai metode yang paling kuat dan serbaguna untuk membuat gambar realistis saat ini. Ada banyak contoh penerapan algoritme penelusuran untuk tampilan berkualitas tinggi dari pemandangan tiga dimensi yang paling kompleks. Dapat dicatat bahwa universalitas metode penelusuran sebagian besar disebabkan oleh fakta bahwa metode tersebut didasarkan pada konsep yang sederhana dan jelas yang mencerminkan pengalaman kita dalam memahami dunia di sekitar kita.

Benda-benda di sekitar kita memiliki sifat-sifat berikut dalam kaitannya dengan cahaya:

memancarkan;

mencerminkan dan menyerap;

melewati diri mereka sendiri.

Masing-masing sifat ini dapat dijelaskan oleh beberapa set karakteristik.

Radiasi dapat dicirikan oleh intensitas dan spektrum.

Sifat pemantulan (penyerapan) dapat digambarkan dengan karakteristik hamburan difus dan pemantulan spekular. Transparansi dapat digambarkan dengan redaman intensitas dan pembiasan.

Sinar cahaya memancar dari titik-titik pada permukaan (volume) benda yang memancar. Sinar seperti itu bisa disebut primer - mereka menerangi yang lainnya. Sinar primer yang tak terhitung jumlahnya memancar dari sumber radiasi ke berbagai arah. Beberapa sinar masuk ke ruang bebas, dan beberapa jatuh pada benda lain.

Akibat aksi sinar primer pada benda, timbul sinar sekunder. Beberapa dari mereka berakhir pada objek lain. Jadi, berulang kali dipantulkan dan dibiaskan, sinar cahaya individu sampai pada titik pengamatan. Dengan demikian, gambar pemandangan dibentuk oleh beberapa set sinar cahaya.

Warna titik individu gambar ditentukan oleh spektrum dan intensitas sinar primer sumber radiasi, serta penyerapan energi cahaya pada objek yang ditemui di jalur sinar yang sesuai.

Implementasi langsung dari model pencitraan sinar ini sulit. Anda dapat mencoba membangun algoritme konstruksi gambar dengan cara yang ditentukan. Dalam algoritma seperti itu, perlu untuk menghitung semua sinar primer dan menentukan sinar yang mengenai objek dan kamera. Kemudian ulangi semua sinar sekunder, dan juga pertimbangkan hanya sinar yang mengenai objek dan kamera. Dll. Algoritma ini disebut penelusuran sinar langsung. Kerugian utama dari metode ini adalah banyak operasi yang tidak perlu yang terkait dengan perhitungan sinar, yang kemudian tidak digunakan.

1. REVERSE RAY TRACING

Karya ini dikhususkan untuk metode menghasilkan gambar realistis ini.

Metode penelusuran sinar terbalik dapat secara signifikan mengurangi pencarian sinar cahaya. Metode ini dikembangkan pada tahun 80-an, karya Whitted dan Kay dianggap mendasar. Menurut metode ini, ray tracing dilakukan bukan dari sumber cahaya, tetapi dalam 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 menghilang pada jarak tertentu dari bidang proyeksi. Gambar garis lurus dari pusat menghilang melalui tengah piksel bidang proyeksi. Ini akan menjadi sinar jejak belakang utama. Jika sinar ini mengenai satu atau lebih objek pemandangan, maka pilih titik perpotongan terdekat. Untuk menentukan warna piksel gambar, perlu memperhitungkan sifat-sifat objek, serta jenis radiasi cahaya apa yang jatuh pada titik objek yang sesuai.

Jika objeknya spekular (setidaknya sebagian), maka kita membangun sinar sekunder - sinar datang, dengan mempertimbangkan sinar jejak primer sebelumnya sebagai sinar refleksi.

Untuk cermin yang ideal, maka cukup untuk melacak hanya titik persimpangan berikutnya dari balok sekunder dengan beberapa objek. Cermin yang ideal memiliki permukaan poles yang sangat halus, sehingga satu sinar pantul hanya sesuai dengan satu sinar datang. Cermin dapat digelapkan, yaitu menyerap sebagian energi cahaya, tetapi aturannya tetap: satu sinar jatuh - satu dipantulkan.

Jika objeknya transparan, maka perlu untuk membuat sinar baru, yang jika dibiaskan, akan memberikan sinar jejak sebelumnya.

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

Ketika ternyata arus back tracing ray tidak memotong objek apapun, tetapi masuk ke ruang bebas, maka tracing untuk sinar ini berakhir.

Dalam penerapan praktis metode penelusuran balik, pembatasan diperkenalkan. Beberapa dari mereka diperlukan untuk dapat memecahkan masalah sintesis gambar pada prinsipnya, dan beberapa batasan dapat secara signifikan meningkatkan kecepatan penelusuran.

Batasan saat menerapkan penelusuran

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

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

Pada gilirannya, spekularitas juga dijelaskan oleh dua komponen. Yang pertama (pantulan) memperhitungkan refleksi dari objek lain yang bukan sumber cahaya. Hanya satu sinar pantul spekular r yang dibuat untuk penelusuran lebih lanjut. Komponen kedua (spekular) berarti sorotan dari sumber cahaya. Untuk melakukan ini, sinar diarahkan ke semua sumber cahaya dan sudut yang dibentuk oleh sinar-sinar ini dengan sinar pantul balik (r) yang dipantulkan secara spekular ditentukan. Dalam mirroring, warna titik permukaan ditentukan oleh warna asli dari apa yang dipantulkan.

Dengan refleksi difus, hanya sinar dari sumber cahaya yang diperhitungkan. Sinar dari permukaan reflektif specularly diabaikan. Jika sinar yang diarahkan pada sumber cahaya tertentu ditutupi oleh objek lain, maka titik objek ini berada dalam bayangan. Dalam refleksi difus, warna titik yang diterangi pada permukaan ditentukan oleh warna intrinsik permukaan dan warna sumber cahaya.

Untuk objek transparan (transparan), ketergantungan indeks bias pada panjang gelombang tidak diperhitungkan. (Kadang-kadang transparansi umumnya dimodelkan tanpa pembiasan, yaitu, arah sinar bias t bertepatan dengan arah sinar datang.)

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

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

Kesimpulan tentang metode penelusuran kembali

Keuntungan:

Universalitas metode, penerapannya untuk sintesis gambar skema spasial yang agak rumit. Mewujudkan banyak hukum optik geometris. Itu hanya berbagai proyeksi.

Bahkan versi terpotong dari metode ini memungkinkan memperoleh gambar yang cukup realistis. Misalnya, jika kita membatasi diri kita hanya pada sinar primer (dari titik proyeksi), maka ini akan menghasilkan penghilangan titik-titik yang tidak terlihat. Menelusuri sudah satu atau dua sinar sekunder memberikan bayangan, transparansi specular.

Semua transformasi koordinat linier, sehingga mudah untuk bekerja dengan tekstur.

Kekurangan:

Masalah dengan pemodelan refleksi dan refraksi difus.

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

2. BAGIAN DESAIN

Algoritma.

Pelacakan sinar terbalik.

Beras. 1 - Blok diagram dari algoritma berulang untuk penelusuran sinar terbalik

bahasa pemrograman ray tracing

Dalam program ini, algoritma backtrace diimplementasikan secara berulang. Fungsi untuk menghitung intensitas sinar primer secara rekursif memanggil dirinya sendiri untuk menemukan intensitas sinar yang dipantulkan dan dibiaskan.

Algoritma:

Untuk menghitung warna setiap piksel pada framebuffer, dilakukan langkah-langkah sebagai berikut:

Temukan koordinat piksel dalam sistem koordinat dunia.

Temukan koordinat sinar primer.

Memulai fungsi untuk menghitung intensitas sinar primer.

Temukan persimpangan sinar dengan semua primitif di tempat kejadian dan pilih yang terdekat.

Jika perpotongan tidak ditemukan, maka sinar telah masuk ke ruang bebas.

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

Kami menghitung intensitas warna "lokal" dari objek tempat titik persimpangan berada. Yang dimaksud dengan intensitas "lokal" adalah intensitas dengan memperhitungkan intensitas cahaya yang dipantulkan secara difus dan intensitas silau.

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

Jika kedalaman rekursi maksimum tercapai, maka ambil 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 menemukan intensitas sinar pantul.

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

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

Kembali ke titik panggil fungsi perhitungan intensitas sinar.

Jika sinar primer dihitung, maka piksel dari warna yang dihitung ditempatkan di buffer bingkai. Mari kita lanjutkan ke perhitungan piksel buffer frame berikutnya.Jika balok yang dipantulkan (dibiaskan) dihitung, maka intensitas yang dihitung akan diambil sebagai intensitas balok yang dipantulkan (dibiaskan) pada langkah rekursi sebelumnya.

Membangun bayangan.

Bayangan padat.

Untuk membangun bayangan padat dalam algoritme penelusuran, pada tahap penghitungan intensitas warna "lokal" pada titik objek, "visibilitas" setiap sumber cahaya dari titik ini diperiksa.

Prinsip algoritma.

Sebuah sinar diarahkan ke sumber cahaya dibangun dari titik yang diuji.

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

Jika setidaknya satu persimpangan ditemukan, maka titik yang diperiksa berada dalam bayangan. Saat menghitung warnanya, sumber yang melakukan pemeriksaan tidak diperhitungkan.

sumber yang dapat diverifikasi.

Metode menemukan bayangan ini memberikan hasil yang dapat diterima selama tidak ada objek transparan dalam pemandangan. Namun, bayangan hitam pekat dari kaca tidak terlihat realistis. Kaca mentransmisikan sebagian cahaya, sehingga intensitas sumber yang dikaburkan harus diperhitungkan saat menghitung intensitas cahaya di titik objek, tetapi harus dilemahkan ketika cahaya melewati kaca.

Latar belakang matematis dan fisik dari algoritma penelusuran sinar belakang.

Petir.

Intensitas cahaya adalah jumlah intensitas iluminasi latar belakang pemandangan, intensitas cahaya yang dipantulkan secara difus dari sumber, intensitas silau dari sumber (karakteristik iluminasi "lokal"), intensitas sinar pantul spekular, dan intensitas sinar bias, jika ada.

Intensitas cahaya latar (IA) diberikan oleh beberapa konstanta.

Intensitas cahaya yang dipantulkan secara difus (ID) dihitung menurut "hukum kosinus" klasik.

ID = IL cos ,(2.2.1.6)

di mana IL adalah intensitas sumber cahaya, adalah sudut antara normal ke permukaan dan arah ke sumber.

Dalam kasus pencahayaan adegan dengan beberapa sumber, Id dihitung untuk masing-masing sumber dan kemudian dijumlahkan.

IDi =Σ ILi cos i.(2.2.1.7)

Intensitas flare dari sumber (IS) dihitung menurut model Phong.

IS = IL cosp ,(2.2.1.8)

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

Pada nilai p rendah, sorotan lebih kabur.

Seperti halnya perhitungan ID, dalam hal iluminasi pemandangan 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 secara spekular (IR) dan dibiaskan (IT) dihitung untuk sinar yang dipantulkan dan dibiaskan pada langkah rekursi berikutnya. Jika batas kedalaman rekursi tercapai, maka intensitas ini 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 difus permukaan, KS - koefisien silau - koefisien ini merupakan karakteristik kekasaran permukaan reflektif. Semakin besar kekasaran permukaan, semakin sedikit cahaya yang dipantulkan darinya secara spekuler dan semakin sedikit cahaya yang ditransmisikan, dan karenanya semakin banyak cahaya yang dipantulkan secara difus.<= KD <= 1.

Pada KD = 0 - semua cahaya yang jatuh di permukaan dipantulkan dan dibiaskan. KD = 1 - semua cahaya dipantulkan secara difus. Intensitas cahaya yang dipantulkan secara difus dan intensitas cahaya latar 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.

Pada KS = 0 - sorotan tidak terlihat, pada KS = 1 - kecerahan sorotan maksimal.

Dengan demikian, rumus akhir untuk menghitung intensitas suatu benda di beberapa titik akan terlihat seperti ini:

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

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

Untuk mendapatkan citra berwarna, perlu dilakukan perhitungan secara terpisah untuk komponen lampu merah, hijau dan biru. Warna suatu piksel citra akan dihitung dengan mengalikan setiap komponen intensitas dengan angka yang menentukan jumlah maksimum gradasi intensitas citra. 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 spekular), IG, IB adalah intensitas tiga komponen cahaya pada suatu titik, yang diperoleh dengan rumus di atas.

Koefisien KD, KS, p adalah karakteristik individu dari objek, yang mencerminkan sifat-sifatnya. Selain itu, ada satu koefisien lagi - indeks bias absolut n. n = c / v, di mana 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 tubuh yang benar-benar buram, Anda harus mengatur koefisien ini >> 1 (sekitar 10.000). Dalam hal ini, proporsi cahaya yang dipantulkan secara spekuler r akan cenderung menyatu, dan dibiaskan, masing-masing, menjadi nol.

Perhitungan normal.

Dalam algoritma tracing, normal terhadap objek diperlukan untuk menghitung sinar pantul dan bias, serta untuk menentukan iluminasi menurut model Phong.

Dalam program ini, ada tiga jenis primitif dari mana adegan dibangun. Ini adalah poligon (segitiga), ellipsoid dan paraboloid. Dua yang terakhir diperkenalkan untuk tiruan kaca yang lebih realistis (bisa juga dibuat dari poligon, tetapi modelnya akan menjadi lebih kasar).

Perhitungan normal ke poligon (segitiga).

Perhitungan normal ke segitiga direduksi menjadi operasi perkalian vektor. Biarkan segitiga ABC diberikan oleh koordinat tiga simpulnya:

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

Mari kita hitung koordinat dua 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 menggunakan rumus:

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

Tidak perlu menghitung koordinat vektor normal ke segitiga setiap kali di badan jejak, karena 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 normal ke permukaan 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.

Tapi kita akan menggunakan bentuk notasi yang berbeda. Sehingga persamaan ellipsoid akan terlihat seperti ini:

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

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

Persamaan parabola:

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

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

Koordinat vektor normal ellipsoid:

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

Arah suatu vektor tidak akan berubah jika semua koordinatnya dibagi 2 :

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

Zn \u003d (z-z0) / C2.

Koordinat vektor normal paraboloid dihitung dengan cara yang sama:

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

Zn \u003d - (z-z0) / C2.

Normal untuk permukaan orde kedua harus dihitung secara langsung di badan jejak, karena normalnya berbeda pada titik yang berbeda dari gambar.

Perhitungan sinar pantul.

Biarkan vektor sinar datang S diberikan, dan vektor normal N diketahui. Diperlukan untuk menemukan vektor sinar pantul R.

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

N` = N`2cosθ.

Dari sini kita menemukan vektor satuan dari sinar pantul:

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

Mari kita cari cosθ. Ini dapat dilakukan dengan menggunakan produk skalar dari vektor N dan S:


Asumsikan bahwa vektor sinar pantul yang diperlukan akan memiliki panjang yang sama dengan vektor sinar datang, yaitu, R = |S| R1, kita dapatkan

N 2NS/|N|2 - S.

Solusi ini dalam bentuk vektor. Mari kita menulis koordinat vektor:

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.

Biarkan dua vektor satuan diberikan: S1 adalah vektor berkas datang, dan N1 adalah vektor normal ke antarmuka antara dua media. Dua indeks bias untuk media ini juga harus diketahui - n1 dan n2 (atau rasionya).

Diperlukan untuk menemukan vektor satuan dari sinar bias T1. Untuk solusinya, kami melakukan beberapa konstruksi geometris.

Vektor yang diinginkan T1 sama dengan jumlah dua vektor:

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

sinα2 = n sinα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 dalam produk skalar dari vektor satuan S1 dan N1, yaitu cos 1 = S1N1. Kemudian kita dapat menulis ekspresi berikut untuk vektor NT:

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

Tetap menemukan ekspresi untuk vektor B. Itu terletak 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|/|A| = sinα2/ sinα1 = n2/n1 = n,

dari mana |B| = n |A|. Dengan mempertimbangkan posisi relatif dari vektor A dan B, kita peroleh

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

Sekarang kita dapat menulis 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 persimpangan dengan primitif.

Dalam algoritma penelusuran, untuk membangun sebuah gambar, perlu untuk menghitung titik potong sinar dengan adegan primitif. Balok diberikan oleh persamaan parametrik garis lurus. Setiap titik balok memenuhi persamaan

R = A + Vt,(2.2.5.1)

di mana R adalah vektor jari-jari dari 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 akan secara numerik sama dengan jarak dari titik awal balok A ke titik R.

Anda dapat menulis persamaan ini dalam bentuk koordinat:

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

Di sini x1, y1, z1 adalah koordinat titik awal balok dalam sistem koordinat dunia kartesius persegi panjang, a,b,c adalah koordinat vektor arah balok.

Perhitungan titik potong sinar dengan permukaan orde kedua.

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

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

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

sebagai ganti x, y, dan z, persamaan sinar yang bersesuaian harus disubstitusikan ke dalam persamaan permukaan orde kedua. Akibatnya, setelah membuka semua kurung dan membawa yang serupa, kami mendapatkan persamaan kuadrat sehubungan dengan parameter t. Jika diskriminan persamaan kuadrat kurang dari nol, maka sinar dan permukaan orde kedua tidak memiliki titik potong yang sama. Jika tidak, dimungkinkan untuk menghitung dua nilai parameter t. 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 menemukan koordinat titik potong sinar dan permukaan, cukup dengan mensubstitusi nilai parameter t yang ditemukan ke dalam persamaan sinar (2).

Dalam program, ketika dua persimpangan ditemukan, yang 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. Perlu dicatat di sini bahwa sebagai hasil dari penyelesaian persamaan kuadrat, satu atau kedua nilai parameter t dapat menjadi negatif. Ini berarti bahwa titik potong terletak "di belakang" relatif terhadap titik asal balok, pada separuh garis lurus, yang "di sisi kita" relatif terhadap bidang gambar. Titik-titik tersebut dibuang saat mencari persimpangan.

Selain itu, dalam program untuk setiap gambar, bidang pemotongan atas dan bawah diperkenalkan. Hanya bagian dari sosok yang terletak di antara mereka yang ditampilkan.

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

Perhitungan titik potong sinar dengan poligon (segitiga).

Untuk menghitung titik potong sinar yang diberikan oleh persamaan (2), Anda harus terlebih dahulu menentukan titik potong sinar ini dengan bidang yang memuat segitiga ini.

Persamaan bidang terlihat seperti ini:

Q(x, y, z) = Ax + By + Cz + D = 0.(2.2.5.3)

Di sini koefisien A, B, C bertepatan dengan koordinat normal bidang ini. Koordinat normal pesawat bertepatan dengan koordinat normal segitiga, yang kami hitung pada tahap pemuatan adegan.

Untuk menemukan istilah bebas D, perlu untuk mengganti koordinat titik mana pun dari segitiga, misalnya, salah satu simpul.

Kapak-Oleh-Cz.(2.2.5.4)

Nilai D tidak akan berubah selama eksekusi program, jadi disarankan untuk menghitungnya saat adegan diinisialisasi dan menyimpannya, seperti koordinat normal. Penting untuk menghitung ulang hanya ketika posisi segitiga berubah.

Sekarang, untuk mencari titik potong, kita substitusikan persamaan sinar (2) menjadi

persamaan bidang.

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

Dimana kita mendapatkan?

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

Jika penyebut pecahan ini adalah nol, maka sinar sejajar dengan bidang di mana segitiga terletak. Tidak ada titik persimpangan.

Untuk mencari koordinat titik potong, perlu mensubstitusi nilai parameter t yang ditemukan ke dalam persamaan sinar (2). Sebut saja titik potong D. Kita akan mendapatkan koordinat xD, yD, zD.

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

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

Vektor-vektor ini akan kolinear. Jika ketiga vektor adalah codirectional, maka titik D terletak di dalam segitiga. Arah bersama ditentukan oleh persamaan tanda-tanda koordinat yang bersesuaian dari ketiga vektor.

Operasi pemeriksaan apakah titik D termasuk segitiga ABC dapat dipercepat. Jika kita secara ortogonal memproyeksikan segitiga ABC dan titik D ke salah satu bidang xOy, yOz atau xOz, maka proyeksi titik ke proyeksi segitiga akan berarti bahwa titik itu sendiri 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 menemukan koordinat semua vektor, Anda perlu mencari dua koordinat untuk setiap vektor, dan ketika mencari produk vektor, Anda hanya perlu mencari satu koordinat (sisanya sama dengan nol).

Untuk memeriksa ko-arah vektor yang diperoleh saat menghitung perkalian silang, Anda perlu memeriksa tanda-tanda koordinat tunggal ini untuk ketiga vektor. Jika semua tanda lebih besar dari nol, atau kurang dari nol, maka vektor-vektornya searah. Persamaan dengan nol dari salah satu produk vektor sesuai dengan kasus ketika titik D jatuh pada garis lurus yang mengandung salah satu sisi segitiga.

Selain itu, tes dimensi sederhana dapat dilakukan sebelum menghitung vektor dan produk silang. Jika proyeksi titik D terletak ke kanan, ke kiri, di atas atau di bawah setiap tonjolan simpul segitiga, maka ia tidak dapat terletak di dalam.

Tetap menambahkan bahwa untuk proyeksi lebih baik memilih salah satu bidang, area proyeksi segitiga yang lebih besar. Dalam kondisi ini, kasus proyeksi segitiga ke dalam segmen dikecualikan (asalkan segitiga yang diuji tidak merosot menjadi segmen). Selain itu, saat area proyeksi meningkat, kemungkinan kesalahan menurun. Untuk menentukan bidang proyeksi seperti itu, cukup dengan memeriksa tiga koordinat normal segitiga. Jika koordinat z dari normal lebih besar (dalam nilai absolut) x dan y, maka perlu diproyeksikan ke bidang xOy. Jika y lebih besar dari x dan z, maka kami memproyeksikan 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 TPrimitive.h-deskripsi kelas TFrstSurface.h-deskripsi kelas TScndSurface.h-deskripsi kelas TTriangle.h-deskripsi kelas TEllipsoid.h-deskripsi kelas TCylinder.h-kelas deskripsi deskripsi kelas THyperboloidVert.h-deskripsi kelas THyperboloidHor.h-deskripsi kelas TScene.h- Deskripsi kelas TTracer

Menerapkan modul, antarmuka program:

Option.h-modul dari formulir "Opsi"

ExtraCamOptions.h-modul dari bentuk "Properti kamera"

MainUnit.h - modul dari bentuk utama program

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

Berisi tiga titik di mana tekstur dilampirkan: TLamp ​​- kelas yang menjelaskan sumber cahaya.

Berisi objek koordinat TPoint3d dengan koordinat sumber dan tiga variabel float (Ir, Ig, Ib) untuk menyimpan intensitas ketiga 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 dari 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 orde dua abstrak. Kelas ellipsoid dan paraboloid diwarisi darinya.Ttriangle - 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 ellipsoid.TScene - kelas adegan. Berisi informasi tentang semua primitif, sumber, dan kamera.Ttracer adalah kelas yang bertanggung jawab untuk merender gambar. Berisi buffer (penyangga) dengan tata letak 400x400 piksel, di mana gambar pemandangan terbentuk. Sebelum pembuatan, perlu untuk memanggil fungsi, meneruskannya sebagai parameter pointer ke adegan yang akan dihasilkan. Untuk menghasilkan, panggil fungsi render.

Semua kelas - turunan TPrimitive menyediakan fungsi berikut: getT(TPoint3d p0, TPoint3d viewDir) - mengembalikan jarak dari titik asal (p0) sinar viewDir ke titik perpotongan 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 titik perpotongan 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 titik primitif p (termasuk tekstur).

3. BAGIAN TEKNOLOGI

Pilihan 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, memungkinkan Anda untuk mengimplementasikan algoritme lebih efisien daripada 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. Juga, penulis karya memiliki pengalaman pemrograman terbesar di lingkungan pemrograman visual yang ditentukan.

Bentuk 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.

Bentuk pilihan. tab kamera.

Tab ini berisi alat untuk mengatur opsi kamera.

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

Navigasi - pengaturan posisi kamera.

Lanjutan - ketika Anda mengklik tombol ini, sebuah formulir muncul

Properti kamera dengan opsi kamera tingkat lanjut.

Formulir properti kamera.

Radius - jarak dari kamera ke titik di mana ia diarahkan.

Langkah perubahan radius - peningkatan radius kamera dengan menekan tombol "-" sekali pada tab "Kamera" dari formulir "Opsi" (atau menguranginya dengan menekan tombol "+" sekali).

Bentuk pilihan. tab bahan.

Menu ini menampilkan parameter bahan tabel 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, maka tekstur akan ditampilkan di atas meja

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 dari bahan tabel.

Bentuk properti tabel.

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

Silau blur adalah p eksponen dari bahan tabel.

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

Bentuk pilihan. tab sistem.

Pada tab ini, Anda dapat mengonfigurasi algoritme yang diterapkan dalam program.

Kedalaman rekursi - parameter ini menetapkan kedalaman rekursi dalam algoritme penelusuran. Nilai yang lebih besar dari parameter ini meningkatkan kualitas gambar yang dihasilkan.

PERHATIAN!

Kedalaman rekursi memiliki efek KUAT pada kecepatan pembuatan gambar. Tidak disarankan untuk mengatur parameter ini ke lebih dari 10.

Anitialiasing - mengaktifkan algoritma penghalusan gambar.

Jenis bayangan - pemilihan algoritma konstruksi bayangan.

4. BAGIAN PENELITIAN

Studi dilakukan pada komputer dengan konfigurasi berikut:

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

4.1 Ketergantungan waktu pembangkitan pada kedalaman rekursi

Dalam tes ini, ketergantungan waktu generasi gambar pada kedalaman rekursi diselidiki. Studi dilakukan untuk pemandangan yang diterangi oleh satu sumber cahaya - waktu pembangkitan tanpa bayangan dalam detik - waktu pembangkitan dengan bayangan padat dalam detik - kedalaman rekursi.


4.2 Ketergantungan waktu pembangkitan pada jumlah sumber


4.3 Analisis hasil penelitian

Dari studi pertama, dapat dilihat bahwa waktu generasi tumbuh kuat dengan jumlah tingkat rekursi. Ini sesuai dengan teori, karena jumlah sinar tumbuh dengan kedalaman rekursi.

Perlu diperhatikan bahwa untuk pemandangan 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 pada 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

Dalam program ini, hasil algoritme untuk menghasilkan gambar realistis - penelusuran sinar terbalik - didemonstrasikan.

Implementasi ini menunjukkan kemampuan algoritma untuk membangun gambar yang mendekati fotorealistik. Tracing adalah salah satu algoritma yang paling canggih untuk menghasilkan gambar yang realistis. Kualitas gambar yang dihasilkan jauh lebih baik daripada kualitas gambar yang diperoleh dengan menggunakan algoritma seperti Z-buffer. Namun, persyaratan untuk daya komputasi yang diperlukan untuk menghasilkan satu bingkai gambar jauh lebih tinggi daripada di buffer-Z yang sama. Sampai saat ini, secara real time, algoritma penelusuran sinar terbalik hanya digunakan untuk tujuan penelitian pada komputer super canggih yang tidak dapat diakses oleh pengguna biasa. Tentu saja, ada penggemar yang membuat game 3D dan aplikasi grafik waktu nyata lainnya berdasarkan algoritma penelusuran sinar terbalik, tetapi sebagai aturan, mereka memiliki FPS yang sangat rendah, atau semua objek dalam adegan didasarkan pada bola - yang paling mudah untuk melacak permukaan sinar. Tetapi agar algoritma ini menjadi menguntungkan dalam proyek massal, seperti game 3D, diperlukan terobosan signifikan di bidang perangkat keras komputer desktop.

Bahkan pada contoh permainan komputer, seseorang dapat dengan mudah melacak redundansi dari algoritma penelusuran sinar terbalik. Lagi pula, pemain, yang bersemangat tentang gameplay, tidak mungkin mengagumi rendering bayangan dan pantulan objek game yang benar secara geometris. Dalam hal ini, perkiraan menggambar dengan bantuan poligon hari ini menang secara signifikan, karena tidak memerlukan komputer yang kuat, dan hasilnya mendekati kenyataan.

Algoritme ray tracing juga dianggap ideal untuk gambar objek buatan dengan bentuk geometris sederhana, seperti mobil, pesawat, bangunan, dll. Menghasilkan objek seperti wajah manusia, bulu hewan, atau kawasan hutan adalah hal yang sangat sulit. tugas untuk algoritme, yang meningkatkan persyaratan yang sangat besar untuk perangkat keras komputer.

Namun, bahkan hari ini Anda dapat melihat penelitian tentang penerapan algoritma penelusuran sinar terbalik waktu nyata. Biasanya, dalam proyek semacam itu, mobil digunakan sebagai pemandangan. Tetapi fotorealisme mutlak dari gambar telah tercapai, dan selain itu, dibutuhkan waktu yang sangat sedikit untuk menghasilkan satu bingkai. Tentu saja, proyek-proyek ini diimplementasikan pada komputer yang sangat kuat, tetapi tidak lama lagi aplikasi 3D semacam itu akan tersedia untuk pengguna rata-rata.

BIBLIOGRAFI

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

Grafik komputer Porev VN. - St. Petersburg: BHV-Petersburg, 2002. - 432 hal.

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

Angel E. Grafik komputer interaktif. - "Williams", 2001. - 592 hal.: sakit. - Paralel. Dada. Dari bahasa Inggris.

Avdeeva S.M., Kurov A.V. Algoritma untuk Grafik Komputer 3D: Buku teks. - M.: Penerbitan MSTU im. N.E. Bauman, 1996. - 60 hal.