Bagaimana Cara CPU dan GPU Berinteraksi dengan Render Grafik Komputer?

Daftar Isi:

Bagaimana Cara CPU dan GPU Berinteraksi dengan Render Grafik Komputer?
Bagaimana Cara CPU dan GPU Berinteraksi dengan Render Grafik Komputer?

Video: Bagaimana Cara CPU dan GPU Berinteraksi dengan Render Grafik Komputer?

Video: Bagaimana Cara CPU dan GPU Berinteraksi dengan Render Grafik Komputer?
Video: Cara Setting atau Ubah Tampilan Dock pada Ubuntu - YouTube 2024, April
Anonim
Unit Pemroses Pusat (CPU) dan Unit Pemrosesan Grafis komputer Anda (GPU) berinteraksi setiap saat Anda menggunakan komputer untuk memberikan antarmuka visual yang tajam dan responsif kepada Anda. Baca terus untuk lebih memahami bagaimana mereka bekerja bersama.
Unit Pemroses Pusat (CPU) dan Unit Pemrosesan Grafis komputer Anda (GPU) berinteraksi setiap saat Anda menggunakan komputer untuk memberikan antarmuka visual yang tajam dan responsif kepada Anda. Baca terus untuk lebih memahami bagaimana mereka bekerja bersama.

foto oleh sskennel.

Sesi Tanya & Jawab Hari ini hadir untuk memberi kami SuperUser - subdivisi Stack Exchange, pengelompokan komunitas situs web Tanya-Jawab.

Pertanyaan

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 sebagai contoh yang sangat dasar tetapi saya pikir itu berlaku untuk operasi kartu grafis lainnya.
Diakui sebagai contoh yang sangat dasar tetapi 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

  • HDD
  • Memori Sistem (RAM)
  • CPU
  • Memori video
  • GPU
  • layar LCD

Perangkat lunak

  • Sistem operasi
  • API DirectX / OpenGL
  • Nvidia Driver

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.

Jawabannya

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

Presentasi

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 mempermudah, mari kita asumsikan tidak ada penyangga vertex yang digunakan. (SEBUAH penyangga verteksadalah area memori tempat Anda menyimpan koordinat.) Mari kita asumsikan program tersebut hanya memberi tahu pipa pemrosesan grafis tentang setiap verteks tunggal (titik hanya berupa 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:

// Clear The Screen And The Depth Buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset The Current Modelview Matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Drawing Using Triangles glBegin(GL_TRIANGLES); // Red glColor3f(1.0f,0.0f,0.0f); // Top Of Triangle (Front) glVertex3f( 0.0f, 1.0f, 0.0f); // Green glColor3f(0.0f,1.0f,0.0f); // Left Of Triangle (Front) glVertex3f(-1.0f,-1.0f, 1.0f); // Blue glColor3f(0.0f,0.0f,1.0f); // Right Of Triangle (Front) glVertex3f( 1.0f,-1.0f, 1.0f); // Done Drawing glEnd();

Jadi apa yang dilakukannya?

Saat Anda menulis program yang ingin menggunakan kartu grafis, Anda biasanya akan memilih beberapa antarmuka untuk pengemudi. Beberapa antarmuka yang terkenal untuk pengemudi adalah:

  • OpenGL
  • Direct3D
  • CUDA

Untuk contoh ini, kami 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.

The Scaffolding

Sebelum Anda benar-benar dapat menggambar apa pun 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 kami 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:

Image
Image

Jika Anda tidak membersihkan layar, Anda akan dengan mudah menggambar setiap bingkai. Itu sebabnya kami menelepon

glClear

dengan

GL_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
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 sebentar lagi.

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 (seperti kita dalam ruang 3D). Selain itu, saya juga menyediakan warna untuk setiap titik, dengan menelepon

glColor3f

sebelum panggilan

glVertex3f

Bayangan antara 3 simpul (3 sudut segitiga) dihitung oleh OpenGL secara otomatis. Ini akan menginterpolasi warna di seluruh wajah poligon.

Interaksi

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?

Transformasi

Saya menyadari dua jenis transformasi yang umumnya diterapkan:

  • Transformasi berbasis matriks
  • Transformasi berbasis tulang

Perbedaannya adalah itu tulang mempengaruhi tunggal simpul. Matriks selalu mempengaruhi semua simpul yang digambar dengan cara yang sama. Mari kita lihat contoh.

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(amount,0.0f,1.0f,0.0f);

amount

adalah, tentu saja, hanya nilai yang tetap. Jika Anda menghendaki menghidupkan, Anda harus terus melacak

amount

dan tingkatkan setiap bingkai.

Jadi, tunggu, apa yang terjadi pada semua pembicaraan matriks tadi?

Dalam contoh sederhana ini, kita tidak perlu peduli dengan matriks. Kami hanya menelepon

glRotatef

dan mengurus semua itu untuk kita.

glRotate

menghasilkan rotasi

angle

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!

Kesimpulan

Yang menjadi jelas adalah, ada banyak pembicaraan untuk OpenGL. Tetapi itu tidak memberi tahu kami apa pun. Di mana komunikasi itu?

Satu-satunya hal yang dikatakan OpenGL dalam contoh ini adalah ketika selesai. Setiap operasi akan memakan waktu tertentu. Beberapa operasi membutuhkan waktu sangat lama, yang lain sangat cepat.

Mengirim simpul untuk GPU akan sangat cepat, saya bahkan tidak akan 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
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.

Direkomendasikan: