Anasayfa » nasıl » CPU ve GPU Bilgisayar Grafiklerini Oluşturma ile Nasıl Etkileşimde?

    CPU ve GPU Bilgisayar Grafiklerini Oluşturma ile Nasıl Etkileşimde?

    Bilgisayarınızın Merkezi İşlem Birimi (CPU) ve Grafik İşlem Birimi (GPU), bilgisayarınızı net ve duyarlı bir görsel arayüz sağlamak için her kullanışınızda birbiriyle etkileşime girer. Birlikte nasıl çalıştıklarını daha iyi anlamak için okumaya devam edin.

    fotoğrafı çeken sskennel.

    Bugünün Soru ve Cevap oturumu bize, bir soru-cevap web sitelerinin topluluk tarafından yönlendirilen bir grup grubu olan Stack Exchange'in bir alt birimi olan SuperUser'ın izniyle geliyor..

    Soru

    SuperUser okuyucu Sathya soruyu sordu:

    Burada OpenGL API'sini temel alan dönen bir üçgene sahip Triangle.exe adlı küçük bir C ++ programının ekran görüntüsünü görebilirsiniz..

    Kuşkusuz çok basit bir örnek ama bence diğer grafik kartı işlemlerine uygulanabilir.

    Sadece merak ettim ve Windows XP altında Triangle.exe üzerine çift tıklayarak monitörde dönen üçgeni görene kadar tüm süreci bilmek istedim. Ne olur, CPU (.exe'yi ilk önce ele alır) ve GPU (nihayet ekrandaki üçgeni çıkaran) nasıl etkileşime girer??

    Sanırım bu dönen üçgeni görüntülemeye dahil olmak, öncelikle diğerleri arasında aşağıdaki donanım / yazılımdır:

    Donanım

    • HDD
    • Sistem Belleği (RAM)
    • İşlemci
    • Video belleği
    • GPU
    • LCD ekran

    Yazılım

    • İşletim sistemi
    • DirectX / OpenGL API
    • Nvidia Sürücüsü

    Herkes süreci açıklayabilir mi, belki örnekleme için bir çeşit akış şeması ile?

    Her bir adımı kapsayan karmaşık bir açıklama olmamalıdır (kapsamın ötesine geçeceğini tahmin edin), ancak bir ara BT çalışanının izleyebileceği bir açıklama.

    BT uzmanları bile diyebilecek birçok insanın bu süreci doğru tanımlayamadığından eminim..

    Cevap

    Her ne kadar çok sayıda topluluk üyesi soruyu cevaplasa da, Oliver Salzburg ekstra mil kat etti ve sadece ayrıntılı bir cevapla değil, aynı zamanda mükemmel grafiklerle cevapladı..

    JasonC tarafından görüntü, burada duvar kağıdı olarak mevcut.

    O yazıyor:

    Programlama yönü ve bileşenlerin birbirleriyle nasıl konuştuğu hakkında biraz yazmaya karar verdim. Belki bazı bölgelere ışık tutabilir.

    Sunum

    Sorunuzda yayınladığınız tek bir görüntünün ekranda çizilmesi bile ne gerekiyor??

    Ekranda üçgen çizmek için birçok yol vardır. Basit olması için, hiçbir köşe arabelleğinin kullanılmadığını varsayalım. (A tepe arabelleğikoordinatları sakladığınız bir hafıza alanıdır.) Programın grafik işleme boru hattına her bir köşe (bir köşe sadece alandaki bir koordinattır) hakkında anlattığını varsayalım..

    Fakat, Bir şey çizemeden önce, ilk önce bir iskele kullanmalıyız. Göreceğiz niye ya sonra:

    // Ekranı ve Derinlik Tamponunu Temizle glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Geçerli Model Görünümü Matrisini Sıfırla glMatrixMode (GL_MODELVIEW); glLoadIdentity (); // Üçgenler Kullanarak Çizim glBegin (GL_TRIANGLES); // Kırmızı glColor3f (1.0f, 0.0f, 0.0f); // Üçgenin Üstü (Ön) glVertex3f (0.0f, 1.0f, 0.0f); // Yeşil glColor3f (0.0f, 1.0f, 0.0f); // Üçgenin Solu (Ön) glVertex3f (-1.0f, -1.0f, 1.0f); // Mavi glColor3f (0.0f, 0.0f, 1.0f); // Üçgenin Hakkı (Ön) glVertex3f (1.0f, -1.0f, 1.0f); // Çizim Yapıldı glEnd ();

    Peki bu ne yaptı?

    Grafik kartını kullanmak isteyen bir program yazdığınızda, genellikle sürücüye bir çeşit arayüz seçersiniz. Sürücünün iyi bilinen bazı arayüzleri:

    • OpenGL
    • Direct3D
    • CUDA

    Bu örnek için OpenGL'ye bağlı kalacağız. Şimdi senin sürücüye arayüz Programınızı yapmak için ihtiyacınız olan tüm araçları size sunar. konuşma grafik kartına (veya sürücüye görüşmeler karta).

    Bu arayüz size kesin olarak araçlar. Bu araçlar programınızdan çağırabileceğiniz bir API şeklini alır..

    Bu API, yukarıdaki örnekte kullanıldığını görüyoruz. Hadi daha yakından bakalım.

    İskele

    Herhangi bir gerçek çizimi yapmadan önce, bir kurmak. Görüntü alanınızı (gerçekte oluşturulacak alan), bakış açınızı ( kamera dünyanıza), hangi kenar yumuşatma özelliğini kullanacaksınız (üçgenin kenarını yumuşatmak için)…

    Ama hiçbirine bakmayacağız. Yapmanız gereken şeylere bir göz atacağız. her kare. Sevmek:

    Ekranı temizlemek

    Grafik hattı sizin için her karede ekranı temizlemeyecek. Bunu söylemen gerekecek. Niye ya? Bu nedenle:

    Ekranı temizlemezseniz, üzerinde çizmek Her karede. Bu yüzden çağırıyoruz. glClear ileGL_COLOR_BUFFER_BIT ayarlayın. Diğer bit (GL_DEPTH_BUFFER_BIT) OpenGL’e temizlemek derinliktampon. Bu tampon, hangi piksellerin diğer piksellerin önünde (veya arkasında) olduğunu belirlemek için kullanılır.

    dönüşüm


    Görüntü kaynağı

    Dönüşüm, tüm girdi koordinatlarını (üçgenimizin köşeleri) aldığımız ve ModelView matrisimizi uyguladığımız kısımdır. Bu matris açıklıyor nasıl bizim model (köşeler) döndürülür, ölçeklenir ve çevrilir (taşınır).

    Sonra, Projection matrisimizi uyguladık. Bu tüm koordinatları hareket ettirir, böylece kameramıza doğru bakacaklar.

    Şimdi, Viewport matrisimizle bir kez daha dönüşüyoruz. Bunu ölçeklendirmek için yapıyoruz. model monitörümüzün boyutuna. Şimdi işlenmeye hazır bir dizi köşemiz var!

    Bir süre sonra dönüşüme döneceğiz.

    Çizim

    Üçgen çizmek için OpenGL'ye yeni bir başlangıç ​​yapmasını söyleyebiliriz. üçgenlerin listesi arayarak glBegin ile GL_TRIANGLES sabit.
    Çizebileceğiniz başka formlar da var. Üçgen şerit veya üçgen fan gibi. Bunlar, CPU ve GPU arasında aynı miktarda üçgen çizebilmek için daha az iletişime ihtiyaç duydukları için, optimizasyonlardır..

    Bundan sonra, her üçgeni oluşturması gereken 3 köşe kümesinin bir listesini sağlayabiliriz. Her üçgen 3 koordinat kullanır (3B alanda olduğumuz gibi). Ayrıca, ben de bir renk Her köşe için, arayarakglColor3f önce çağrı glVertex3f.

    3 köşe (üçgenin 3 köşesi) arasındaki gölge OpenGL tarafından hesaplanır.otomatik olarak. Çokgenin tüm yüzündeki rengi enterpolasyon eder..

    etkileşim

    Şimdi, pencereye tıkladığınızda. Uygulamanın yalnızca tıklamayı gösteren pencere mesajını yakalaması gerekir. Ardından, programınızda istediğiniz herhangi bir işlemi gerçekleştirebilirsiniz..

    Bu bir alır çok 3D sahnenizle etkileşime geçmek istediğinizde daha zor.

    Öncelikle, kullanıcının pencereyi hangi pikselde tıklattığını net bir şekilde bilmek zorundasınız. Sonra, senin alarak perspektifhesaba katarak, bir farenin yönünü, fare tıklaması noktasından sahnenize kadar hesaplayabilirsiniz. Ardından sahnenizdeki herhangi bir nesneyi hesaplayabilirsiniz. kesiştiği o ışınla. Artık kullanıcının bir nesneyi tıklayıp tıklamadığını biliyorsunuz.

    Peki onu nasıl döndürürsün??

    dönüşüm

    Genelde uygulanan iki dönüşüm türünün farkındayım:

    • Matris tabanlı dönüşüm
    • Kemik bazlı dönüşüm

    Fark bu kemikler tek etkilemek köşe. Matrisler her zaman tüm çizilmiş köşeleri aynı şekilde etkiler. Bir örneğe bakalım.

    Örnek

    Daha önce, biz yükledik kimlik matrisi Üçgeni çizmeden önce. Kimlik matrisi basitçe sağlayan bir tanesidir dönüşüm yok hiç. Yani, ne çizersem çizeyim sadece bakış açımdan etkilenir. Yani, üçgen hiç döndürülmeyecek.

    Şimdi döndürmek istersem, matematiği kendim de yapabilirim (CPU'da) ve basitçe arayabilirim. glVertex3f ilediğer koordinatlar (döndürülmüş). Ya da GPU’nun tüm işleri arayabilmesine izin verebilirim. glRotatefçizimden önce:

    // Y Ekseni Üzerindeki Üçgeni Döndür glRotatef (tutar, 0.0f, 1.0f, 0.0f); 

    Miktar Tabii ki, sadece sabit bir değerdir. Eğer istersen hareketli, takip etmek zorunda kalacaksın Miktarve her kareyi arttırın.

    Öyleyse, bekle, daha önce tüm matris konuşmasına ne oldu??

    Bu basit örnekte, matrislerle ilgilenmek zorunda değiliz. Biz sadece çağrı glRotatef ve bizim için herşeyi halleder.

    glRotate bir dönüş üretir açı vektörün etrafında derece x y z. Geçerli matris (seeglMatrixMode), geçerli matrisi değiştiren ürünle birlikte bir döndürme matrisi ile çarpılır, sanki ifglMultMatrix, argümanı olarak aşağıdaki matris ile çağrılır:

    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

    Peki, bunun için teşekkürler!

    Sonuç

    Açık olan, çok fazla konuşma olduğu. için OpenGL. Ama anlatmıyor bize şey. İletişim nerede?

    Bu örnekte OpenGL’in bize söylediği tek şey bittiğinde. Her işlem belirli bir zaman alacaktır. Bazı operasyonlar inanılmaz derecede uzun sürüyor, bazıları ise inanılmaz derecede hızlı.

    Bir köşe gönderme GPU çok hızlı olacak, nasıl ifade edeceğimi bile bilemedim. İşlemciden GPU'ya binlerce köşe gönderme, her bir kare, büyük olasılıkla, hiç sorun değil.

    Ekranı temizlemek görünümünüzün ne kadar büyük olduğuna bağlı olarak bir milisaniye veya daha kötüsü alabilir (aklınızda bulundurun, genellikle her kareyi çizmek için yalnızca yaklaşık 16 milisaniyeniz vardır). Bunu temizlemek için, OpenGL'nin temizlemek istediğiniz renkteki her bir pikseli çizmesi gerekir, ki bu milyonlarca piksel olabilir..

    Bunun dışında OpenGL’ye grafik adaptörümüzün yeteneklerini (maksimum çözünürlük, maksimum kenar yumuşatma, maksimum renk derinliği,…) sorabiliriz..

    Ancak bir dokuyu, her biri belirli bir renge sahip piksellerle doldurabiliriz. Böylece her piksel bir değer tutar ve doku, verilerle dolu dev bir “dosyadır”. Bunu grafik kartına yükleyebiliriz (bir doku tamponu oluşturarak), sonra bir gölgelendirici yükleyebilir, bu gölgelendiriciye dokumuzu bir girdi olarak kullanmasını ve “dosyamızda” çok ağır hesaplamalar yapmasını söyleyebiliriz.

    Daha sonra, hesaplamanın sonucunu (yeni renkler biçiminde) yeni bir dokuya “yapabiliriz”.

    GPU'nun sizin için başka şekillerde çalışmasını sağlayabilirsiniz. CUDA'nın bu yönüyle benzer performans sergilediğini düşünüyorum, ancak bununla çalışma fırsatım hiç olmadı.

    Tüm konuya gerçekten sadece hafifçe dokunduk. 3D grafik programlama bir canavarı cehennemdir.


    Görüntü Kaynağı


    Açıklamaya eklemek için bir şey var mı? Yorumlarda ses kesiliyor. Diğer teknoloji meraklısı Stack Exchange kullanıcılarından daha fazla cevap okumak ister misiniz? Burada tüm tartışma konusuna göz atın.