Unit Pemrosesan Pusat (CPU) dan Unit Pemrosesan Grafis komputer Anda (GPU) berinteraksi setiap saat Anda menggunakan komputer untuk menghadirkan antarmuka visual yang tajam dan responsif. Baca terus untuk lebih memahami bagaimana mereka bekerja bersama.
foto oleh sskennel.
Sesi Tanya & Jawab hari ini hadir untuk memberi kami hak milik SuperUser-subdivisi Stack Exchange, kumpulan situs web Q & A berbasis komunitas.
Pembaca SuperUser Sathya mengajukan pertanyaan:
Di sini Anda dapat melihat tangkapan layar program C ++ kecil bernama Triangle.exe dengan segitiga berputar berdasarkan API OpenGL.
Diakui contoh yang sangat dasar tapi saya pikir itu berlaku untuk operasi kartu grafis lainnya.
Saya hanya ingin tahu dan ingin mengetahui seluruh proses dari mengklik ganda pada Triangle.exe di bawah Windows XP sampai saya bisa melihat segitiga berputar pada monitor. Apa yang terjadi, bagaimana CPU (yang pertama menangani .exe) dan GPU (yang akhirnya menghasilkan segitiga di layar) berinteraksi?
Saya kira terlibat dalam menampilkan segitiga berputar ini terutama perangkat keras / perangkat lunak berikut antara lain:
Perangkat keras
Perangkat lunak
Adakah yang bisa menjelaskan prosesnya, mungkin dengan semacam diagram alur untuk ilustrasi?
Seharusnya tidak menjadi penjelasan kompleks yang mencakup setiap langkah (tebak yang akan melampaui ruang lingkup), tetapi penjelasan seorang IT menengah dapat mengikuti.
Saya yakin banyak orang yang bahkan menyebut diri mereka profesional TI tidak dapat menggambarkan proses ini dengan benar.
Meskipun banyak anggota komunitas menjawab pertanyaan itu, Oliver Salzburg bekerja ekstra dan menjawabnya tidak hanya dengan tanggapan yang detail tetapi juga grafis yang sangat baik.
Gambar oleh JasonC, tersedia sebagai wallpaper di sini.
Dia menulis:
Saya memutuskan untuk menulis sedikit tentang aspek pemrograman dan bagaimana komponen berbicara satu sama lain. Mungkin itu akan memberi titik terang pada area tertentu.
Apa yang dibutuhkan untuk bahkan memiliki gambar tunggal, yang Anda posting di pertanyaan Anda, digambar di layar?
Ada banyak cara menggambar segitiga di layar. Untuk kesederhanaan, mari kita asumsikan tidak ada buffer vertex yang digunakan. (SEBUAH penyangga verteksadalah area memori di mana Anda menyimpan koordinat.) Mari kita asumsikan program hanya mengatakan kepada pipa pemrosesan grafis tentang setiap vertex tunggal (sebuah titik hanya sebuah koordinat dalam ruang) secara berturut-turut.
Tapi, sebelum kita bisa menggambar apa pun, pertama kita harus menjalankan beberapa perancah. Kita lihat saja nanti Mengapa kemudian:
// Bersihkan Layar Dan Kedalaman Buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset Matrix ModelView saat ini glMatrixMode (GL_MODELVIEW); glLoadIdentity (); // Menggambar Menggunakan Segitiga glBegin (GL_TRIANGLES); // Red glColor3f (1.0f, 0.0f, 0.0f); // Top Of Triangle (Depan) glVertex3f (0.0f, 1.0f, 0.0f); // Green glColor3f (0.0f, 1.0f, 0.0f); // Left Of Triangle (Depan) glVertex3f (-1.0f, -1.0f, 1.0f); // Blue glColor3f (0.0f, 0.0f, 1.0f); // Hak Segitiga (Depan) glVertex3f (1.0f, -1.0f, 1.0f); // Selesai Menggambar glEnd ();
Ketika Anda menulis sebuah program yang ingin menggunakan kartu grafis, Anda biasanya akan memilih beberapa jenis antarmuka untuk pengemudi. Beberapa antarmuka yang terkenal untuk pengemudi adalah:
Untuk contoh ini kita akan tetap menggunakan OpenGL. Sekarang, Anda antarmuka ke pengemudi adalah apa yang memberi Anda semua alat yang Anda butuhkan untuk membuat program Anda berbicara ke kartu grafis (atau driver, yang kemudian pembicaraan ke kartu).
Antarmuka ini pasti memberi Anda kepastian alat. Alat-alat ini mengambil bentuk API yang dapat Anda hubungi dari program Anda.
API itu adalah apa yang kami lihat digunakan dalam contoh di atas. Mari kita lihat lebih dekat.
Sebelum Anda benar-benar dapat melakukan gambar yang sebenarnya, Anda harus melakukan mempersiapkan. Anda harus menentukan viewport Anda (area yang benar-benar akan diberikan), perspektif Anda (yang kamera ke dunia Anda), apa yang anti-aliasing Anda akan gunakan (untuk memuluskan tepi segitiga Anda) ...
Tetapi kita tidak akan melihat semua itu. Kami hanya akan mengintip hal-hal yang harus Anda lakukan setiap frame. Seperti:
Menghapus layar
Pipa grafis tidak akan membersihkan layar untuk Anda setiap bingkai. Anda harus menceritakannya. Mengapa? Ini sebabnya:
Jika Anda tidak membersihkan layar, Anda akan dengan mudah menggambar setiap bingkai. Itu sebabnya kami menyebutnya glClear
denganGL_COLOR_BUFFER_BIT
set. Bit lainnya (GL_DEPTH_BUFFER_BIT
) memberi tahu OpenGL untuk menghapus kedalamanpenyangga. Penyangga ini digunakan untuk menentukan piksel mana di depan (atau di belakang) piksel lain.
Transformasi
Sumber gambar
Transformasi adalah bagian di mana kita mengambil semua koordinat input (simpul segitiga kita) dan menerapkan matriks ModelView kami. Ini adalah matriks itu menjelaskan bagaimana kita model (simpul) diputar, diskalakan, dan diterjemahkan (dipindahkan).
Selanjutnya, kami menerapkan matriks Proyeksi kami. Ini memindahkan semua koordinat sehingga mereka menghadap kamera kami dengan benar.
Sekarang kita mengubah sekali lagi, dengan matriks Viewport kami. Kami melakukan ini untuk skala kami model untuk ukuran monitor kami. Sekarang kami memiliki satu set simpul yang siap untuk diberikan!
Kami akan kembali ke transformasi sedikit nanti.
Gambar
Untuk menggambar segitiga, kita cukup memberi tahu OpenGL untuk memulai yang baru daftar segitiga dengan menyebut glBegin
dengan GL_TRIANGLES
konstan.
Ada juga bentuk lain yang bisa Anda gambar. Seperti strip segitiga atau kipas segitiga. Ini terutama adalah pengoptimalan, karena mereka membutuhkan lebih sedikit komunikasi antara CPU dan GPU untuk menggambar jumlah segitiga yang sama.
Setelah itu, kami dapat memberikan daftar set 3 simpul yang harus membentuk setiap segitiga. Setiap segitiga menggunakan 3 koordinat (karena kita berada dalam ruang 3D). Selain itu, saya juga menyediakan warna untuk setiap titik, dengan meneleponglColor3f
sebelum panggilan glVertex3f
.
Bayangan antara 3 simpul (3 sudut segitiga) dihitung oleh OpenGLsecara otomatis. Ini akan menginterpolasi warna di seluruh wajah poligon.
Sekarang, ketika Anda mengklik jendela. Aplikasi hanya harus menangkap pesan jendela yang menandakan klik. Kemudian Anda dapat menjalankan tindakan apa pun dalam program yang Anda inginkan.
Ini mendapat banyak lebih sulit setelah Anda ingin mulai berinteraksi dengan adegan 3D Anda.
Anda harus terlebih dahulu mengetahui dengan jelas di mana pixel pengguna mengklik jendela. Lalu, ambil milikmu perspektifmemperhitungkan, Anda dapat menghitung arah sinar, dari titik klik mouse ke dalam adegan Anda. Anda kemudian dapat menghitung apakah ada objek di scene Anda berpotongan dengan sinar itu. Sekarang Anda tahu jika pengguna mengklik suatu objek.
Jadi, bagaimana Anda membuatnya berputar?
Saya menyadari dua jenis transformasi yang umumnya diterapkan:
Perbedaannya adalah itu tulang mempengaruhi tunggal simpul. Matriks selalu mempengaruhi semua simpul yang digambar dengan cara yang sama. Mari kita lihat contohnya.
Contoh
Sebelumnya, kami mengisinya matriks identitas sebelum menggambar segitiga kami. Matriks identitas adalah salah satu yang hanya menyediakan tidak ada transformasi sama sekali. Jadi, apa pun yang saya gambar, hanya dipengaruhi oleh perspektif saya. Jadi, segitiga itu tidak akan diputar sama sekali.
Jika saya ingin memutarnya sekarang, saya bisa melakukan matematika sendiri (pada CPU) dan cukup menelepon glVertex3f
denganlain koordinat (yang diputar). Atau saya bisa membiarkan GPU melakukan semua pekerjaan, dengan menelepon glRotatef
sebelum menggambar:
// Rotate The Triangle On The Y axis glRotatef (jumlah, 0.0f, 1.0f, 0.0f);
jumlah
adalah, tentu saja, hanya nilai yang tetap. Jika Anda menghendaki menghidupkan, Anda harus melacak jumlah
dan tingkatkan setiap bingkai.
Dalam contoh sederhana ini, kita tidak perlu peduli dengan matriks. Kami hanya menelepon glRotatef
dan mengurus semua itu untuk kita.
glRotate
menghasilkan rotasisudut
derajat di sekitar vektor x y z. Matriks saat ini (seeglMatrixMode) dikalikan dengan matriks rotasi dengan produk menggantikan matriks saat ini, seperti ifglMultMatrix dipanggil dengan matriks berikut sebagai argumennya:x 2 1 - c + cx y 1 - c - z sx z 1 - c + y s 0 y x 1 - c + z sy 2 1 - c + cy z 1 - c - x s 0 x z 1 - c - y sy z 1 - c + x sz 2 1 - c + c 0 0 0 0 1
Yah, terima kasih untuk itu!
Yang menjadi jelas adalah, ada banyak pembicaraan untuk OpenGL. Tapi itu tidak memberi tahu kami apa pun. Di mana komunikasi itu?
Satu-satunya hal yang dikatakan OpenGL dalam contoh ini adalah setelah selesai. Setiap operasi akan memakan waktu tertentu. Beberapa operasi membutuhkan waktu sangat lama, yang lain sangat cepat.
Mengirim simpul ke GPU akan sangat cepat, saya bahkan tidak tahu cara mengekspresikannya. Mengirim ribuan simpul dari CPU ke GPU, setiap frame, adalah, kemungkinan besar, tidak ada masalah sama sekali.
Menghapus layar dapat mengambil milidetik atau lebih buruk (perlu diingat, Anda biasanya hanya memiliki sekitar 16 milidetik waktu untuk menggambar setiap frame), tergantung pada seberapa besar viewport Anda. Untuk menghapusnya, OpenGL harus menggambar setiap piksel dalam warna yang ingin Anda bersihkan, yang bisa jutaan piksel.
Selain itu, kita cukup banyak hanya meminta OpenGL tentang kemampuan adapter grafis kami (resolusi max, max anti-aliasing, kedalaman warna maks, ...).
Tetapi kita juga bisa mengisi tekstur dengan piksel yang masing-masing memiliki warna tertentu. Setiap piksel memegang nilai dan teksturnya adalah "file" raksasa yang berisi data. Kita dapat memuatnya ke dalam kartu grafis (dengan membuat buffer tekstur), lalu memuat shader, memberi tahu shader itu untuk menggunakan tekstur kami sebagai input dan menjalankan beberapa perhitungan yang sangat berat pada “file” kami.
Kami kemudian dapat "membuat" hasil perhitungan kami (dalam bentuk warna baru) menjadi tekstur baru.
Itulah cara Anda membuat GPU berfungsi untuk Anda dengan cara lain. Saya berasumsi CUDA melakukan hal yang serupa dengan aspek itu, tetapi saya tidak pernah memiliki kesempatan untuk bekerja dengannya.
Kami benar-benar hanya sedikit menyentuh seluruh subjek. Pemrograman grafis 3D adalah neraka binatang buas.
Sumber Gambar
Memiliki sesuatu untuk ditambahkan ke penjelasan? Bicaralah di komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange yang paham teknologi lainnya? Lihat diskusi lengkap di sini.