Vakıflar: Üç Boyutlu Uzayı Yeniden Tanımlamak

Tek bir piksel çizilmeden önce, 3D motor uzayda nesneleri tanımlamak için matematiksel bir dile sahip olmalıdır.Anada <0)vectors) (üç sorumlu tuples temsil eden pozisyon, yön veya renk) ve [[Döneticileri).

  • [FONT=0) puanlar ve vektörler için.
  • [[Döneticileri sütun-major düzeninde depolanan dönüşüm matrisleri için.

Her nesne, kontigble dizileri (örneğin, s.) ile her bir pozisyonla üç fatikle tanımlanır.Bir üçgen, bir pozisyonla her bir pozisyonla ve tercihen normal ve renkle tanımlanır.Bunu geçici olarak sabit bir diziler (örneğin, [[Düzücükler için).

Grafik Boru: Vertices to Pixels

Bir grafik boru hattı, 3D sahne verilerini 2D görüntüye dönüştüren aşamaların bir dizisidir. Temel bir yazılım destekli motorda, her aşaması manuel olarak uygulayın.

  1. [FONT=0)Vertex Processing - modelleme, görüş ve projeksiyon dönüşümleri uygulayın.
  2. [FONT=0)Rasterization) - üçgenleri parçalara dönüştürmeye dönüştürmek (potansiyel piksel).
  3. [FONT:0)Shading[DÜT:1) - aydınlatma ve malzemeye dayanan her parçanın rengini hesaplamak.
  4. [FONT=0)Output Merging[DÜT:1) - derinlik testi de dahil olmak üzere çerçeve tamponla parça karıştırıyor.

Donanım destekli motorlar (OpenGL, Vulkan veya DirectX) GPU'daki bu adımların çoğunu gerçekleştirir, ancak yazılımın yolunu anlamak, GPU'nun nasıl çalıştığını derin bir şekilde anlamaktasınız.

Vertex Processing ve Dönüşümler

Her bir Veritex, [[0) Uzay[Dönetici][Dönetici:0) Model uzayı[Döneticileri nesneye göre hareket eder). Dünyadaki kamera-el koordinatlara (gören uzaya göre) koordinatlar (sonrası) Son olarak, [[Dönetici)[Döneticileri)[Döneticileri değiştirmiş olan haritalar[Döneticileri değiştirmiş gibi)

C'de dönüşüm işlevleri şöyle görünüyor:

  • [FONTD:3] – bir kimlik matrisi döndürür.
  • [[Dind:))) - bir çeviri matrisi inşa eder.
  • [FONT: 5) – X ekseninin etrafında dönüyor.
  • [[Düzücükler: 4element vektörü (homogeneous koordinatlar) tarafından 4×4 bir matrisi çokça ifade eder.

Yazılımda tüm veritabanları, her birini birleştirilmiş [[FONTT:7) matrisi ile dağıtın ve dönüştürülen bir vertex buffer'in sonucu saklar.

Projection: Perspektif Orthografik

Projection ekranda ne kadar derinlik temsil edildiğini kontrol eder.ETHFLT:0)Perspective projeksiyon), uzak nesneler daha küçük görünür, gerçekizm yaratır. matrixi, görünüş, yönü oranı alanından inşa edilir ve çok fazla klipler ile x ve y bileşenleri z (biraz çokluplikasyondan sonra). C, projeksiyon matrisini bir kez hesaplar ve her çerçeveyi yeniden yükleyin:

  • [FONTD: 4) – standart bir perspektif matrisi döndürür.

[FONT=0)Orthografik projeksiyon[[Dönetici:0) paralel hatları korur ve daha basit, UI veya CAD araçları için kullanılır.

Rasterization: Üçgenleri doldurun

projeksiyondan sonra, 2D ekran koordinatları (örneğin piksel pozisyonları) ve bir derinlik değeri (z) Rasterization, her üçgeni tam tam tam tam tam tam tam tam tam tam tam anlamıyla piksel koordinatlarını kapsayan parçalara ayırmaktadır. Klasik algoritma [[DQT:0)

  1. üçgenin üç yanını y-coord tarafından sıralayın.
  2. Sol ve sağ kenarları kapat, her tarama için bilgisayar x sınırları.
  3. yatay olarak her piksel için, parçanın derinliğini üçgenin etrafında arayarak hesaplar.
  4. BirFL:0) derinlemesine bir test[[Dönetici: parçanın zını derinlik tamponunda zaten değerle karşılaştırın.Eğer daha yakınsa, derinlik tamponunu güncelleyin ve parçanın rengini hesaplar.

C'de kenar koordinatörü algoritmayı etkin bir şekilde uygulamak, sabit döngüler ve sabit nokta arithmetici'nin yüzen bir akıştan kaçınmasını gerektirir.Birçok hobi motorlar brute-force yaklaşımı ile başlar (kırık kutuda her pikseli kontrol eder) ve daha sonra kenar denklemleri ile optimize eder.

Shading ve Aydınlatma

Basit bir düz-shaded motor üçgen başına tek bir renk kullanıyor, yüz normal ve tek bir ışık kaynağından hesaplandı.(0)Lambertian modeli) diffüz yoğunluğu verir:ENFLT:9. C, iki üçgen kenarların çapraz ürünü olarak normali dünya alanına dönüştürdüğünüzde, o zaman üçgenin temel rengi ile ışık yoğunluğunun çoğalır.

Derinlik eklemek için, uygulama:0)Gouraud shading[Dönetici: 1)) veya daha pahalı ama dramatik sonuçlar için bilgisayar aydınlatma.

C'deki Motoru Yapın: Pratik Adımlar

Minimum bir yazılım 3D motoru sıfırdan inşa ederek yürüyebilelim. Hedef, 640×480 piksel pencereye dönüşen bir küp haline getirmektir.

Adım 1 – Bir Pixel Buffer

Çerçeve ve derinlik için bir bellek tamponunu tanımlayın: 03.03.2012 ve [[Düzg.)

Adım 2 – Define Sahne Data

Bir küp için, altı yüz (12 üçgen) 12×3 = 36 fatices.Onlara pozisyonla bir dizi (yüz) ve renk (3, RGB için yüzler) gerektirir. 8 eşsiz küp ve altı yüz rengi.

Adım 3 – Dönüşüm Boru Hattı

Her çerçeve, model matrisi bir açıdan hesaplar (örneğin, döndürmek (zaman)), belirli bir kameradan gelen görünüm matrisi ve projeksiyon matrisi onları tek bir MVP matrisine dönüştürür:İLFLT:12, [[Döneticileri her türlü kopyalayın.) Sonra derinlik testi için NDC z (divide x,y,z) normalleştirilmiş cihaz koordinatları almak için (-1 to +1) Haritayı ekranlara taşıyın.

Adım 4 – Rasterize ve Shade

Her üçgen için, tarama yöntemi kullanın.Dış pikseli, derinlik testi geçerse per-vertex özelliği ile interpolate a per-vertex behavior (For Phong) veya sağda normal (Gouraud için) Uygulamayı yapın.Polonya diffüz denklemine son renk yazın.

Adım 5 – Ekran

SDL (Simple DirectMedia Katmanı) veya benzer bir kütüphaneyi pencere oluşturmak ve çerçeveyi göz ardı etmek için kullanın. Örneğin, SDL2: 03: 03), [[Üye Olmayanlar, [[Şerefliler,|Şerefliler, [[Üye Olmayanlar İçin Tıklayınız.

Bu yazılım yolu CPU'da çalışır, bu yüzden performans çerçevede birkaç bin üçgenle sınırlıdır.Bir kez rahat bir şekilde, OpenGL ile düğüm tabakasını değiştirebilirsiniz, C. dönüşüm ve sahne mantığınızı C.

Your Engine

Temel bir motor yavaştır. Birkaç optimizasyon gerçek zamanlı performans için önemlidir:

  • [FONT:0)Back-face culling:[D)[D) ] Kameradan normal olan üçgenleri atlayın. Projek üçgenin imza alanını ( 2D) ya da görünüşe göre yüzün normal ürün kontrol edin.
  • [FONT:0]Frustum culling: Görme frustum altı uçağına karşı bir nesnenin sınırlı kutusunu test edin.Eğer tamamen dışarıdaysa, tüm nesneyi atlayın.
  • [FONT=0)Fixed-point arithmetic:) Kompleks-düzeltme döngülerinde tam anlamıyla matematikle yüzer-düzeltme işlemlerinin değiştirilmesi. Birçok motor üreticisi, tarama için 16.16 sabit noktası kullanır.
  • [FONT:0)Öyle önbellek:[Dönetici:[Dönetici:0)[Dönbellek:[Dönbelli:0)[Dönbellek:[Dönetici:[Dönetici: 1) Bir kere bir ağdaki tüm kısımları dönüştürmekten kaçının, sonra indeksler kullanın.
  • [FONT:0]Blocked framework buffer şöyle yazıyor: hafızada piksel yaz (sol-to-right, üst-d-d-düşükücü hitleri en üst düzey)

Bu teknikler, 3-5 fps'den 60 fps'ye kadar bir yazılım değiştiricisi (örneğin, birkaç yüz üçgen).

Motoru uzatın

Katı bir temel var olduğunda, özellikleri artırılabilir:

  • [FONT=0]Texture mapping:[DDD resimler ve interpolate UV koordinatları üçgenler arasında düzgün sonuçlar için Implement Bilinmeyen filtreleme.
  • [FONT:0) İleride gölge:[Dönemli)[[Döncüler): Ortam (Blinn-Phong), çevre tıkanıklığı veya hatta gölge haritaları.
  • [FONT:0]Scene yönetimi:[Dönetici:[Dönetici:0)[Dönetici:[Dönetici:[Dönetici:[Dönetici: FLT:1) Hangi nesneleri görünür olduğunu hızlıca belirlemek için bir octree veya BSP ağacı kullanın.
  • [FONT:0) Kullanıcı etkileşimi:[Dönetici:[Dönetici:0) Kamerayı yörüngeye veya nesneleri seçmek için klavye ve fare girişiyle temasa geçmek.
  • [FONT:0)Pipeline soyutlama:[Dönetici:[Dönetici:) Bir gölge sistemi tasarlayın: fonksiyon noktası olarak, esnek bir şekilde yeniden işlenme imkanı sağlar.

Kaynaklar ve daha fazla okuma

Anlayışınızı derinleştirmek için, bu motoru ilham alan klasik metinleri ve online öğreticileri keşfedin:

  • [FONT=0]Scratchacrypt[[[Dönem: 1) – Ray tracing, kibrasyon ve matematik.
  • [FONT=0)LearnOpenGL[[[Döntgen: 1) – Modern OpenGL öğreticileri; “Hello Üçgeni” bölümü ile başlayın.
  • [FONT=0)Wikipedia: 3D Projection – Görsel ve ortoografik matriklerin arkasındaki resmi matematik.

C'de 3D motor inşa etmek grafikler için geçişin bir ritesidir. Sadece nasıl verimli kod yazacağını değil aynı zamanda üç boyutta nasıl düşünmek ve performans-kırık sistemler oluşturmak için.Tek bir dönen küple başlayın, sonra daha fazla üçgen, dokular ekleyin ve sonunda çiğ C'den ekrandaki her pikselin arkasına yolculuk yapın.