Astronomiya

3D məkanda ulduzlar göstərmək - AbsMag-dən OpenGL miqyaslı dəyərlərə

3D məkanda ulduzlar göstərmək - AbsMag-dən OpenGL miqyaslı dəyərlərə



We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Ulduzları 3D məkanda göstərmək üçün AMNH-nin Rəqəmsal Kainat stars.speck sənədindən istifadə edirəm. Ləkədə Günəşimizin 0,0,0-də olduğu parsek miqyaslı koordinatlar var. Ayrıca AbsMag dəyərlərini siyahıya alır - yəni 10 parsek uzaqlıqdakı parlaqlıq. İndi ulduz dokularımı openGL-də ölçmək istəyirəm, nəticədə çıxan ulduz ölçüləri dəqiqdir. AbsMag tərs loqaritmik miqyasını 0,0 ulduzun getdiyini ifadə edən və 1,0-un dəyişmədiyi 0-sonsuzluq miqyasına necə çevirə bilərəm? Aydındır ki, Günəşi 1-də saxlaya bilməz, çünki bu onu nəhəng edəcəkdir.


"Doğru ulduz ölçüsü" problemdir. Aydındır ki, ulduzların dəqiq açısal həlli üçün ekranınızda qətnamə yoxdur (olduqca absurd bir incə qətnamə tələb edərlər) və dinamik parlaqlıq aralığı da çox azdır - ulduzlar parlaqlıqda bir çox böyüklük əmri üzərində dəyişir, daha çox bir ekran göstərə bilər. Dərindən zəhlətökən. İnsanın etmək istədiyi şey, hər bir ulduzun səmadakı həqiqi parlaqlığı ilə mütənasib bir parlaqlığa və ekran ölçüsünə sahib olmasıdır ki, səmanın verəcəyi hissi verəcəkdir. Bu, hələ də çox çətindir, çünki ekranlar fərqli qamma düzəlişlərinə malikdir. Üstəlik, insan gözü işığa olduqca loqaritmik bir reaksiyaya malikdir (bu səbəbdən böyüklüklər və qamma düzəltmə mənalı olur).

Budur kobud bir fikir. AbsMag ilə bir ulduz $ M $ həqiqi bir parlaqlığa malikdir $$ L = L_ odot 10 ^ {0.4 (M_ odot - M)} $$ harada $ L_ odot $ günəşin parlaqlığıdır və $ M_ odot $ günəşin mütləq böyüklüyüdür. Parlaqlığı yalnız baxımından sayırıqsa işlər asanlaşır $ L_ odot $, günəşi bir parlaqlıq vahidi halına gətirir.

Radius nöqtəsi $ r $ parıltı ilə ekranda $ l $ kimi güc yayır $ P = pi r ^ 2 l $. Bu parıltı qamma ilə düzəldilən luma dəyərindən qaynaqlanır $ V $ kompüter göstərir: $ l = K V ^ qamma $.

Radiusun da parlaqlıqla dəyişdiyini fərz etsək $ r (L) $, Mən çalışardım $ r (L) = r_0 L ^ a $ harada $ a təqribən 0,6 $ (ancaq bu təxmindir) və günəş radiusa malikdir $ r_0 $ piksel.

Beləliklə, bunu bir araya gətirməyə çalışarkən, piksel parlaqlığını olduğu kimi əldə edirik $$ V = V_0 (L / r (L) ^ 2) ^ {1 / gamma} = V'_0 L ^ {(1-2a) / gamma} $$ harada $ V_0 $$ V'_0 $ bu modeldə günəş üçün istifadə olunan piksel parlaqlıqlarıdır. Əsasən bu həqiqi parlaqlığı əzir $ a $ (daha parlaq ulduzlar üçün daha böyük ləkələrdən istifadə etməyi, gərgin piksel tələb etmir) və $ gamma $ (ekranı və gözü düzəltmək üçün). Ekran fotometri avadanlıqlarını istifadə etmək istəmədiyiniz təqdirdə istifadə ediləcək dəyərlər böyük ölçüdə sınaq və səhv olacaqdır.

Beləliklə, mütləq böyüklükdən piksel dəyərinə çevrilən tam formul belə olacaqdır: $$ V = V_0 10 ^ {0.4 (4.83 - M) (1-2a) / gamma}. $$


Bu bir cavab deyil, ancaq dəqiq açısal diametrli ulduzları göstərməyin niyə pis bir fikir olduğunu izah etməyə kömək edə bilər.

Hər https://www.eso.org/public/usa/news/eso9706/ üçün ən böyük açısal diametri olan ulduz, 0,057 ars / saniyədə R Doradus'dur və dərəcənin 1/63158 hissəsinə çevrilir.

Tuvalınız üçün "sıx" 9 dərəcə bir görünüş istifadə etsəniz belə, 0,057 saniyə ekranın yalnız 1/568421 hissəsini tutacaqdı. Başqa sözlə, ulduzun 0,5 piksel genişliyində olması üçün şəkliniz ən azı 284211 piksel olmalıdır, bu da 1 pikseli yuvarlaya biləcəyiniz ən kiçik məbləğdir.

Hətta gözlərimiz bu şəkildə ulduzları görmür, yoxsa gecə səması tamamilə qara görünür (ay, planetlər və yerin yaratdığı işığ istisna olmaqla).

Göründüyü qədər yaxşı bir fikir kimi, ulduzları həqiqi ölçüləri kimi göstərmək pis bir fikirdir, çünki indi kameralar və ya hətta öz gözlərimiz onları görür.


Celestia Forumları

Bunlar, 28 Noyabr 2019 tarixinə olan adi Celestia üçün celestia.cfg dosyası ilə birlikdə məlumat sənədləridir. Kifayət qədər vaxt tapsam gələcəkdə bunu mütəmadi olaraq yeniləyə bilərəm.

#************************************************************************
# Celestia Konfiqurasiya Dosyası - 3/1/12 tarixində düzəliş edildi
#
# Bu fayl Celestia tərəfindən hər dəfə oxunduğu konfiqurasiya məlumatlarını ehtiva edir
# işlədilir. Maddələrin çoxu xüsusi ehtiyaclarınıza uyğun dəyişdirilə bilər
# və ya tələblər. Zəhmət olmasa bu sənədin bir nüsxəsini özünüzdən əvvəl çıxarın
# hər hansı bir dəyişiklik edin.
#
# Celestia haqqında daha çox məlumat üçün Celestia forumlarını ziyarət edin:
# http://www.shatters.net/forum/
# və ya Celestia veb saytı: http://www.shatters.net/celestia/
#************************************************************************

#------------------------------------------------------------------------
# Bu bölmə Celestia-nın yükləmək üçün istifadə etdiyi məlumat sənədlərinin siyahısını ehtiva edir
ulduzlar, bürclər və yerlər haqqında # məlumat. Dəyişməyin
# bu fayl adları və ya siyahı sırası, siz olmadıqca
# nə etdiyinizi dəqiq bilmək. Bu sənədlərin əksəriyyətinə baxmaq olar
# düz mətn redaktoru ilə. Məzmunu və formatları barədə müzakirə
# Celestia forumlarında tapıla bilər: http://www.shatters.net/forum/
#
# Bütün ulduzlarınızı .stc fayllarından yükləmək istəyirsinizsə, indi şərh yaza bilərsiniz
# StarDatabase girişindən.
#------------------------------------------------------------------------
StarDatabase & quotdata / stars1M.dat & quot
StarNameDatabase & quotdata / starnames-ED.dat & quot # starnames.dat əvəz edir
StarCatalogs & # 91 & quotdata / revised.stc & quot
& quotdata / extrasolar.stc & quot
& quotdata / nearstars.stc & quot
& quotdata / charm2.stc & quot
& quotdata / visualbins.stc & quot
& quotdata / spectbins.stc & quot & # 93

HDCrossIndex & quotdata / hdxindex.dat & quot
SAOCrossIndex & quotdata / saoxindex.dat & quot
GlieseCrossIndex & quotdata / gliesexindex.dat & quot

SolarSystemCatalogs & # 91 & quotdata / solarsys-educational.ssc & quot
& quotdata / asteroids-educational.ssc & quot
& quotdata / comets-educational.ssc & quot
& quotdata / outersys-educational.ssc & quot
& quotdata / DIRL_comets_v3.02.ssc & quot
# & quotdata / spacecraft.ssc & quot
& quotdata / extrasolar.ssc & quot
# & quotdata / solsys_locs-educational.ssc & quot
# & quotdata / eros_locs.ssc & quot
# & quotdata / gaspra_locs.ssc & quot
# & quotdata / ida_locs.ssc & quot
# & quotdata / merc_locs.ssc & quot
# & quotdata / venus_locs.ssc & quot
# & quotdata / earth_locs.ssc & quot
& quotdata / mars_locs.ssc & quot
& quotdata / moon_locs.ssc & quot
# & quotdata / marsmoons_locs.ssc & quot
# & quotdata / jupitermoons_locs.ssc & quot
# & quotdata / saturnmoons_locs.ssc & quot
# & quotdata / uranusmoons_locs.ssc & quot
# & quotdata / neptunemoons_locs.ssc & quot
& quotdata / ring_locs.ssc & quot
& quotdata / world-capitals.ssc & quot & # 93
DeepSkyCatalogs & # 91 & quotdata / galaxies2.dsc & quot
& quotdata / globulars.dsc & quot & # 93

AsterizmlərFile & quotdata / asterisms.dat & quot
BoundariesFile & quotdata / borderaries.dat & quot

#------------------------------------------------------------------------
# Hər bir spektral tip üçün standart ulduz dokuları
#
# Varsayılan dokular ayrı-ayrı ulduz təriflərində ləğv edilə bilər.
#------------------------------------------------------------------------
StarTextures
<
# Bu toxuma siyahıda olmayan hər hansı bir spektral tip üçün istifadə ediləcəkdir
# bu blokda.
Varsayılan & quotgstar. * & Quot

#------------------------------------------------------------------------
# İstifadəçi interfeysi sənədləri.
#
# & Quot.cel & quot fayl uzantısına baxmayaraq, bunlar CEL skriptləri deyil, ancaq
# daha çox menyu və informasiya qutusu kimi idarəetmə sənədlərini dolduran məlumat faylları
# qutu.
#
# Sık Kullanılanlar
# -------------
# Bu, Əlfəcinlər məlumatlarının saxlandığı yerdir. Fayl qədər mövcud deyil
# Celestia içərisindən bir Əlfəcin saxlayırsınız. Bu faylı ilə baxa bilərsiniz
# düz mətn redaktoru və CEL skriptlərini yazırsınızsa, bir neçəsini ehtiva edir
# faydalı məlumat.
#
# DestinationFile
# ---------------
# Bu, Bələdçi informasiya qutusunda istifadə olunan yerlərin siyahısı,
# Naviqasiya Menyusu vasitəsilə əldə edildi. Bu faylı düzənliklə düzəldə bilərsiniz
Öz təyinat yerlərinizi informasiya qutusuna əlavə etmək üçün # mətn redaktoru. Sifariş
Faylda siyahıda göstərilən # şey sıralanma qaydasıdır
# Tour Guide informasiya qutusunda siyahıya alınacaq.
#
# Kursor
# ------
# Bu parametr üç imlec arasından seçim etməyə imkan verir, lakin hazırda
# yalnız Celestia'nın Windows versiyasında.
# * Ağ çarpaz (& quotcrosshair & quot) - & gt default kursor
# * Ters çevrilmiş çarpaz (& quinverting crosshair & quot)
# * Standart Windows oxu (& quotarrow & quot)
#
# Tərs çarpaz çarx daha yaxşı olduğundan daha yaxşı bir seçim ola bilər
# parlaq fonlarda görünür. Ancaq bunu sınamağa qərar verməlisən
# kursor, bunu yaxından sınayın. Bütün qrafik çipsetləri tərs çevrilməni dəstəkləmir
# kursor, bu da Windows-un proqram emulyasiyasına geri dönməsinə səbəb olacaqdır.
# Təqlid edilmiş kursor, uğursuz halda OpenGL tətbiqetmələri ilə qarşılıqlı əlaqə qurur
# yol, bir çox əlavə yenidən çəkilməyə və çərçivənin yarısı ilə kəsilməyə məcbur edilir
GeForce2 ilə təchiz olunmuş noutbukda # nisbət. Beləliklə, bunu dəyişdirsəniz, yoxlayın
Windows'u proqrama başlamadığınızdan əmin olmaq üçün # FPS dərəcələri
# emulyasiya rejimi.
#------------------------------------------------------------------------
FavorilerFayl & quotfavorites.cel & quot
DestinationFile & quotguide.cel & quot
Kursor & quotcrosshair & quot

# LUA təhsil interfeysini açır

#------------------------------------------------------------------------
# CEL skript sənədləri daxildir.
#
# Aşağıdakı CEL skript sənədləri əsas Celestia-ya daxil edilmişdir
# paylama. Bu skript sənədlərinə a ilə baxıla və düzəliş edilə bilər
# düz mətn redaktoru. Hər ikisi də sizin üçün uyğun dəyişdirilə və ya dəyişdirilə bilər
# xüsusi ehtiyaclar.
#
# InitScript hər dəfə avtomatik olaraq işləyən CEL skriptidir
# Celestia başladı. Varsayılan skript (start.cel) Io-ya gedir, biri
# Yupiterin ayı.
#
# DemoScript & quot & quot düyməsini basdığınızda işlədilən CEL skriptidir
Celestia içərisindəki klaviaturanızda #. Varsayılan skript (demo.cel)
# sizi Günəşdəki bəzi maraqlı yerlərə qısa bir tura aparır
# sistem.
#
# CEL və Lua skriptlərinin istifadəsi və yazılması haqqında daha çox məlumat əldə etmək
Celestia'da #, Celestia Scripting forumunu ziyarət edin:
# http://www.shatters.net/forum/viewforum.php?f=9
#------------------------------------------------------------------------
InitScript & quotSlowerGo-start-ED.celx & quot
DemoScript & quotdemo.cel & quot

#------------------------------------------------------------------------
# 'Əlavələr' kataloqu, celestia kök qovluğunun altında yerləşir
# və Celestia'ya üçüncü tərəf əlavələrini saxlamaq üçün istifadə olunur. Öyrənmək
# Celestia üçün Əlavələr haqqında daha çox məlumat, Celestia Əlavələr forumunu ziyarət edin:
# http://www.shatters.net/forum/viewforum.php?f=6
#
# Əlavə edərək əlavə əlavə dizinləri təyin edə bilərsiniz
Aşağıdakı nümunə kimi # giriş:
# ƏlavələrDedektorlar & # 91 & sitatlar & quot & quotmyextras1 & quot & quotmyextras2 & quot & # 93
#
# Pəncərələrdə mütləq yolları göstərmək üçün ya & quot / & quot və ya istifadə etməlisiniz
# yol komponentlərini ayırmaq üçün # ikiqat ters dönmə. Misal:
# ƏlavələrDedektoriyalar & # 91 & quotD: / celestia-ekstralar & quot & # 93
# və ya
# ƏlavələrDedektoriyalar & # 91 & quotD: celestia-ekstralar & quot & # 93
#------------------------------------------------------------------------
ƏlavələrDedektorlar & # 91 & alıntılar & quot & alıntılı-əlavə / ümumi & quot & # 93

#------------------------------------------------------------------------
# Şrift tərifləri.
#
# Aşağıdakı qeydlər Celestia'nın göstərmək üçün istifadə edəcəyi şriftləri təyin edir
Ekranda # mətn. İlə mövcud olan şriftlər siyahısına baxmaq üçün
# Celestia dağılımınız, yerləşən şriftlər qovluğuna baxın
# Celestia kök qovluğu altında. Varsayılan şriftlər UTF-8-dir
İngilis olmayan simvolları göstərmək üçün # uyğundur.
#
# Font: Bütün məlumat mətnlərini göstərmək üçün istifadə olunur.
# Varsayılan: & quotsans12.txf & quot
#
# LabelFont: Bütün etiket mətnlərini (obyektlər, yerlər və s.) Göstərmək üçün istifadə olunur.
# Varsayılan & quotsans12.txf & quot
#
# TitleFont: obyekt adlarını, mesajlarını və skript mətnini göstərmək üçün istifadə olunur.
# Varsayılan & quotsansbold20.txf & quot
#------------------------------------------------------------------------
Yazı tipi və quotsans12.txf & quot
LabelFont & quotsans12.txf & quot
TitleFont & quotsansbold20.txf & quot

#------------------------------------------------------------------------
# FaintestVisibleMagnitude ulduzun ən aşağı böyüklüyünü təyin edir
# Celestia'da göstəriləcək. Bu parametr real vaxt rejimində tənzimlənə bilər
# Celestia'daki '& # 91' və '& # 93' düymələri ilə. Varsayılan dəyər 6.0-dır.
#------------------------------------------------------------------------
Ən zəif görünən böyüklük 9.2

#------------------------------------------------------------------------
# RotateAcceleration bir obyektin olacağı sürəti təyin edir
# sol və sağ kimi bir düyməyə basarkən Celestia'da döndü
# ox düymələri. Daha yüksək bir dəyər obyekti daha sürətli döndərəcək, a
# aşağı dəyər daha yavaş bir dönməyə səbəb olacaqdır. Varsayılan dəyər 120.0-dır.
#------------------------------------------------------------------------
Sürətləndirmə 40.0

#------------------------------------------------------------------------
# Siçan Döndürmə Həssaslığı bir cismin olacağı sürəti təyin edir
# siçanı istifadə edərkən Celestia'da döndü - hər iki siçan düyməsini basın
# və ya Ctrl + LeftMouseButton düyməsini basın və siçanı sağa və ya sağa sürün. Daha yüksək
# dəyər, obyekti daha sürətli döndərəcək, daha aşağı bir dəyər isə səbəb olacaqdır
# daha yavaş bir fırlanma. 0.0 (sıfır) dəyəri bu hissəcikləri deaktiv edəcəkdir
# xüsusiyyət. Varsayılan dəyər 1.0-dir.
#------------------------------------------------------------------------
Siçan Dönmə Həssaslığı 1.0

#------------------------------------------------------------------------
# Aşağıdakı parametr Lua (.celx) skriptində istifadə olunur.
#
# ScriptScreenshotDirectory ekran görüntülərinin olduğu qovluğu təyin edir
# saxlanılmalıdır. Varsayılan dəyər & quot & quot, yəni Celestia'dır
# quraşdırma qovluğu.
#------------------------------------------------------------------------
ScriptScreenshotDirectory & quot & quot

#------------------------------------------------------------------------
# CELX skriptləri təhlükəli əməliyyatlar üçün icazə tələb edə bilər,
# oxumaq, yazmaq və sənədləri silmək və ya xaricdən icra etmək
# proqram. Verildiyi təqdirdə zərərli bir skript bundan məhv etmək üçün istifadə edə bilər
# məlumat və ya kompromis sistem təhlükəsizliyi.
# Aşağıdakı parametr Celestia'nın bunun üzərinə nə edəcəyini təyin edir
# istək:
# & quotask & quot: istifadəçidən girişə icazə veriləcəyini soruşun (standart)
# & quotallow & quot: həmişə belə istəklərə icazə verin
# & quotdeny & quot: həmişə belə istəkləri rədd edin
#------------------------------------------------------------------------
ScriptSystemAccessPolicy & quotask & quot

#------------------------------------------------------------------------
# Aşağıdakı sətirlər detal parametrlərini göstərir. Daha yüksək təyin etmək
# dəyərlər daha keyfiyyətli şəkillər istehsal edəcək, lakin bir az daha yaşlı ola bilər
# sistem daha yavaş çalışacaq.
#
# OrbitPathSamplePoints nə vaxt istifadə edəcəyini müəyyənləşdirir
# göstərmə orbit yolları. Varsayılan dəyər 100-dür.
#
# RingSystemSections bölmənin yerləşdiyi hissələrin sayını təyin edir
# sistem göstərilmişdir. Varsayılan dəyər 100-dür.
#
# ShadowTextureSize istifadə ediləcək kölgə toxumasının ölçüsünü * müəyyənləşdirir.
# Varsayılan dəyər 256-dır. Maksimum faydalı dəyər 2048-dir.
#
# EclipseTextureSize istifadə ediləcək tutulma toxumasının ölçüsünü * müəyyənləşdirir.
# Varsayılan dəyər 128-dir. Maksimum faydalı dəyər 1024-dir.
#
# * ShadowTextureSize və EclipseTextureSize dəyərlərinin hər ikisi olmalıdır
# ikisinin gücü (128, 256, 512, vs.). Daha böyük dəyərlərdən istifadə etmək olacaq
# planetimizdəki tutulma kölgələrinin və kölgələrin cırıq kənarlarını azaldır
# səslənir, lakin yaddaşın həcmini azaldır
# planet dokuları.
#------------------------------------------------------------------------
OrbitPathSamplePoints 100
RingSystemBölmələr 512

ShadowTextureSize 1024
EclipseTextureSize 512

#-----------------------------------------------------------------------
# Çoxsaylı antialiasing səviyyəsini təyin edin. Hamısı 3D qrafika deyil
# hardware antialiasing'i dəstəkləyir, baxmayaraq ki, ən yeni qrafik çipsetləri
# et. Daha böyük dəyərlər, məsrəflərin daha hamar olmasına səbəb olacaqdır
# göstərmə sürəti. 4, son, daha yüksək səviyyəli bir hissdir
# qrafik donanım 2, ehtimal ki, daha yaxşı orta səviyyəli qrafikdir. The
# varsayılan dəyər 1-dir, bu da antialiazmanı söndürür.
Antialiasing Nümunələr 4

#------------------------------------------------------------------------
# Aşağıdakı sətir standart olaraq şərh olunur.
#
# Celestia, müəyyən göstərmə xüsusiyyətlərini əsas götürərək aktivləşdirir və aradan qaldırır
# quraşdırılmış OpenGL sürücüsü və 3D tərəfindən dəstəklənən uzantılar dəsti
# qrafik avadanlıq. IgnoreGLExtensions ilə bir siyahısını təyin edə bilərsiniz
Celestia'nın dəstəklənmədiyi kimi davranacağı # uzantılar. Bu faydalıdır
# ilk növbədə Celestia inkişaf etdiriciləri üçün.
#------------------------------------------------------------------------
# IGoreGLE Extensions & # 91 & quotGL_ARB_vertex_program & quot & # 93

Qeydlər:
* Bəzi detallar tamamilə fantaziyadır - məsələn, & quotTimmy & quot; & quotCosmo & quot; & quotWanda & quot, & quotJazz & quot; & quotJack & quot, & Barnard's Star, Luyten üçün & quotMaddie & quot adları kimi Fairly OddParents və Danny Phantom personajlarının adları müxtəlif ulduzlara verilə bilər. -8 B və A, Y Canum Venaticorum, Betelgeuse və Antares. Onları düzəltmək istəyə bilərsiniz.
* Bu edir YOX düzəltdiyim bütün addonları daxil edin.
* Bu dizayn edilmişdir xüsusilə Celestia 1.6.1.-ED-də istifadə üçün, beləliklə, bu normal Celestia (1.6.1. və ​​ya 1.7.0.) və ya Celestia Origin ilə istifadə olunarsa, digər əlavə maddələrlə zidd ola bilər. Əlbətdə ki, bu faylları uyğunlaşdırmaq üçün onları düzəldin.


OpenGL ilə 3D Qrafika

Müasir gün kompüteri öz qrafik yaddaşına (və ya Video RAM və ya VRAM) sahib olan ekran üçün şəkillər istehsal etmək üçün Qrafik İşləmə Birliyinə (GPU) ayrılmışdır.

Piksel və Çərçivə

Bütün müasir ekranlar raster əsaslıdır. Raster, 2D düzbucaqlı piksel (və ya şəkil elementləri) ızgarasıdır. Pikselin iki xüsusiyyəti var: rəng və mövqe. Rəng RGB (Qırmızı-Yaşıl-Mavi) komponentlərlə ifadə olunur - adətən hər komponent üçün 8 bit və ya piksel başına 24 bit (və ya həqiqi rəng). Mövqe (x, y) koordinatları ilə ifadə olunur. Başlanğıc (0, 0) sol üst küncdə, x oxu sağa və y oxu aşağıya yönəldilmişdir. Bu, y oxunun yuxarıya doğru yönəldiyi şərti 2D Kartezyen koordinatlarından fərqlidir.

Piksel başına rəng bitlərinin sayı dərinlik (və ya dəqiqlik) ekranın. Düzbucaqlı ızgaranın sütunlarına görə sətirlərin sayına görüntü imkanı 640x480 (VGA), 800x600 (SVGA), 1024x768 (XGA) ilə 1920x1080 (FHD) arasında dəyişə bilən ekranın.

Çərçivə Tamponu və Yeniləmə dərəcəsi

Piksellərin rəng dəyərləri qrafika yaddaşının adlanan xüsusi hissəsində saxlanılır çərçivə buferi. GPU rəng dəyərini çərçivə tamponuna yazır. Ekranda rəng dəyərləri kadr buferindən sıra-sətir, soldan sağa, yuxarıdan aşağıya oxunur və dəyərlərin hər birini ekrana qoyur. Bu kimi tanınır raster tarama. Ekran saniyədə bir neçə dəfə ekranını yeniləyir, LCD monitorlar üçün adətən 60Hz və CRT boruları üçün daha yüksəkdir. Bu kimi tanınır yeniləmə dərəcəsi.

Tam ekran görüntüsünə a deyilir çərçivə.

İkiqat Tamponlama və VSync

Ekran cari çərçivəni göstərmək üçün çərçivə tamponundan oxuyarkən, növbəti kadr üçün tərkibini yeniləyirik (mütləq raster tarama qaydasında deyil). Bu sözdə ilə nəticələnəcəkdir cırmaqekranda köhnə çərçivənin hissələri və yeni çərçivənin hissələri göstərilir.

Bu sözdə istifadə edərək həll edilə bilər cüt tamponlama. Tək bir çərçivə tamponu istifadə etmək əvəzinə, müasir GPU onlardan ikisini istifadə edir: a ön tampon və a arxa tampon. Ekranda ön tampondan oxunur, növbəti kadrı isə arxa tampona yaza bilərik. İşimizi bitirdikdən sonra GPU-ya ön və arxa tamponu dəyişdirmə siqnalı veririk bufer dəyişdirmə və ya səhifə çevir).

Yalnız cüt tamponlama bütün problemi həll etmir, çünki tampon mübadiləsi uyğun olmayan bir vaxtda baş verə bilər, məsələn, ekran köhnə kadrın ortasında göstərilir. Bu sözdə yolu ilə həll olunur şaquli sinxronizasiya (və ya VSync) raster taramasının sonunda. Tampon dəyişdirmə əməliyyatı üçün GPU-ya siqnal verdiyimiz zaman, GPU bütün cari kadr göstərildikdən sonra həqiqi svopu yerinə yetirmək üçün növbəti VSync-ə qədər gözləyəcəkdir.

Ən vacib məqam budur: VSync bufer dəyişdirmə aktiv olduqda, ekranı ekranın yeniləmə sürətindən daha sürətli yeniləyə bilməzsiniz. LCD / LED ekranlar üçün yeniləmə dərəcəsi ümumiyyətlə saniyədə 60 Hz və ya 60 kare və ya hər kare üçün 16,7 milisaniyədə kilidlənir. Bundan əlavə, tətbiqetmə sabit bir sürətlə təzələnirsə, nəticədə yenilənmə sürəti ekranın yeniləmə sürətinin ayrılmaz bir faktoru ola bilər, yəni 1/2, 1/3, 1/4 və s.

3D Graphics Rendering Boru Kəməri

A boru kəməri, hesablama terminologiyasında, bir mərhələdən çıxan məhsulun fabrika toplama xətti və ya su / yağ borusuna bənzər bir sonrakı mərhələnin girişi kimi verildiyi bir sıra işləmə mərhələlərini nəzərdə tutur. Kütləvi paralelliklə boru kəməri ümumi məhsuldarlığı xeyli yaxşılaşdırır.

Kompüter qrafikasında, göstərmə model təsvirindən ekranda görüntü istehsal prosesidir.

The 3D Graphics Rendering Boru Kəməri 3B cisimlərin ibtidaları (üçbucaq, nöqtə, xətt və dördbucaq kimi) zirvələri baxımından təsvirini qəbul edir və ekrandakı piksellər üçün rəng dəyərini yaradır.

3D qrafik göstərmə boru kəməri aşağıdakı əsas mərhələlərdən ibarətdir:

  1. Vertex Qenerasiya: Fərdi zirvələri işləyin və çevirin.
  2. Rasterizasiya: Hər bir ibtidai (birləşdirilmiş təpələri) bir hissə parçasına çevirin. Bir fraqment, mövqe, rəng, normal və toxuma kimi atributlarla piksel ızgarasına uyğunlaşdırılan 3D boşluqlarda piksel kimi qəbul edilə bilər.
  3. Parçaların işlənməsi: Fərdi parçaları işləyin.
  4. Çıxış Birləşdirmə: Bütün primitivlərin fraqmentlərini (3B məkanda) ekran üçün 2D rəng pikselinə birləşdirin.

Müasir GPU-lərdə vertex işləmə mərhələsi və fraqment işləmə mərhələsi proqramlaşdırıla bilər. Kimi tanınan proqramlar yaza bilərsiniz vertex shaderfraqment shader zirvələr və fraqmentlər üçün xüsusi çevrilməni həyata keçirmək. Shader proqramları GLSL (OpenGL Shading Language), HLSL (Microsoft Direct3D üçün High Level Shading Language) və ya Cg (NVIDIA by Graphics for C) kimi C kimi yüksək səviyyəli dillərdə yazılmışdır.

Digər tərəfdən, rasterizasiya və nəticənin birləşmə mərhələləri proqramlaşdırıla bilməz, lakin konfiqurasiya edilə bilər - GPU-ya verilən konfiqurasiya əmrləri vasitəsilə.

Vertices, Primitives, Fragment and Pixels

3D Qrafik Koordinat Sistemləri

OpenGL qəbul edir Sağ əl koordinat sistemi (RHS). RHS-də x oxu sağa, y oxu yuxarıya və z oxu ekrana baxır. Sağ əl barmaqlarınızla x oxundan y oxuna doğru əyilməklə baş barmağınız z oxuna işarə edir. RHS edir saat yönünün əksinə (CCW). 3D Kartezyen Koordinatları bir RHS-dir.

Bəzi qrafik proqramları (məsələn, Microsoft Direct3D) istifadə edir Sol sistem (LHS), burada z oxunun tərs olduğu. LHS saat yönünə (CW) bərabərdir. Bu yazıda OpenGL-də istifadə olunan RHS və CCW-ni qəbul edəcəyik.

Primitivlər

Graphics Rendering Boru Kəmərinin girişləri həndəsidir ibtidai tərəfindən qurulan (üçbucaq, nöqtə, xətt və ya dördbucaq kimi) bir və ya daha çox təpə.

OpenGL üç həndəsi ibtidai sinifləri dəstəkləyir: xal, xətt seqmentləriqapalı poliqonlar. Onlar zirvələr vasitəsilə müəyyən edilir. Hər bir zirvə mövqeyi, rəngi, normal və toxuması kimi xüsusiyyətləri ilə əlaqələndirilir. OpenGL göstərildiyi kimi 10 primitiv təqdim edir. Kürə, 3D qutu və piramida ibtidai deyil. Tipik olaraq ibtidai üçbucaq və ya dördbucaqdan istifadə edərək yığılırlar.

Diklər

Xatırlayın ibtidai bir və ya daha çox təpədən ibarətdir. A təpəkompüter qrafikində bu xüsusiyyətlərə malikdir:

  1. 3D məkanda mövqe V=(x, y, z): tipik olaraq üzən nöqtə nömrələrində ifadə edilir.
  2. Rəng: RGB (Qırmızı-Yaşıl-Mavi) və ya RGBA (Qırmızı-Yaşıl-Mavi-Alfa) komponentləri ilə ifadə edilir. Komponent dəyərləri ümumiyyətlə 0,0 və 1,0 (və ya 0 ilə 255 arasında 8 bit imzasız tam) aralığında normallaşdırılır. Alpha şəffaflığı təyin etmək üçün istifadə olunur, tamamilə şəffaf üçün alfa 0, qeyri-şəffaf üçün alfa 1 ilə.
  3. Vertex-Normal N=(nx, ny, nz): Normal vektorun səthə dik olduğu səth norması anlayışına bələdik. Kompüter qrafikasında isə hər bir təpəyə normal bir vektor bağlamalıyıq təpə-normal. Normallar ön və arxa üzü fərqləndirmək və işıqlandırma kimi digər emal üçün istifadə olunur. OpenGL-də sağ tərəf qaydası (və ya saat yönünün əksinə) istifadə olunur. Normal, xarici səthi (və ya ön üzü) göstərərək kənara yönəlir.
  4. Doku T=(s, t): Kompüter qrafikasında tez-tez 2D şəkli bir obyektə bükürük ki, real görünsün. Bir təpənin 2 ölçülü toxuma koordinatları ola bilər (s, t), 2D toxuma görüntüsünə istinad nöqtəsi verir.
  5. Digərləri.
OpenGL Primitivləri və Vertices

Nümunə olaraq, aşağıdakı OpenGL kod seqmenti mənşə mərkəzində bir rəng kubunu göstərir.

Həndəsi bir obyekt yaratmaq və ya model, bir cüt glBegin istifadə edirik (PrimitiveType) və modeli təşkil edən zirvələri əhatə etmək üçün glEnd (). Üçün ibtidaiTip 'S' ilə bitən (məsələn, GL_QUADS), eyni tipli birdən çox forma təyin edə bilərik.

6 üzün hər biri ibtidai dördlüdür (GL_QUAD). Əvvəlcə rəngi glColor3f (qırmızı, yaşıl, mavi). Bu rəng ləğv edilənə qədər bütün sonrakı təpələrə tətbiq ediləcəkdir. Dördüncünün 4 zirvəsi glVertex3f (x, y, z), saat əqrəbinin əks istiqamətində səth normalının ön tərəfini göstərərək xaricə yönəldilməsi üçün. Dörd təpənin hamısı səthi normal olduğu kimi normal da var.

İndeksli Diklər

Primitivlər tez-tez təpələri paylaşırlar. Küncləri dəfələrlə göstərmək əvəzinə, təpələrin bir indeks siyahısını yaratmaq və ibtidaları təyin edərkən indekslərdən istifadə etmək daha səmərəlidir.

Məsələn, aşağıdakı kod fraqmenti 5 təpədən əmələ gələn piramidanı müəyyənləşdirir. Əvvəlcə bir indeks massivində 5 təpəni, sonra müvafiq olaraq rənglərini təyin edirik. 5 üzün hər biri üçün vertex indeksini və rəng indeksini təmin edirik.

Piksel və Fraqment

Piksellər, ekranın qətnaməsinə uyğun olaraq müəyyən bir sətir və sütunların 2 ölçülü bir ızgarasında düzəldilmiş ekrandakı nöqtələrə istinad edir. Piksel 2 ölçülüdür, (iləx, y) mövqeyi və RGB rəng dəyəri (piksel üçün alfa dəyəri yoxdur). Graphics Rendering Boru Kəmərinin məqsədi giriş ibtidaları nəzərə alaraq ekranda göstərilməsi üçün bütün piksellər üçün rəng dəyərini yaratmaqdır.

Ekran üçün ızgara hizalı piksellər istehsal etmək üçün rasterizator adından da göründüyü kimi qrafik göstərmə boru kəmərinin hər bir girişi ibtidai və yerinə yetirir raster tarama primitivin içərisinə daxil edilmiş bir sıra ızgara hizalı fraqmentlər istehsal etmək. Bir fraqment 3 ölçülü, (iləx, y, z) mövqe. (x, y) 2D piksel şəbəkəsi ilə hizalanır. The z-value (grid-hizalı deyil) onun dərinliyini bildirir. Z-dəyərləri, müxtəlif primitivlərin nisbi dərinliyini tutmaq üçün lazımdır ki, tıxanmış cisimlər (və ya işlənmiş şəffaf cisimlərin alfa kanalı) atılsın.

Parçalar vasitəsilə istehsal olunur interpolasiya zirvələrin. Beləliklə, bir fraqment rəng, fraqment normal və toxuma koordinatları kimi bütün zirvələrin xüsusiyyətlərinə malikdir.

Müasir GPU-da, vertex emalı və fraqment emalı proqramlaşdırıla bilər. Proqramlara vertex shader və fragment shader deyilir.

(Direct3D & quotfragment & quot üçün & quotpixel & quot terminini istifadə edir.)

Vertex Qenerasiya

Transformasiyanı əlaqələndirir

Computer Graphics-də ekranda 3D səhnə yaratmaq üçün istifadə olunan proses, kamera ilə fotoşəkil çəkməyə bənzəyir. Dörd dəyişiklikdən ibarətdir:

  1. Dünyadakı obyektləri (və ya modelləri və ya avatarı) düzəldin (Model çevrilməsi və ya Dünya çevrilməsi).
  2. Kameranın yerləşməsi və istiqamətləndirilməsi (Transformasiyaya baxın).
  3. Bir kamera obyektivi seçin (geniş bucaqlı, normal və ya teleskopik), kameranın görünüş sahəsini təyin etmək üçün fokus uzunluğunu və zoom faktorunu tənzimləyin (Proyeksiya çevrilməsi).
  4. Fotoşəkili kağızın seçilmiş yerinə basdırın (Viewport çevrilməsi) - rasterizasiya mərhələsində

Transformasiya bir zirvəyə çevirir V bir boşluqdan (və ya koordinat sistemindən) başqa boşluğa V '. Kompüter qrafikasında transformasiya vektoru a-ya vurmaqla həyata keçirilir çevrilmə matrisiyəni, V '= M V.

Model Transform (və ya Yerli Transformasiya və ya Dünya Transformasiyası)

Bir 3D səhnədəki hər bir obyekt (və ya model və ya avatar) adətən özünün koordinat sistemində çəkilir model məkanı (və ya yerli məkan, və ya obyekt məkanı). Obyektləri yığarkən, şəklini dəyişdirməliyik zirvələr yerli boşluqlarından dünya məkanı, bütün obyektlər üçün ortaqdır. Bu kimi tanınır dünya çevrilir. Dünya çevrilməsi bir sıra miqyaslandırma (cismi dünyanın ölçülərinə uyğunlaşdırmaq üçün ölçmək), fırlanma (oxları düzəltmək) və tərcümədən (mənşəyi hərəkət etdirmək) ibarətdir.

Fırlanma və miqyaslandırma deyilən bir çevrilmə sinfinə aiddir xətti çevrilmə (tərifə görə, xətti çevrilmə vektorun əlavə edilməsini və skaler vurulmasını qoruyur). Xətti çevrilmə və tərcümə sözdə əmələ gəlir afin çevrilməsi. Afin çevrilməsində düz xətt düz xətt olaraq qalır və nöqtələr arasındakı məsafələr nisbətləri qorunur.

OpenGL-də bir zirvə V at (x, y, z) 3x1 sütun vektoru kimi təmsil olunur:

Direct3D kimi digər sistemlər bir zirvəni təmsil etmək üçün bir sıra vektorundan istifadə edirlər.

Ölçmə

3D miqyaslandırma 3x3 matrisində təmsil oluna bilər:

harada & alfax, & alfay& alfaz miqyaslı amilləri təmsil edir x, yz müvafiq olaraq istiqamət. Bütün amillər eynidirsə, buna deyilir vahid miqyaslandırma.

Çevrilmiş nəticəni əldə edə bilərik V ' vertex V matris vurma yolu ilə aşağıdakı kimi:

Fırlanma

3D fırlanma haqqında fəaliyyət göstərir fırlanma oxu (2D fırlanma bir fırlanma mərkəzi ətrafında işləyir). Haqqında 3D Rotations x, yz bir açı və teta üçün oxlar (saat yönünün əksinə olaraq ölçülür) aşağıdakı 3x3 matrislərdə göstərilə bilər:

Haqqında fırlanma bucaqları x, yz baltalar & tetax, & tetay& tetaz, kimi tanınır Euler açıları, bir obyektin istənilən ixtiyari istiqamətini təyin etmək üçün istifadə edilə bilər. Kombinə edilmiş transformasiya deyilir Euler çevrilməsi.

[TODO] Sübut və illüstrasiyaya keçid

Tərcümə

Tərcümə xətti çevrilməyə aid deyil, ancaq vektor əlavə ilə aşağıdakı kimi modelləşdirilə bilər:

Xoşbəxtlikdən, 4x4 matrislərdən istifadə edərək tərcüməni təmsil edə bilərik və əgər zirvələr sözdə 4 komponentdə təmsil olunarsa, matrisin vurulması yolu ilə çevrilmiş nəticəni əldə edə bilərik. homojen koordinatlar (x, y, z, 1), əlavə bir əlavə ilə w1-in komponenti. əhəmiyyətini təsvir edəcəyik w- proyeksiya çevrilməsində daha sonra komponent. Ümumiyyətlə, əgər w-komponent 1-ə bərabər deyil, onda (x, y, z, w) () -in Kartezyen koordinatlarına uyğundurx/w, y/w, z/w). Əgər w= 0, nöqtə (və ya təpə) əvəzinə bir vektoru təmsil edir.

4 komponentli homojen koordinatlardan istifadə edərək, tərcümə aşağıdakı kimi 4x4 matrisdə təmsil oluna bilər:

Transformasiya edilmiş zirvə V ' yenidən matris vurma yolu ilə hesablana bilər:

[TODO] Homojen koordinatlara keçid

Afin Transformasiyalarının xülasəsi

Ölçmə və fırlanmanı homojen koordinatlardan istifadə edərək 4x4 matrislərə yenidən yazırıq.

Ardıcıl çevrilmələr

Bir sıra ardıcıl afin çevrilmələri (T1, T2, T3,. ) bir təpədə işləyir V birləşdirilmiş matris vurma yolu ilə hesablana bilər V '=. T3T2T1V. Matrislər təpəyə tətbiq edilməzdən əvvəl birləşdirilə bilər, çünki matrisin vurulması assosiativdir, yəni. T3 (T2 (T1 V) ) = ( T3T2T1 ) V.

Misal
Vertex-Normalın çevrilməsi

Xatırladaq ki, bir vektor (x, y, z) mövqeyi və rəngi.

Tutaq ki M bir transformasiya matrisidir, vertex-normal-a yalnız transformasiyalarda qeyri-bərabər miqyaslandırma daxil olmadıqda tətbiq edilə bilər. Əks təqdirdə, çevrilmiş normal səthə dik deyil. Qeyri-bərabər miqyaslandırma üçün istifadə edə bilərik (M -1) T çevrilən normalın ortoqonal olmasını təmin edən transformasiya matrisi olaraq.

Transforma baxın

Dünya çevrildikdən sonra bütün obyektlər dünya məkanına yığılır. İndi görünüşü çəkmək üçün kameranı yerləşdirəcəyik.

Kameranın yerləşdirilməsi

3B qrafikdə üçü göstərərək kameranı dünya məkanına yerləşdiririk parametrlərə baxın: GÖZ, AT və YUKARI, dünya məkanında.

  1. GÖZ nöqtəsi (ex, ey, ez) kameranın yerini müəyyənləşdirir.
  2. Vektor AT (ax, ay, az) kameranın, ümumiyyətlə dünyanın mərkəzində və ya bir obyektdə nişan aldığı istiqaməti göstərir.
  3. YUKARI vektor (sənx, səny, sənz) təxminən kameranın yuxarı istiqamətini göstərir. YUXARI ümumiyyətlə dünya məkanının y oxu ilə üst-üstə düşür. YUXARLIQ AT üçün ortogonaldır, lakin lazım deyil. YUKARI və AT bir təyyarəni təyin etdiyinə görə kamera məkanında AT-ya ortogonal bir vektor qura bilərik.

Diqqət yetirin ki, 9 dəyər həqiqətən kameranı yerləşdirmək və istiqamətləndirmək üçün 6 dərəcə azadlıq verir, yəni bunlardan 3-ü müstəqil deyil.

OpenGL

OpenGL-də kameranı yerləşdirmək üçün GLU funksiyasından gluLookAt () istifadə edə bilərik:

Standart gluLookAt () parametrləri:

Yəni kamera mənşəyə (0, 0, 0) yerləşdirilib, ekrana yönəldilib (mənfi z oxu) və yuxarıya baxın (müsbət y oxu). Varsayılan parametrlərdən istifadə etmək üçün obyektləri mənfi z dəyərlərinə yerləşdirməlisiniz.

Kamera koordinatlarını hesablamaq

EYE, AT və UP-dan əvvəl koordinatı əmələ gətiririk (xc, yc, zc) kamera üçün dünya məkanına nisbətən. Biz düzəldirik zc AT-nin əksinə olmaq, yəni AT -zc. İstiqamətini əldə edə bilərik xc AT və UP-nin çarpaz məhsulunu alaraq. Nəhayət, istiqamətini alırıq yc qarşılıqlı məhsulu götürərək xczc. Yuxarıda göstəricinin AT üçün ortogonal olduğunu, lakin mütləq olmadığını unutmayın.

Dünya məkanından kamera məkanına çevrilmə

Kamera sahəsindəki bütün koordinatları ifadə etmək daha rahatdır. Bu vasitəsilə edilir görünüşü dəyişdirmək.

Görünüş çevrilməsi iki əməliyyatdan ibarətdir: bir tərcümə (GÖZ-ün mənşəyinə keçməsi üçün), sonra bir dönmə ilə (oxları oxlamaq üçün):

Baxış Matrisi

İki əməliyyatı bir vahiddə birləşdirə bilərik Matrisə baxın:

Model baxış transformasiyası

Kompüter qrafikasında obyektləri sabit kameraya nisbətən hərəkət etdirmək (Model çevrilməsi) və kameranı sabit bir obyektə nisbətən hərəkət etdirmək (Transformasiyaya baxın) eyni görüntüyü istehsal edir və buna görə ekvivalentdir. OpenGL, buna görə Model çevrilməsini və Görünüş çevrilməsini sözdə eyni şəkildə idarə edir Model baxış matrisi. Proyeksiya çevrilməsi (növbəti hissədə) a vasitəsilə idarə olunur Proyeksiya matrisi.

Proyeksiya Transformasiyası - Perspektivli Proyeksiya

Kamera yerləşdirildikdən və istiqamətləndirildikdən sonra nəyi görə biləcəyinə (fokus uzunluğunu və böyüdücü faktoru tənzimləyərək kameranın görünüş sahəsini seçməyə bənzər) və obyektlərin ekrana necə proqnozlaşdırılmasına qərar verməyimiz lazımdır. Bu, bir proyeksiya rejimi seçərək (perspektiv və ya orfoqrafik) və bir görüntüləmə həcmini və ya kəsmə səsi. Kəsmə həcminin xaricindəki obyektlər səhnədən kənarlaşdırılır və görünə bilməz.

Perspektiv Görünüşündə Frustuma baxın

Kameranın məhdud bir baxış sahəsi var frustum bax (kəsilmiş piramida) və dörd parametrlə təyin olunur: fovy, aspect, zNear və zFar.

  1. Fovy: ümumi şaquli baxış bucağını dərəcə ilə göstərin.
  2. Aspekt: ​​enin hündürlüyə nisbəti. Xüsusi üçün z, fovydən hündürlüyü əldə edə bilərik, sonra da genişliyi aspektdən ala bilərik.
  3. z Yaxın təyyarənin yanında.
  4. zFar: uzaq təyyarə.

Görünüş frustum ilə proyeksiya bilinir perspektiv proyeksiya, ÇNL-yə yaxın olan obyektlərin (Proyeksiya Mərkəzi) eyni ölçülü ÇNL-dən sonrakı obyektlərdən daha böyük olduğu.

Görünüşdən kənar bir obyekt kameraya görünmür. Son imicə kömək etmir və performansı yaxşılaşdırmaq üçün atılmalıdır. Bu kimi tanınır görünüş-frustum kəsmə. Bir obyekt qismən görünüşü ilə üst-üstə düşsə, olacaqdır qırxıldı sonrakı mərhələdə.

OpenGL

OpenGL-də perspektiv proyeksiyanı seçmək və kəsmə həcmini təyin etmək üçün iki funksiya mövcuddur:

Kəsmə həcmi kuboid

Bundan sonra sözdə bir tətbiq edəcəyik proyeksiya matrisi görünüşü-frustumu şəkildəki kimi, yaxınlıqdakı təyyarədə mərkəzləşdirilmiş 2x2x1 ox ilə düzəldilmiş kub şəklində qırxma həcminə çevirmək. Yaxın müstəvidə z = 0, uzaq müstəvidə z = -1 var. Təyyarələrin ölçüsü 2x2, aralığı -1 ilə +1 arasındadır.

Perspektivli Proyeksiya Matrisi

Proyeksiya matrisi:

Matrisin son sırasının artıq olmadığını unutmayın [0 0 0 1]. (X, y, z, 1) giriş zirvəsi ilə nəticələnir w-komponent 1 olmazdı. 3 məkanda mövqe əldə etmək üçün əmələ gələn homogen koordinatları (x, y, z, w) ilə (x / w, y / w, z / w, 1) normallaşdırmalıyıq. (Tərcümə üçün həmcins koordinatların, həm də perspektivli proyeksiyanın istifadəsi təəccüblüdür.)

Son addım z oxunu çevirməkdir, beləliklə yaxınlıqdakı təyyarə hələ z = 0-da yerləşəcək, lakin uzaq təyyarə çevrilib z = 1-də yerləşəcək (z = -1 əvəzinə). Başqa sözlə, daha böyük z, o qədər də obyekt. Çevrilmək üçün proyeksiya matrisinin üçüncü sırasını inkar edə bilərik.

Flipdən sonra koordinat sistemi artıq Sağ Sistem (RHS) deyil, Sol Sistemə (LHS) çevrilir.

OpenGL-in Model-View Matrix və Projection Matrix

OpenGL dəyişiklikləri iki matris vasitəsilə idarə edir: a model görünüşü matrisi (Model və görünüş dəyişikliklərinə baxılması üçün GL_MODELVIEW) və a proyeksiya matrisi (Proyeksiya çevrilməsini idarə etmək üçün GL_PROJECTION). Bu iki matris müstəqil olaraq idarə oluna bilər.

Əvvəlcə manipulyasiya üçün matris seçməliyik:

Hal-hazırda seçilmiş matrisi aşağıdakı şəkildə yenidən qura bilərik:

Hal-hazırda seçilmiş matrisin dəyərini yığına saxlaya və geri qaytara bilərik:

Push və pop yığını istifadə edir və sonuncusu ilk olaraq həyata keçirilir və iç içə ola bilər.

Proyeksiya çevrilməsi - orfoqrafiya proyeksiyası

Yaygın olaraq istifadə edilənlərin yanında perspektiv proyeksiya, başqa bir sözdə var orfoqrafik proyeksiya (və ya paralel proyeksiya), bu kameranın dünyadan çox uzaqda yerləşdiyi xüsusi bir vəziyyətdir (teleskopik linzanın istifadəsinə bənzər). Orfoqrafiya proyeksiyası üçün görüntü həcmi a paralelepiped (perspektiv proyeksiyasında bir narahatlıq əvəzinə).

OpenGL

OpenGL-də, orfoqrafiya proyeksiya rejimini seçmək və kəsmə həcmini təyin etmək üçün glOrtho () funksiyasından istifadə edə bilərik:

2D qrafika üçün 2D orfoqrafiya proyeksiyasını seçmək və kəsmə sahəsini təyin etmək üçün gluOrtho2D () (GL əvəzinə GLU funksiyası) istifadə edə bilərik:

OpenGL-dəki standart 3D proyeksiya parametrləri (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0) olan orfoqrafikdir (perspektiv əvəzinə), yəni mənşəyi mərkəzində tərəfləri 2.0 olan bir kubdur.

Vertex Qenerasiya Mərhələsinin Çıxışları

Hər bir təpə, normal zirvəsi ilə birlikdə kəsmə həcmli kuboid boşluğuna çevrilir və yerləşdirilir. X və y koordinatları (-1-dən +1 aralığında) ekrandakı yerini və z dəyəri (0-dan 1-ə qədər olan) dərinliyini, yəni yaxın müstəvidən nə qədər uzaq olduğunu təmsil edir.

Vertex işləmə mərhələsi fərdi zirvələri çevirir. Bu mərhələdə təpələr arasındakı əlaqələr (yəni ibtidai) nəzərə alınmır.

Rasterizasiya

Əvvəlki təpə işləmə mərhələsində, ümumiyyətlə bir float dəyərində təmsil olunan təpələr, mütləq ekranın piksel şəbəkəsi ilə uyğunlaşdırılmır. Təpələrin əlaqəsi, ibtidai sözlər baxımından da nəzərə alınmır.

Bu rasterizasiya mərhələsində bir və ya daha çox təpə ilə təyin olunan hər ibtidai (üçbucaq, dördbucaq, nöqtə və xətt kimi) raster tarama primitivin içərisinə daxil edilmiş bir sıra parçalar əldə etmək. Parçalar, pixel-grid ilə hizalanmış 3B piksel kimi qəbul edilə bilər. 2D piksellərin mövqeyi və RGB rəng dəyəri var. Olan 3D fraqmentləri interpolasiya edilmişdir zirvələrdən mövqe, rəng, normal, toxuma kimi zirvələrlə eyni xüsusiyyətlərə sahib olun.

Rasterizasiyanın alt mərhələləri arasında görünüşün dəyişdirilməsi, kəsmə, perspektiv bölünmə, arxa üzün kəsilməsi və tarama konversiyası yer alır. Rasterizer proqramlaşdırıla bilməz, lakin direktivlər vasitəsilə konfiqurasiya edilə bilər.

Viewport Transform

Viewport

Viewport bir düzbucaqlı ekran sahəsi ekranın koordinatlarında ölçülən tətbiq pəncərəsində (piksellə, yuxarı sol küncdə mənşəli). Görünüş pəncərəsi, kamera tərəfindən çəkilən proqnozlaşdırılan səhnəni tətbiq pəncərəsinə uyğunlaşdırmaq üçün ekran sahəsinin ölçüsünü və formasını təyin edir. Bütün ekranı tuta bilər və ya olmaya bilər.

3B qrafikdə, bir görünüş pəncərəsi üst-üstə düşən pəncərələrin sifarişi kimi vəziyyətlər üçün lazım olan z-sifarişin dəstəklənməsi üçün 3 ölçülüdür.

OpenGL

OpenGL-də, standart olaraq, görünüş pəncərəsi bütün tətbiq pəncərəsini əhatə edəcək şəkildə quraşdırılmışdır. Daha kiçik bir sahə seçmək üçün glViewport () funksiyasından istifadə edə bilərik (məsələn, bölünmüş ekran və ya çox ekranlı tətbiq üçün).

Görünüş pəncərəsinin z aralığını glDepthRange () vasitəsilə də qura bilərik:

Viewport Transform

Son dönüşüm, görünüş dəyişdirmə, göstərildiyi kimi, qırılma həcmini (2x2x1 kub şəklində) 3B görünüşünə uyğunlaşdırır.

Viewport çevrilməsi bir sıra yansıtma (y oxu), miqyaslandırma (x, y və z oxları) və tərcümədən (kəsmə həcminin yaxın müstəvisinin mərkəzindən yuxarı sol küncə qədər mənşəli) ibarətdir 3D görünüşün). Görünüşün dəyişdirilməsi matrisi aşağıdakılardır:

Görünüş pəncərəsi bütün ekranı əhatə edirsə, minX = minY = minZ = 0, w = screenWidth və h = screenHeight.

Viewport və Proyeksiya Təyyarəsinin Ənənə nisbəti

Görünüş pəncərəsinin (glViewport () vasitəsi ilə quraşdırılmış) və proyeksiya müstəvisinin (gluPerspective (), glOrtho ()) düzəltməsinin en-nisbət nisbəti eyni olmasa, şəkillərin pozulduğu açıqdır. Beləliklə, görünüş nöqtəsi və proyeksiya müstəvisi üçün eyni en nisbətini istifadə etmək vacibdir.

GlViewport () əmri, pəncərə yenidən böyüdükdən sonra görünüşü yenidən ölçmək üçün yenidən şəkilləndirilmiş () işləyiciyə daxil edilməlidir. Proyeksiya təyyarəsinin en-nisbət nisbətlərinin formaları təhrif etməmək üçün görünüş pikselinin nisbət nisbətinə uyğun şəkildə yenidən konfiqurasiya edilməsi vacibdir. Başqa sözlə, glViewport () və gluPerpective () / glOrtho () birlikdə buraxılmalıdır.

Arxa üzün kəsilməsi

Görünüş frustum cinging görünüşü frustum xaricindəki obyektləri atarkən, arxa üz cinging kameraya baxmayan primitivləri atın.

Arxa üz normal vektora və səthi və kameranı birləşdirən vektora əsasən elan edilə bilər.

Əgər obyekt şəffafdırsa və alfa qarışığı aktivdirsə, arxa tərəfdən kəsilmə mümkün deyil.

OpenGL

OpenGL-də üz culling standart olaraq ləğv edilir və həm ön, həm də arxa üzlər göstərilir. Arxa üzün (GL_BACK) və ya ön üzün (GL_FRONT) və ya hər ikisinin (GL_FRONT_AND_BACK) alınacağını təyin etmək üçün glCullFace () funksiyasından istifadə edə bilərik.

Parçaların işlənməsi

Rasterizasiyadan sonra hər bir ibtidai üçün bir sıra parçalar var. Bir fraqmentin piksel şəbəkəsinə uyğunlaşdırılan bir mövqeyi var. Təpələrdən interpolyasiya edilmiş dərinlik, rəng, normal və toxuma koordinatlarına malikdir.

Parçaların işlənməsi toxumaişıqlandırma, son görüntünün keyfiyyətinə ən böyük təsir göstərən. Doku və işıqlandırmanı sonrakı hissələrdə ətraflı şəkildə müzakirə edəcəyik.

Parça prosessorunda iştirak edən əməliyyatlar bunlardır:

  1. Parçaların işlənməsindəki ilk əməliyyat teksturadır.
  2. Sonra əsas və ikinci dərəcəli rənglər birləşdirilir və duman hesablanması tətbiq oluna bilər.
  3. İsteğe bağlı qayçı testi, alfa testi, şablon testi və dərinlik tampon testi, imkan verildiyi təqdirdə həyata keçirilir.
  4. Sonra isteğe bağlı qarışdırma, ditinq, məntiqi əməliyyat və bitmasking edilə bilər.

Çıxış Birləşdirmə

Z-Tampon və Gizli Səthdən Təmizləmə

z-bufer (və ya dərinlik tamponu) gizli səthləri çıxarmaq üçün istifadə edilə bilər (digər səthlər tərəfindən bloklanmış və kameradan görünməyən səthlər). Ekranın z-tamponu 1 (ən uzaq) və fon rəngi üçün rəng tamponu başlanğıc edilir. Hər bir işlənmiş fraqment üçün (hər bir ibtidainin) z-dəyəri bufer dəyəri ilə yoxlanılır. Onun z dəyəri z-buferdən kiçikdirsə, rəng və z dəyəri buferə köçürülür. Əks təqdirdə, bu fraqment başqa bir obyekt tərəfindən bağlanır və atılır. Fraqmentlər istənilən qaydada, bu alqoritmdə işlənə bilər.

OpenGL

OpenGL-də dərinlik sınağı yolu ilə gizli səth çıxarılması üçün z-tampondan istifadə etmək üçün aşağıdakılara ehtiyacımız var:

  1. GlutInitDisplayMode () vasitəsilə z-tampon üçün müraciət:
  2. Z-tamponda dərinlik sınağını aktivləşdirin:
  3. Z-tamponunu (ən ucunu göstərən 1-ə) və rəng tamponunu (arxa fon rənginə) silin:

Alfa qarışığı

Gizli səthin çıxarılması yalnız ön obyekt tamamilə olduqda işləyir qeyri-şəffaf. Kompüter qrafikasında bir parça mütləq qeyri-şəffaf deyil və şəffaflıq dərəcəsini göstərən bir alfa dəyəri ehtiva edə bilər. Alfa, adətən 0 şəffaf və 1 işarəsi tamamilə qeyri-şəffaf olmaqla, [0, 1] aralığında normallaşdırılır. Parça tamamilə qeyri-şəffaf deyilsə, onun arxa cisminin bir hissəsi kimi tanınan bir hissəsi görünə bilər alfa qarışdırma. Alfa qarışığı və gizli səthdən təmizlənmə bir-birini istisna edir.

Ən sadə qarışıq tənliyi belədir:

harada cs mənbə rəngi və alfadırs mənbə alfa, cd təyinat (fon) rəngidir. 3 rəngli kanal RGB müstəqil olaraq tətbiq olunur.

Bu qarışdırma tənliyi üçün fraqmentin yerləşdirilmə qaydası vacibdir. Parçalar əvvəldən ən böyük z dəyəri işlənərək öndən sıralanmalıdır. Ayrıca, təyinat alfa dəyəri istifadə edilmir.

Fərqli effektlər əldə etmək üçün bir çox başqa qarışıq tənlikləri var.

OpenGL

OpenGL-də, alfa qarışığını həyata keçirmək üçün qarışığı təmin etməli və dərinliyi sınamağı (gizli səthdən təmizlənməni həyata keçirən) aradan qaldırmalıyıq. Misal üçün,

Mənbə və Hedef Qarışıq Faktorları

OpenGL-də glBlendFunc () funksiyası sözdə olanı təyin etmək üçün istifadə edilə bilər mənbətəyinat qarışdırma amilləri:

Tutaq ki, yeni bir obyekt (adlanır) mənbə) rəng tamponundakı mövcud obyektlərlə qarışdırılmalıdır (adlanır təyinat). Mənbənin rəngi (Rs, Gs, Bs, As) və təyinat rəngi (Rd, Gd, Bd, Ad). Mənbə və təyinat rəng dəyərləri, qaynaq qarışdırma faktoru və təyinat qarışdırma faktoruna uyğun olaraq ölçülür və nəticə əldə etmək üçün birləşdiriləcəkdir. RGB komponentlərinin hər biri müstəqil olaraq hesablanacaqdır.

Məsələn, G komponenti üçün qaynaq qarışdırma amilinin olduğunu düşünək səh və G komponenti üçün təyinat qarışdırma faktoru q, nəticədə G komponenti səh×Gs + q×Gd.

Qarışıq amillərinin bir çox seçimi var. Məsələn, populyar bir seçim:

mənbənin hər bir komponenti mənbənin alfa dəyəri ilə ölçülür (As) və təyinatın hər komponenti 1- ilə ölçülürAs. Bu vəziyyətdə, orijinal rəng komponentinin dəyəri [0.0, 1.0] arasındadırsa, nəticənin dəyərinin bu aralıqda olmasına zəmanət verilir. Çatışmazlıq ondan ibarətdir ki, bir çox səth bir-birinin ardınca əlavə olunarsa, son rəngin göstərilmə qaydasından asılıdır (çünki təyinat alfa dəyəri nəzərə alınmır).

Qarışıq amillərinin başqa bir nümunəsi:

mənbənin hər bir komponenti mənbənin alfa dəyəri ilə ölçülür (As) və təyinat yerinin hər bir komponenti 1-ə bərabərdir. Dəyər aşıb / aça bilər. Ancaq son rəng bir çox obyekt əlavə edildiyi zaman göstərilmə qaydasından asılı deyil.

blending amillər Digər dəyərlər GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA və GL_ONE_MINUS_CONSTANT_ALPHA daxildir.

Mənbə qarışdırma faktoru üçün standart GL_ONE və təyinat qarışdırma faktoru üçün GL_ZERO. Yəni qeyri-şəffaf (tamamilə qeyri-şəffaf) səthlər.

Hesablamalar ayrıca, alfa qarışdırma işə salındıqda dərinlik testinin niyə ləğv ediləcəyini izah edir. Çünki son rəng şəffaf olmayan səthlər üçün nisbi dərinlik (daha yaxın səthin rəngi) əvəzinə şəffaf səthlər üçün mənbə və təyinat rəngləri arasında qarışdırılaraq müəyyənləşdiriləcəkdir.

İşıqlandırma

İşıqlandırma 3B səhnədəki işıq mənbələri ilə cisimlər arasındakı qarşılıqlı əlaqələrin idarə edilməsinə aiddir. İşıqlandırma, real bir səhnə yaratmaq üçün ən vacib amillərdən biridir.

Həqiqi dünyada gördüyümüz rəng, işıq mənbələri ilə rəng materialı səthləri arasındakı qarşılıqlı əlaqənin nəticəsidir. Başqa sözlə, üç tərəf iştirak edir: izləyici, işıq mənbələri və material. İşıq mənbəyindən alınan işıq (müəyyən spektrin) bir səthə dəyəndə bəziləri udulur, bəziləri əks olunur və ya dağılır. Yansıma bucağı düşmə bucağına və normal səthə bağlıdır. Səpələnmə miqdarı hamarlığa və səthin materialına bağlıdır. Yansıyan işıq, düşən işığın rəng spektrinə və materialın udma xüsusiyyətinə bağlı olan müəyyən bir rəng spektrini də əhatə edir. Yansıyan işığın gücü, işıq mənbəyinin və izləyicinin, həm də materialın mövqeyindən və məsafəsindən asılıdır. Yansıyan işıq digər səthlərə dəyə bilər və bəziləri udulur, bəziləri yenidən əks olunur. Bir səth haqqında algıladığımız rəng, gözümüzə dəyən əks olunan işıqdır. 2 ölçülü bir fotoşəkildə və ya rəsmdə, rənglərdəki bəzi kiçik dəyişikliklərə görə cisimlərin üç ölçülü olduğu görünür. kölgələr.

İki növ işıqlandırma modeli bunlardır:

  1. Yerli işıqlandırma: yalnız birbaşa işıqları nəzərdən keçirin. Səthin rəngi səthin yansıtma xüsusiyyətlərindən və birbaşa işıqlandırmalardan asılıdır.
  2. Qlobal işıqlandırma: real dünyada digər obyektlərdən və ətraf mühitdən əks olunan dolayı işıqlandırma alan obyektlər. Qlobal işıqlandırma modeli, səhnədəki digər cisimlərdən əks olunan dolayı işıqları nəzərdən keçirir. Qlobal işıqlandırma modeli mürəkkəbdir və hesablama yoğundur.

İşıq-Material Qarışıqlığı üçün Phong İşıqlandırma Modeli

Fonq işıqlandırma modeli ucuz hesablanan və xüsusilə əvvəlki günlərdə geniş istifadə olunan yerli bir işıqlandırma modelidir. Dörd tip işıqlandırma növünü nəzərdən keçirir: diffuz, spekulyar, ətraf mühit və emissiya.

Bir fraqmenti düşünək P bir səthdə dörd vektor istifadə olunur: işıq mənbəyi L, izləyici V, fraqment normal Nvə mükəmməl reflektor R. Mükəmməl reflektor R normal səthdən hesablana bilər N və insident işığı L, düşmə bucağının yansıma bucağına bərabər olduğunu bildirən Newton qanununa görə.

Diffuz işıq

Diffuz işıq modelləri uzaq yönlü işıq mənbəyi (günəş işığı kimi). Yansıyan işıq hər tərəfə bərabər şəkildə səpələnir və mövqelərindən asılı olmayaraq, yəni tamaşaçı vektorundan asılı olmayaraq bütün izləyicilər üçün eyni görünür. V. Baş verən işığın gücü işıq mənbəyi arasındakı bucaqdan asılıdır L və normaldır Nyəni, arasındakı nöqtə məhsulu LN.

Yaranan rəng aşağıdakı kimi hesablana bilər:

Baş verən işığın gücü maks(L& sdotN, 0). Biz istifadə edirik maks mənfi ədədi atmaq funksiyası, yəni bucaq 90 dərəcədən çoxdur. Tutaq ki, işıq mənbəyi rəngə malikdir sfərqvə fraqmentin diffuziya yansıtması var mfərq, nəticədə rəng c budur:

rəngin RGB komponentinin müstəqil olaraq hesablandığı yerdir.

Spekulyar işıq

Yansıyan işıq mükəmməl bir reflektor istiqamətində cəmlənmişdir R. İzləyicinin gördüyü şey aradakı açıdan (kosinusdan) asılıdır VR.

Spekulyar əks olunma nəticəsində yaranan rəng aşağıdakılardır:

the ş parlaqlıq faktoru kimi tanınır. Kimi ş artır, işıq konusu daralır (çünki R& sdotV və le 1), vurgulanan nöqtə daha kiçik olur.

Ətraf mühitin işığı

Mənzərənin hər nöqtəsinə daimi bir işıq miqdarı tətbiq olunur. Nəticədə rəng:

Emissiv işıq

Bəzi səthlər işıq verə bilər. Yaranan rəng cem = mem

Nəticə Rəngi

Yaranan rəng, dörd komponentin hamısındakı qatqının cəmidir:

OpenGL İşıqlandırma və Material

OpenGL nöqtə mənbələrini (çox yönlü), işıqforları (konus şəklində yönlü) və ətraf işığını (sabit bir faktor) təmin edir. İşıq mənbəyi sabit bir vəziyyətdə və ya sonsuz bir məsafədə yerləşə bilər. Hər mənbədə ayrıca mühit, dağınıq və spekulyar komponentlər vardır. Hər mənbədə RGB komponentləri var. İşıq hesablaması komponentlərin hər birində müstəqil olaraq həyata keçirilir (dolayı işıqlandırma nəzərə alınmadan yerli işıqlandırma). Materiallar eyni şəkildə modelləşdirilmişdir. Hər bir material növü, işıq mənbələrinin hər bir uyğun komponenti üçün əks olunan hissəni göstərən parametrləri ilə ayrı bir mühit, dağınıq və spekulyar komponentlərə malikdir. Materialın emissiyaedici bir hissəsi də ola bilər.

OpenGL-də GL_LIGHT0 ilə GL_LIGHT arasında müəyyən edilmiş işıq vəziyyətini və hər bir işıq mənbəyini aktivləşdirməlisiniz.n .

İşıq təmin edildikdən sonra, glColor () tərəfindən təyin olunan rəng artıq istifadə olunmur. Bunun əvəzinə, rəng işıq materialı qarşılıqlı təsirindən və izləyicinin mövqeyindən asılıdır.

Bir işıq mənbəyi (GL_LIGHT0 - GL_LIGHT) təyin etmək üçün glLight () istifadə edə bilərsinizn ):

GL_POSITION üçün standart kamera koordinatlarına nisbətən (0, 0, 1) olduğu üçün standart kamera mövqeyinin (0, 0, 0) arxasındadır.

GL_LIGHT0, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR komponentləri üçün varsayılan ağ (1, 1, 1) dəyəri ilə xüsusidir. Varsayılan parametrlərdən istifadə edərək GL_LIGHT0-ı dərhal aktivləşdirə bilərsiniz. Digər işıq identifikatorları üçün (GL_LIGHT1 - GL_LIGHTn ), standart GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR üçün qara (0, 0, 0).

Material

İşıq mənbəyinə bənzər bir materialın əks etdirmə parametrləri var spekulyar (GL_SPECULAR), diffuz (GL_DIFFUSE) və mühit (GL_AMBIENT) əks olunan işığın hissəsini göstərən komponentlər (RGBA rəng komponentlərinin hər biri üçün). Bir səth də ola bilər buraxmaq işıq (GL_EMISSION). Bir səthdə parlaqlıq parametri (GL_SHININESS) var - dəyər nə qədər yüksək olarsa, mükəmməl reflektorun ətrafındakı kiçik ərazidə əks olunan işığın daha çox konsentrasiyası və səth daha parlaq görünür. Bundan əlavə, bir səthin iki üzü var: ön və arxa, eyni və ya fərqli parametrlərə sahib ola bilər.

Bu parametrləri ön (GL_FRONT), arxa (GL_BACK) və ya hər ikisi (GL_FRONT_AND_BACK) üçün təyin etmək üçün glMaterial () funksiyasından istifadə edə bilərsiniz. Ön üz normal səthlə təyin olunur (sağ tərəf qaydası və ya glNormal () funksiyası ilə təpələr tərəfindən dolayısı ilə müəyyən edilir).

Varsayılan material, az miqdarda ətraf yansıması (0,2, 0,2, 0,2, 1,0), yüksək səpələnmiş yansıma (0,8, 0,8, 0,8, 1,0) və qüsursuz bir əks (0,0,) olan boz bir səthə (ağ işıq altında) malikdir. 0.0, 0.0, 1.0).

Vertex və Fragment Shaders

Qlobal İşıqlandırma Modeli

Doku

Kompüter qrafikasında tez-tez qrafik obyektlərin üzərində həqiqi hala gətirmək üçün doku adlanan şəkilləri üst-üstə qoyuruq (və ya yapışdırırıq və ya sarırıq).

Bir toxuma ümumiyyətlə 2B görüntüdür. Dokunun hər bir elementinə pikselə (şəkil elementi) bənzər bir teksel (toxuma elementi) deyilir. 2B toxuma koordinatı (s, t) adətən yuxarı sol küncdə, [0.0, 1.0] normallaşdırılır, s- sağa və t- aşağıya doğru yönəlmiş ekss. (OpenGL-də bunun doğru olub olmadığını təsdiqləməlisiniz)

Doku Qablaşdırma

2B toxuma koordinatları [0.0, 1.0] səviyyəsinə salınsa da, koordinatlar aralıq xaricində olduqda davranışı konfiqurasiya edə bilərik.

Tipik həllər bunlardır:

  1. Doku koordinatlarını [0.0, 1.0] səviyyəsinə sıxın və bu aralığın xaricində olanları görməməzlikdən gəlin.
  2. S-və ya t oxu və ya hər ikisi boyunca toxumayı sarın (və ya təkrarlayın). Dokuların davamlı olması üçün & quotmirror & quot rejimini təyin edə bilərsiniz.

OpenGL-də s və t oxları (GL_TEXTURE_WRAP_S və GL_TEXTURE_WRAP_T) üçün sarma davranışını ayrı-ayrılıqda konfiqurasiya etmək üçün glTexParameter () funksiyasından istifadə edirik. İki rejim dəstəklənir: GL_REPEAT (toxuma modelini təkrarlayın) və GL_CLAMP (təkrar etməyin, ancaq 0.0 ilə 1.0 arasında sıxın).

Doku Süzgəci

Ümumiyyətlə, toxuma şəklinin qətnaməsi göstərilən fraqmentdən (və ya pikseldən) fərqlidir. Doku şəklinin həlli daha kiçikdirsə, sözdə bir şey yerinə yetirməliyik böyütmə ekrana uyğun toxuma şəklini böyütmək. Digər tərəfdən, toxuma görüntüsünün həlli daha böyükdürsə, yerinə yetiririk minikasiya.

Böyütmə

Ən çox istifadə olunan metodlar bunlardır:

  1. Ən yaxın nöqtə süzgəci: parçanın toxuma rəngi dəyəri ən yaxın tekseldən götürülmüşdür. Bu filtr bir çox fraqmentlər eyni tekseldən istifadə etdiyi üçün & quotblockiness & quot-ə gətirib çıxarır.
  2. Bilinear İnterpolasiya: parçanın toxuma rəngi dəyəri ən yaxın dörd tekelin bilinən interpolasiyası yolu ilə əmələ gəlir. Bu daha hamar bir nəticə verir.
Kiçikləşdirmə

Doku şəklinin qətnaməsi fraqmentdən daha böyükdürsə, kiçiltmə lazımdır.Yenə də & quotnearest point-sample & quot və & quotbilinear interpolation & quot metodlarından istifadə edə bilərsiniz.

Bununla birlikdə, bu nümunə üsulları tez-tez sözdə & quotyalançı əsər& quot; siqnalla müqayisədə aşağı seçmə tezliyi. Məsələn, perspektiv proyeksiyasındakı uzaq bir obyekt, yüksək siqnal tezliyinə görə qəribə görünəcəkdir.

[TODO] artefaktın aliasing haqqında diagarm

Xəritəçəkmə

Minifikasiyanı həyata keçirmək üçün daha yaxşı bir yanaşma deyilir minmaping (miniatür xəritələr), burada toxuma görüntüsünün aşağı qətnamələri yaradılır. Məsələn, orijinal görüntünün 64x64 olduğunu düşünək (Səviyyə 0), 32x32, 16x16, 8x8, 4x4, 2x2, 1x1-də daha aşağı qətnamə şəkillər yarada bilərik. Ən yüksək qətnamə səviyyə 0 olaraq adlandırılır, sonrakı səviyyə 1 və s. Bundan sonra ən yaxın uyğunlaşdırılmış qətnamə toxuması şəklini istifadə edə bilərik və ya ən yaxın iki uyğunluğu olan qətnamə toxuması şəkili arasında xətti interpolasiya edə bilərik.

OpenGL Doku Süzgəci

OpenGL-də böyütmə və kiçiltmə üçün filtri müstəqil olaraq qura bilərsiniz.

Tək bir şəkildən istifadə edə və OpenGL-dən gluBuild2DMipmaps () (glTexImage2d ()) yerinə əmr vasitəsilə daha aşağı qətnamə şəkillərini istehsal etməsini xahiş edə bilərik.

Bundan sonra mipmapping filtrinin istifadə ediləcəyini təyin edə bilərik:

Bundan əlavə, perspektiv proyeksiyasında sürətli toxuma interpolasiya sxemi perspektiv proyeksiyanın yaratdığı təhrifi idarə edə bilməz. Aşağıdakı əmr işləyicidən işləmə sürəti hesabına daha yaxşı bir toxuma şəkli istehsal etməsini xahiş etmək üçün istifadə edilə bilər.


OpenGL: ayıklama və ldquoTək keçidli Wireframe Rendering & rdquo

Çox sadə görünən "Tək keçidli tel kafes göstərmə" sənədini tətbiq etməyə çalışıram, amma mənə qalın və qaranlıq dəyərlərə qədər gözlədiyimi verir.

Kağız hündürlükləri anlamaq üçün dəqiq kodu vermədi, buna görə istədiyim kimi etdim. Kod üç zirvəni görünüş sahəsinə çıxarmalı, "hündürlüklərini" əldə etməli və parçalayıcıya göndərməlidir.

Parça kölgələdicisi ən yaxın kənarın məsafəsini təyin edir və bir kənar intensivliyi yaradır. Bu dəyərlə nə edəcəyimə əmin deyiləm, ancaq [0,1] arasında miqyaslandığı üçün tərsini çıxan rəngimə qarşı artırıram, ancaq çox zəifdir.

Kağızlarda həll olunduğundan əmin olmadığım bir neçə sualım var idi. Birincisi, yüksəkliklər 3D əvəzinə 2B-də hesablanmalıdır? İkincisi, DirectX-in fərqli bir viewport-space z aralığına sahib olduğu DirectX xüsusiyyətlərini düzəldirlər? Bunun əhəmiyyəti varmı? Çıxan hündürlük məsafələrini perspektiv proyeksiyasını düzəltməyi tövsiyə etdikləri üçün görünüş-boşluq koordinatlarının w-dəyəri ilə qabaqcadan artırıram.

Düzəldilməyən görüntünün daha uzaq tərəflərə baxış perspektivini düzəltməməsi ilə bağlı aydın problemləri var, amma perspektivi düzəldən şəklin dəyərləri çox zəifdir.

Kimsə mənim kodumun səhv olduğunu və ya buradan səhvləri necə düzəldə biləcəyini görə bilərmi?


3D məkanda ulduzların göstərilməsi - AbsMag-dən OpenGL miqyaslı dəyərlərə - Astronomiya

Erişilebilirlik Links

Bu paneli bağlamaq üçün buraya vurun.

Bu örtüyü bağlamaq üçün buraya vurun və ya klaviaturanızdakı "Escape" düyməsini basın.

1899-cu ildə qurulan və Vaşinqtonda yerləşən Amerika Astronomiya Cəmiyyəti (AAS) Şimali Amerikadakı peşəkar astronomların əsas təşkilatıdır. Təxminən 7000 fərdi üzvlüyünə fiziklər, riyaziyyatçılar, geoloqlar, mühəndislər və tədqiqatları və təhsil maraqları müasir astronomiyanı əhatə edən geniş spektrdə olan digərləri də daxildir. AAS-ın missiyası, bəşəriyyətin kainat haqqında elmi anlayışını artırmaq və bölüşməkdir.

Bu örtüyü bağlamaq üçün buraya vurun və ya klaviaturanızdakı "Escape" düyməsini basın.

Fizika İnstitutu (IOP) fizikanı təbliğ edən və fizikləri hamının xeyrinə bir araya gətirən aparıcı bir elmi cəmiyyətdir. Bütün sektorların fiziklərindən və fizikaya marağı olanlardan ibarət olan dünya miqyasında təxminən 50 000 üzvlüyə malikdir. Fizika tədqiqatı, tətbiqi və təhsili inkişaf etdirmək üçün işləyir və fizika ilə bağlı məlumatlılıq və anlayışı inkişaf etdirmək üçün siyasətçilərlə və ictimaiyyətlə əlaqələndirir. Nəşriyyat şirkəti olan IOP Publishing, peşəkar elmi rabitə sahəsində dünya lideridir.


Kosmosda Rəsm: OpenGL-də Həndəsi İlkələr və Tamponlar

2-ci Fəsildən OpenGL-in bu primitivləri birbaşa ekranda göstərmədiyini (çəkmədiyini) öyrəndiniz. Bunun əvəzinə, göstərmə daha sonra ekrana dəyişdirilən bir tamponda aparılır. Bu iki tampona ön (ekran) və arxa rəng tamponlarına müraciət edirik. Varsayılan olaraq, OpenGL əmrləri arxa buferə çevrilir və zəng etdiyiniz zaman glutSwapBuffers (və ya əməliyyat sisteminiz və # 150 spesifik tampon dəyişdirmə funksiyası), ön və arxa tamponlar dəyişdirilərək göstərmə nəticələrini görə bilərsiniz. Bununla yanaşı, istəsəniz birbaşa ön tamponda göstərə bilərsiniz. Bu qabiliyyət bir sıra rəsm əmrlərini göstərmək üçün faydalı ola bilər ki, həqiqətən bir obyekt və ya forma çəkildiyini görə biləsiniz. Bunu etmək üçün iki yol var, sonrakı hissədə müzakirə olunur.

Tampon Hədəflərindən istifadə

Doğrudan ön tampona daxil olmağın ilk yolu, OpenGL-ə orada rəsm çəkilməsini istədiyinizi söyləməkdir. Bunu aşağıdakı funksiyanı axtararaq edirsiniz:

Müəyyən olunur GL_FRONT OpenGL-in ön tampona göstərilməsinə səbəb olur və GL_BACK arxa tampona geri işləmə hərəkətləri. OpenGL tətbiqləri stereo göstərmə üçün sol və sağ tamponlar və köməkçi tamponlar kimi göstərmə üçün tək bir ön və arxa buferdən daha çoxunu dəstəkləyə bilər. Bu digər tamponlar bu fəslin sonunda istinad hissəsində daha da sənədləşdirilmişdir.

Ön tampona göstərməyin ikinci yolu, OpenGL işə salındıqda sadəcə cüt tamponlu göstərmə istəməməkdir. OpenGL hər bir OS platformasında fərqli olaraq başlanğıc edilir, lakin GLUT ilə ekran rejimimizi RGB rəng və aşağıdakı kod sətri ilə cüt tamponlu göstərmə üçün işə salırıq:

Tək tamponlu göstərmə əldə etmək üçün sadəcə bit bayrağını buraxmalısınız GLUT_DOUBLEburada göstərildiyi kimi:

Tək tamponlu göstərmə etdikdə, ya zəng etmək vacibdir parıldamaq və ya qurtarın nəticələri həqiqətən ekrana çəkildiyini görmək istədiyiniz zaman. Tampon mübadilə dolayısı ilə boru kəmərinin bir boşluğunu yerinə yetirir və mübadilə həqiqətən baş vermədən əvvəl göstərmənin tamamlanmasını gözləyir. Bu prosesin mexanikasını Fəsil 11-də daha ətraflı şəkildə & quot; Boru Kəməri Haqqında Hər şey: Daha Sürətli Həndəsə Məhsuldarlığı & quot; -də müzakirə edəcəyik.

Siyahı 3.12 SINGLE nümunə proqramının rəsm kodunu göstərir. Bu nümunə pəncərənin mərkəzindən fırlanan bir sıra nöqtələr çəkmək üçün tək bir göstərmə tamponundan istifadə edir. The RenderScene () funksiyası dəfələrlə çağırılır və sadə bir animasiya ilə dövr etmək üçün statik dəyişənlərdən istifadə olunur. TEK nümunə proqramının nəticəsi Şəkil 3.35-də göstərilmişdir.

Şəkil 3.35 Tək buferli göstərmə nümunəsindən nəticə.

Listinq 3.12 TEK Nümunə üçün Rəsm Kod

Dərinlik Tamponunu manipulyasiya etmək

Rəng tamponları, OpenGL-in təqdim etdiyi tək tamponlar deyil. Əvvəlki fəsildə dərinlik tamponu da daxil olmaqla digər bufer hədəflərindən bəhs etdik. Bununla birlikdə, dərinlik tamponu rəng dəyərləri əvəzinə dərinlik dəyərləri ilə doldurulur. GLUT ilə bir dərinlik tamponu tələb etmək əlavə etmək qədər sadədir GLUT_DEPTH ekran rejimini işə salarkən bit bayrağı:

Dərinlik tamponundan dərinlik testi üçün istifadənin aşağıdakıları çağırmaq qədər asan olduğunu artıq görmüsünüz.

Dərinlik testi aktiv edilmədikdə belə, bir dərinlik tamponu yaradılarsa, OpenGL rəng tamponuna daxil olan bütün rəng parçaları üçün müvafiq dərinlik dəyərlərini yazacaqdır. Bəzən də olsa, dərinlik sınağının yanında dərinlik tamponuna yazma dəyərlərini müvəqqəti olaraq söndürmək istəyə bilərsiniz. Bunu funksiya ilə edə bilərsiniz glDepthMask:

Maska qurulur GL_FALSE dərinlik tamponuna yazmağı aradan qaldırır, lakin dərinlik tamponuna yazılmış hər hansı bir dəyərdən istifadə edərək dərinlik sınağının aparılmasını ləğv etmir. Bu funksiyaya zəng etmək GL_TRUE standart vəziyyət olan dərinlik tamponuna yazmağı yenidən aktivləşdirir. Maskeleme rəngli yazılar da mümkündür, ancaq bir az daha çox iştirak edir və Fəsil 6-da müzakirə ediləcəkdir.

Qayçı ilə kəsmək

Göstərmə performansını yaxşılaşdırmağın bir yolu ekranın yalnız dəyişmiş hissəsini yeniləməkdir. Pəncərənin içərisində daha kiçik düzbucaqlı bir bölgədə OpenGL göstərilməsini məhdudlaşdırmanız lazım ola bilər. OpenGL, göstərilmənin baş verə biləcəyi pəncərənizdə bir qayçı düzbucaqlı təyin etməyə imkan verir. Varsayılan olaraq qayçı düzbucaqlı pəncərənin ölçüsüdür və heç bir qayçı testi baş vermir. Hər yerdə olan qayçı testini yandırırsınız glEnable funksiya:

Əlbəttə ki, qayçı testini müvafiq ilə yenidən söndürə bilərsiniz glDisable funksiya çağırışı. Pəncərədəki göstəricinin yerinə yetirildiyi düzbucaqlı qayçı qutusu, aşağıdakı funksiya ilə pəncərə koordinatlarında (piksel) göstərilmişdir:

The xy parametrləri ilə qayçı qutusunun sol alt küncünü təyin edir enihündürlük qayçı qutusunun müvafiq ölçüləri. Siyahı 3.13, SCISSOR nümunə proqramı üçün göstərmə kodunu göstərir. Bu proqram, rəng tamponunu hər dəfə təmizlənmədən əvvəl göstərilən daha kiçik bir qayçı qutusu ilə təmizləyir. Nəticə, Şəkil 3.36-da göstərildiyi kimi üst-üstə düşən rəngli düzbucaqlılar toplusudur.

Siyahı 3.13 Bir sıra Dikdörtgenlər göstərmək üçün Qayçı Qutusundan istifadə

Şəkil 3.36 Büzülən qayçı qutuları.

Şablon tamponundan istifadə

OpenGL qayçı qutusundan istifadə pəncərədəki düzbucaqlı ilə göstərilməsini məhdudlaşdırmaq üçün əla bir yoldur. Bununla birlikdə, tez-tez bir şablon şablonu istifadə edərək düzensiz bir sahəni maskalamaq istəyirik. Həqiqi dünyada bir şablon, düz bir karton və ya naxış kəsilmiş başqa bir materialdır. Rəssamlar şablondakı naxışdan istifadə edərək bir səthə boya tətbiq etmək üçün şablondan istifadə edirlər. Şəkil 3.37 bu prosesin necə işlədiyini göstərir.

Şəkil 3.37 Həqiqi dünyada səthi rəngləmək üçün bir şablondan istifadə.

OpenGL dünyasında bizdə var şablon tampon əvəzinə. Şablon tamponu bənzər bir qabiliyyət təmin edir, lakin göstərmə əmrləri ilə şablon nümunəsini özümüz yarada bildiyimiz üçün daha güclüdür. OpenGL stenciling istifadə etmək üçün əvvəlcə platformaya xas OpenGL quraşdırma prosedurlarını istifadə edərək bir şablon tampon tələb etməliyik. GLUT istifadə edərkən, ekran rejimini işə saldıqda birini tələb edirik. Məsələn, aşağıdakı kod sətri şablonla ikiqat tamponlu bir RGB rəng tamponu qurur:

Şablon əməliyyatı müasir hardware sürətləndirilmiş OpenGL tətbiqetmələrində nisbətən sürətlidir, lakin bununla birlikdə açıla da bilər glEnable/glDisable. Məsələn, şablon kodunu aşağıdakı kod satırı ilə açırıq:

Şablon testi aktiv olduqda, rəsm yalnız şablon testindən keçən yerlərdə baş verir. Bu funksiya ilə istifadə etmək istədiyiniz şablon testini qurdunuz:

İstifadə etmək istədiyiniz şablon funksiyası, funksiya, bu dəyərlərdən hər hansı biri ola bilər: GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATERGL_NOTEQUAL. Bu dəyərlər OpenGL-də şablon şablonunda əvvəlcədən saxlanılan dəyəri göstərdiyiniz dəyərlə necə müqayisə edəcəyinizi izah edir ref. Bu dəyərlər, referans dəyərinin şablon şablonunda əvvəlcədən saxlanılan dəyərə uyğun olaraq az, az və ya bərabər, daha böyük və ya bərabər, daha böyük və bərabər olmadığı təqdirdə heç vaxt və ya hər zaman keçməyə cavab verir. Bundan əlavə, bir az ağıllı bir maska ​​dəyəri təyin edə bilərsiniz Müqayisə baş vermədən əvvəl həm istinad dəyəri, həm də şablon tampondan alınan dəyər ilə ed.

Şablon tamponunun məhdud bir həssaslıq ola biləcəyini anlamalısınız. Şablon tamponlar ümumiyyətlə yalnız 1 ilə 8 bit arasındadır. Hər bir OpenGL tətbiqetməsində şablon tamponunun mövcud bit dərinliyində öz sərhədləri ola bilər və hər bir əməliyyat sistemi və ya mühitdə bu dəyəri soruşma və təyinetmə üsulları vardır. GLUT-da yalnız mövcud şablon şablonlarını əldə edirsiniz, lakin daha incə nəzarət üçün kitabın sonrakı əməliyyat sisteminə və # 150 xüsusi fəsillərinə müraciət etməlisiniz. Dəyərlər keçdi refmaska şablon tamponun mövcud bit dərinliyini aşan sadəcə kəsilir və yalnız ən az əhəmiyyətli bitlərin maksimum sayından istifadə olunur.

Şablon naxışının yaradılması

Artıq şablon şablonunun necə aparıldığını bilirsən, amma başlanğıc üçün şablon şablonuna bu dəyərlər necə qoyulur? Birincisi, hər hansı bir rəsm əməliyyatına başlamazdan əvvəl şablon tamponunun təmizləndiyinə əmin olmalıyıq. Bunu rəng və dərinlik tamponlarını təmizlədiyimiz şəkildə edirik glClear& # 151 bit maskasından istifadə etmək GL_STENCIL_BUFFER_BIT. Məsələn, aşağıdakı kod satırı rəng, dərinlik və şablon tamponlarını eyni vaxtda təmizləyir:

Aydın əməliyyatda istifadə olunan dəyər əvvəllər bir zəng ilə təyin olunur

Şablon testi aktiv edildikdə, göstərmə əmrləri, istifadə edərək şablon tamponundakı dəyərlə yoxlanılır glStencilFunc yeni müzakirə etdiyimiz parametrlər. Parçalar (rəng tamponuna qoyulmuş rəng dəyərləri) ya həmin şablon testinin nəticəsinə əsasən yazılır və ya atılır. Şablon tamponu özü də bu sınaq zamanı dəyişdirilir və şablon tamponuna daxil olan şey, sizin necə adlandırdığınızdan asılıdır. glStencilOp funksiya:

Bu dəyərlər, şablon testi uğursuz olarsa OpenGL-ə şablon tamponunun dəyərini necə dəyişdirəcəyini izah edir (uğursuz) və şablon şablonu keçsə də, dərinlik sınağı uğursuz olarsa şablon şablonunu dəyişə bilərsiniz (zfail) və ya keçir (zpass). Bu arqumentlər üçün etibarlı dəyərlər GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAPGL_DECR_WRAP. Bu dəyərlər cari dəyərin saxlanmasına, sıfıra qoyulmasına və istinad dəyəri ilə əvəzlənməsinə cavab verir glStencilFunc), dəyəri artırmaq və ya azaltmaq, ters çevirmək və sırasıyla paketi ilə artırmaq / azaltmaq. Hər ikisi də GL_INCRGL_DECR şablon dəyərini artırın və azaldın, ancaq müəyyən bir bit dərinliyi üçün şablon tamponda təmsil oluna bilən minimum və maksimum dəyərə sıxın. GL_INCR_WRAP və eyni şəkildə GL_DECR_WRAP müəyyən bir bit təmsilçiliyinin yuxarı və alt hüdudlarını aşdıqda sadəcə dəyərləri sarın.

Nümunə proqram STENCIL-də şablon tamponda spiral xətt nümunəsi yaradırıq, rəng tamponunda yox. Fəsil 2-dən dönən düzbucaqlı ziyarət üçün geri qayıdır, lakin bu dəfə şablon testi, şablon tamponunun 0x1 dəyəri olduğu yerdə qırmızı düzbucaqlının çəkilməsinin qarşısını alır. Siyahı 3.14 müvafiq rəsm kodunu göstərir.

Listen 3.14 STENCIL Nümunəsi üçün İşləmə Kodu

Aşağıdakı iki sətir bütün qəlpələrin şablon sınağında uğursuz olmasına səbəb olur. Dəyərləri refmaska bu vəziyyətdə əhəmiyyətsizdir və istifadə edilmir.

Dəlilləri glStencilOpBununla birlikdə, ekranda bir şey görüldüyündən asılı olmayaraq, şablon tampondakı dəyərin yazılmasına (əslində artırılmış) səbəb olur. Bu sətirlərdən sonra ağ spiral xətt çəkilir və xəttin rəngi ağ olmasına görə mavi fonda görə biləcəyinizə baxmayaraq, rəng tamponunda çəkilmir, çünki həmişə şablon şablonunu sınayır (GL_NEVER). Əslində yalnız şablon tamponunu təqdim edirsiniz!

Sonra, şablon işini bu sətirlərlə dəyişdiririk:

İndi, şablon tamponunun bərabər olmadığı yerdə rəsm çəkiləcək (GL_NOTEQUAL) ekrandakı hər hansı bir yerdə spiral xəttin çəkilmədiyi 0x1-ə. Sonrakı zəng glStencilOp bu nümunə üçün isteğe bağlıdır, lakin OpenGL-ə bütün gələcək rəsm əməliyyatları üçün şablon tamponunu tək buraxmasını söyləyir. Bu nümunə hərəkətdə ən yaxşı şəkildə görünsə də, Şəkil 3.38, haşiyələnən qırmızı kvadratın & quotstylilediyi kimi göründüyü şəkli göstərir. & Quot;

Dərinlik tamponu kimi, funksiyanı istifadə edərək şablon tamponuna yazıları da gizlədə bilərsiniz glStencilMask:

Maska qurulur yalan şablon test əməliyyatlarını deaktiv etmir, lakin hər hansı bir əməliyyatın şablon şablonuna buferə yazmasına mane olur.

Şəkil 3.38 Maskeleme şablon şablonu ilə sıçrayan qırmızı kvadrat.


Əsas Qrafik Boru Kəməri

OpenGL-də ibtidai bir şey əvvəlcədən təyin olunmuş şəkildə bir-birinə bağlanan sadəcə bir zirvə toplusudur. Məsələn, tək bir nöqtə, tam bir zirvə tələb edən ibtidai bir şeydir. Başqa bir nümunə üç təpədən ibarət ibtidai bir üçbucaqdır. Fərqli primitivlərdən bəhs etməzdən əvvəl, əvvəlcə fərdi təpələrdən necə ibtidailərin yığıldığına nəzər salaq. Əsas göstərmə boru kəməri üç zirvəni alır və onları üçbucağa çevirir. Həm də rəng, bir və ya daha çox toxuma tətbiq edə bilər və onları hərəkət etdirə bilər. Bu boru kəməri, həmçinin vertikal məlumatları işləmək və pikselləri doldurmaq üçün qrafika donanımı tərəfindən icra olunan iki proqram yazdığınıza görə proqramlaşdırıla bilər (onlara fraqmentlər deyirik, çünki əslində piksel başına birdən çox fraqment ola bilər, lakin bundan sonra daha çox) Ekranda. Bu əsas prosesin OpenGL-də necə işlədiyini anlamaq üçün burada Şəkil 3.1-də göstərilən OpenGL göstərmə boru kəmərinin sadələşdirilmiş versiyasına nəzər salaq.

Müştəri-Server

İlk olaraq boru kəmərini yarıya böldüyümüzə diqqət yetirin. Yuxarıda müştəri yan, altındakı isə server. Boru kəmərinin müştəri tərəfi server tərəfdən funksional olaraq ayrıldıqda əsas müştəri-server dizaynı tətbiq olunur. OpenGL-in vəziyyətində, müştəri tərəfi əsas CPU yaddaşında yaşayan və tətbiq proqramı daxilində və ya əsas sistem yaddaşında sürücü içərisində icra olunan koddur. Sürücü göstərmə əmrlərini və məlumatları toplayır və icrası üçün serverə göndərir. Tipik bir masa üstü kompüterdə, server bəzi sistem avtobuslarında yerləşir və əslində qrafik kartındakı avadanlıq və yaddaşdır.

Müştəri və server eyni zamanda asenkron olaraq işləyir, yəni hər ikisi müstəqil proqram və ya hardware parçaları və ya hər ikisidir. Maksimum performans əldə etmək üçün hər iki tərəfin də mümkün qədər çox məşğul olmasını istəyirsən. Müştəri davamlı olaraq məlumat bloklarını və əmrləri buferlərə yığır, sonra icrası üçün serverə göndərilir. Bundan sonra server həmin tamponları həyata keçirir, eyni zamanda müştəri göstərilən məlumat və ya məlumatın növbəti hissəsini göndərməyə hazırlaşır. Müştəri gözləyərkən server heç işsiz qalarsa və ya müştəri dayanıb serverin daha çox əmr və ya məlumat üçün hazır olmasını gözləməlidirsə, buna boru kəməri dayanacağı deyirik. Boru kəmərləri tezgahları performans proqramçılarının ləzzətidir və biz iş görmək üçün gözləyən boş yerdə dayanan CPU və ya GPU-ları istəmirik.

Shaders

Şəkil 3.1-də göstərilən iki ən böyük qutu, vertex shader və fragment shader üçündür. Shader, GLSL-də yazılmış bir proqramdır (GLSL proqramlaşdırmasına 6-cı Fəsildə "Qutunun xaricində Düşünmək: Qeyri-sabit Shaders" daxil oluruq).GLSL C kimi bir şeyə bənzəyir, əslində bu proqramlar hətta tanış olanlardan başlayır əsas funksiya. Bu shaderlər istifadə olunmadan əvvəl mənbə kodundan tərtib olunmalı və birləşdirilməlidir (yenidən C və ya C ++ proqramı kimi). İstifadəyə hazır olan son shader proqramı daha sonra ilk işləmə mərhələsi kimi vertex shader və ikinci mərhələ olaraq fragment shaderdan ibarətdir. Qeyd edək ki, burada sadələşdirilmiş bir yanaşma tətbiq edirik. Həqiqətən buraya (istəyə görə) sığacaq bir həndəsə kölgələyici deyilən bir şey və məlumatları irəli və geri daşımaq üçün hər cür geribildirim mexanizmləri var. Qarışıq, trafaret və dərinlik testi kimi bəzi sonrakı işləmə xüsusiyyətləri də vardır, bunları daha sonra nəzərdən keçiririk.

Vertex shader, müştəridən gələn məlumatları işləyir, dəyişikliklər tətbiq edir və ya işıq effektlərini, yerdəyişməsini, rəng dəyərlərini və s. Hesablamaq üçün digər riyaziyyat növləri edir. Üç köşeli bir üçbucaq göstərmək üçün, hər bir təpə üçün bir dəfə vertex shader üç dəfə yerinə yetirilir. Bugünkü aparatda eyni anda işləyən çoxsaylı icra vahidi mövcuddur, bu da hər üç təpənin eyni vaxtda işlənməsi deməkdir. Bu gün qrafik prosessorları kütləvi şəkildə paralel kompüterlərdir. Onları CPU ilə müqayisə edərkən saat sürətinə aldanmayın. Qrafika əməliyyatlarında daha sürətli böyüklük əmrləridir.

Üç təpə indi rasterləşdirilməyə hazırdır. Şəkil 3.1-dəki ibtidai montaj qutusu, üç zirvənin daha sonra birləşdirildiyini və üçbucağın parçalanaraq parçalandığını göstərir. Hər bir fraqment, ekranda görəcəyiniz son rəng dəyərini çıxaran fraqment kölgələndiricisini icra edərək doldurulur. Yenə də bugünkü aparat kütləvi şəkildə paraleldir və bu fraqment proqramların yüz və ya daha çoxunun eyni vaxtda icra edilməsi mümkündür.

Əlbətdə bir şeyin baş verməsi üçün bu gölgələdicilərə bir neçə məlumat verməlisiniz. Proqramçı göstərmə üçün OpenGL gölgələdicilərinə məlumat ötürməyin üç yolu var: atributlar, formalar və toxumalar.

Xüsusiyyətlər

Atribut, hər təpədə dəyişən bir məlumat elementidir. Əslində, vertex mövqeyinin özü bir atributdur. Atributlar üzən nöqtə, tam və ya məntiqi məlumatlar ola bilər və atributlar həmişə dörd komponent vektor kimi daxili olaraq saxlanılır, hətta bütün dörd komponentdən istifadə etməsəniz də. Məsələn, vertex mövqeyi x, a y və z dəyəri kimi saxlanıla bilər. Bu dörd komponentdən üçünü olardı. Daxili olaraq OpenGL dördüncü komponenti (yalnız bilməli olduğunuz halda W) bir hissəyə çevirir. Əslində, yalnız xy müstəvisində rəsm çəkirsinizsə (və z-yə məhəl qoymadan) üçüncü komponent avtomatik olaraq sıfır, dördüncüsü isə bir olacaq. Nümunəni tamamlamaq üçün bir atribut olaraq yalnız bir üzən nöqtə dəyərini göndərsəniz, ikinci və üçüncü komponentlər sıfır, dördüncü isə yenə də birdir. Bu varsayılan davranış, yalnız vertex mövqeləri deyil, qurduğunuz hər hansı bir atribut üçün tətbiq olunur, buna görə sizin üçün mövcud olan dörd komponenti istifadə etmədiyiniz zaman diqqətli olun. Məkandakı mövqedən başqa bir təpədə dəyişə biləcəyiniz digər şeylər, toxuma koordinatları, rəng dəyərləri və işıqlandırma hesablamalarında istifadə olunan səth normalarıdır. Xüsusiyyətlər, nəzarət etdiyiniz vertex proqramında istədiyiniz hər hansı bir mənaya sahib ola bilər.

Atributlar göstəricidən yerli müştəri yaddaşına qrafika aparatında saxlanılan (çox güman ki) buferə köçürülür. Atributlar yalnız vertex shader tərəfindən işlənir və fragment shader üçün heç bir mənası yoxdur. Həm də atributların hər bir təpə başına dəyişdiyini aydınlaşdırmaq üçün bu, təkrarlanan dəyərlərə sahib ola bilməyəcəkləri demək deyil, yalnız hər bir təpə üçün bir saxlanılan dəyər var. Ümumiyyətlə, əlbəttə ki, fərqlidirlər, amma eyni dəyərlərdən ibarət bir sıra əldə etmək mümkündür. Bununla birlikdə, bu çox israfçı olardı və tək bir partiyada bütün xüsusiyyətlər üçün eyni olan bir məlumat elementinə ehtiyacınız varsa, daha yaxşı bir yol var.

Formalar

Forma, atributların hamısı üçün vahid, yəni dəyişməz bir vahid dəyərdir. Vahid dəyişənlərin dəyərlərini ümumiyyətlə ibtidai bir toplu işləmək üçün əmr göndərməzdən əvvəl təyin edirsiniz. Formalar praktik olaraq sınırsız sayda istifadə üçün istifadə edilə bilər. Bütün bir səthə tətbiq olunan tək bir rəng dəyəri təyin edə bilərsiniz. Hər növ vertex animasiyası etmək üçün göstərdiyiniz zaman dəyişdirə biləcəyiniz bir zaman dəyəri təyin edə bilərsiniz (vahid dəyişiklikləri burada hər vertexdə deyil, hər partiyada bir dəfə qeyd edin). Formaların ən geniş yayılmış istifadələrindən biri də vertex shader-də transformasiya matrislərini təyin etməkdir (bu, demək olar ki, Fəsil 4-ün "Əsas transformasiyalar: Vektor / Matrix Astarı" nın bütün məqsədi).

Atributlar kimi vahid dəyərlər təbiətdə üzən nöqtə, tam və ya məntiqi ola bilər, lakin atributlardan fərqli olaraq həm təpədə həm də fraqment kölgələyicidə vahid dəyişənlərə sahib ola bilərsiniz. Uniformalar skalar və ya vektor tipli ola bilər və matris formalarına sahib ola bilərsiniz. Texniki olaraq, matrisin hər sütununun dörd komponentli vektor yuvalarından birini tutduğu matris atributlarına da sahib ola bilərsiniz, lakin bu çox vaxt edilmir. Fəsil 5-də müzakirə etdiyimiz "Əsas Dokuma" adlı bəzi xüsusi vahid parametr funksiyaları da var.

Doku

Gölgəçiyə ötürə biləcəyiniz üçüncü bir məlumat növü doku məlumatlarıdır. Dokuların necə işlənib kölgələniciyə ötürülməsi barədə çox ətraflı məlumat verməyə çalışmaq biraz tezdir, ancaq "3B Qrafika və OpenGL-ə giriş" adlı Fəsil 1-dən, əsasən bir toxumanın nə olduğunu bilirsiniz. Doku dəyərləri nümunə götürülə bilər və həm təpədən, həm də fraqment kölgələdən süzülür. Fragment shaders, ümumiyyətlə üçbucağın səthinə görüntü məlumatlarını tətbiq etmək üçün bir toxuma nümunəsi götürür. Bununla birlikdə, toxuma məlumatları yalnız şəkilləri təmsil etməkdən daha faydalıdır. Çox şəkil faylı formatı rəng komponentlərini imzasız bayt dəyərlərində saxlayır (rəng kanalı başına 8 bit), eyni zamanda üzən nöqtə toxumalarına sahib ola bilərsiniz. Bu, bahalı bir funksiyanın geniş axtarış cədvəli kimi potensial olaraq hər hansı bir böyük üzən nöqtə məlumat blokunun bu şəkildə bir kölgəçiyə ötürülə bilməsi deməkdir.

Şəkil 3.1-də göstərilən diaqramda göstərilən dördüncü tip məlumatlar çıxışdır. Bir çıxdı dəyişən bir shader mərhələsindən bir çıxış olaraq elan edilir və bir olaraq elan edilir in sonrakı shader mərhələsində. Çıxışlar sadəcə bir mərhələdən digərinə keçə bilər və ya müxtəlif yollarla interpolasiya edilə bilər. Müştəri kodunun bu daxili dəyişənlərə girişi yoxdur, əksinə həm vertexdə, həm də fragment shader-də (və ehtimal ki, isteğe bağlı həndəsə gölgeleyicisində) elan olunur. Vertex shader, üçün bir dəyər təyin edir çıxdı dəyişəndir və dəyər sabitdir və ya ibtidai rasterləşdirildiyi üçün təpələr arasında interpolasiya edilə bilər. Parça shader uyğun in eyni adlı dəyişən bu sabit və ya interpolyasiya edilmiş dəyəri alır. Fəsil 6-da bunun necə işlədiyini daha ətraflı görürük.


Astronomiya tədqiqat sənədlərinə interaktiv üç ölçülü qrafika daxil olmaqla ☆

Astronomlar tərəfindən yaradılan və ya istifadə edilən tədqiqat məlumatlarının əksəriyyəti daxili cəhətdən çox ölçülüdür. Bunun əksinə olaraq, tədqiqat sənədləri içərisində təqdim olunan bütün məlumatların vizual təqdimatları yalnız iki ölçülüdür (2D). Astronomiya məlumat dəstlərinin üçölçülü (3B) vizualizasiyalarını elektron formatda tədqiqat sənədlərinə yerləşdirmək üçün yeni bir metoddan istifadə edən bu ikiləmin bir qətnaməsini təqdim edirik. Texnikamız, S2PLOT proqramlaşdırma kitabxanasının yeni versiyası ilə birlikdə ən son Adobe Portable Document Format uzantılarını istifadə edir. 3D modellər oxucu tərəfindən asanlıqla döndərilə və araşdırıla bilər və bəzi hallarda dəyişdirilə bilər. Bu texnikanın nümunəvi tətbiqetmələrini nümayiş etdiririk: qırmızı sürüşmə kataloqularında incə quruluşu göstərən 3D rəqəmlər, rəng böyüklüyü diaqramları və halo birləşmə ağacları 3D izosəthi və kosmoloji simulyasiyalarının həcm göstərmələri və təlimat diaqramları və alət dizaynlarının 3B modelləri.


Dəyişikliklər

Son addım, modelləşdirmə üçün əlverişli bir şəkildə göstərilən giriş mövqelərini götürmək və OpenGL çıxış mövqelərini həqiqətən düzgün bir şəkildə düzəldə bilər. Bu, əsasən hər istiqamətdə -1-dən 1-ə qədər olan bir 3D kub olan klip məkanında olan son mövqelərin yaradılması deməkdir. Bu kubun içindəki hər hansı bir nöqtə rasterləşdiriləcəkdir.

Bununla birlikdə, əslində bir neçə əlaqəli konsepsiya var:

Vertex shader giriş məlumatları. Buradakı məlumatlar hər hansı bir şəkildə ola bilər və koordinat olmalı deyil. Lakin praktikada giriş məlumatları ümumiyyətlə modelləşdirmək üçün asan olan bəzi koordinatlarda 3B nöqtələrdən ibarətdir və bu zaman nöqtələr model məkanı.

Klip sahəsi. Bu, vertex shader-in çıxışı, homojen koordinatlarda.

Normallaşdırılmış Cihaz Koordinatları. Klip məkanında eyni nöqtələr, ancaq homojen koordinatlardan w-bölmə edərək 3D Kartezyen koordinatlarına çevrilmişdir. Yalnız mənşə ətrafında mərkəzləşdirilmiş 2 × 2 × 2 kub içindəki nöqtələr (bütün oxlarda -1 ilə 1 arasında) göstəriləcəkdir.

Ekran boşluğu. Bunlar əvvəllər məkanın mərkəzində olan mənşəyin kətanın sol alt hissəsidir. Z koordinatı yalnız dərinlik çeşidlənməsi üçün istifadə olunur. Bunlar rasterizasiya üçün istifadə edilən koordinatlardır.

Yuxarıdakı dörd boşluq. Vurgulanan hissə bizim nəzarətimizdədir.

Yıxılmağımın səbəbi model, dünya və görüntü sahəsi, NDC və ekran məkanı ilə yanaşı bir çox dərslərdə danışmaqdır. Ancaq klip sahəsindən əvvəl hər şeyin olduğunu başa düşmək vacibdir sənə bağlıdır. Giriş məlumatlarının necə göründüyünə və klip sahəsinə necə çevrildiyinə qərar verirsiniz. Yəqin ki, model məkanındakı girişləri müəyyənləşdirmək, daha sonra yerli və kamera çevrilmələrini ardıcıl tətbiq etmək deməkdir. Ancaq OpenGL API-lərini anlamaq istəyirsinizsə, əvvəlcə nəzarətinizdə olanları və OpenGL-in sizin üçün nə təmin etdiyini anlamaq vacibdir.

Budur əla hissə: istəsəniz, koordinatları birbaşa klip məkanında əvvəlcədən hesablaya bilərdiniz və vertex shader yalnız giriş mövqeləri boyunca OpenGL-ə keçərdi. Bu, ilk demomuzun etdiyi şeydir! Ancaq bunu hər kadr üçün etmək baha başa gəlir, çünki ümumiyyətlə etmək istədiyimiz transformasiyalar (matris çarpımları) GPU-da daha sürətli olur.

Dəyişiklikləri qəbul etmək üçün kölgə yenilənir

VBO-da göstərilən model kosmik koordinatlarından klip boşluğuna çevirmək üçün çevrilməni iki hissəyə ayıraq:

Dünya kosmik çevrilməsinə bir model.

Perspektivli proyeksiya çevrilməsi.

Bu qəza məqsədlərimiz üçün işləyir, çünki küpü zamanla döndərəcəyik, perspektiv proyeksiyasını eyni tərk edəcəyik. Gerçək dünya tətbiqetmələrində, bütün dünyanı dəyişdirmədən hərəkət edən bir kameraya icazə vermək üçün iki addım arasında bir kamera (və ya görünüş) çevrilməsində yer tapacaqsınız.

Gölgəçiyə iki vahid dəyişən əlavə etməklə başlayın. Unutmayın ki, forma bütün çəkmə çağırışı üçün müəyyən edilmiş və bu çəkiliş çağrısındakı bütün zirvələrdə sabit qalan giriş məlumatlarının bir hissəsidir. Bizim vəziyyətimizdə, hər hansı bir anda, çevrilmələr kubumuzu təşkil edən üçbucaqların bütün təpələri üçün eynidır.

İki dəyişən iki transformasiyanı təmsil edir və buna görə 4 × 4 matrisdir. Giriş vəziyyətini homojen koordinatlara çevirərək, sonra transformasiya matrisləri ilə əvvəlcədən vuraraq çevrilmələrdən istifadə edə bilərik.

Perspektivli proyeksiya matrisinin göstərilməsi

Yuxarıdakı iki matrisdən birini, yəni proyeksiya matrisini dolduraq. Yadda saxla ki, təpə kölgələyicimizi qurma tərzinə görə proyeksiya matrisi dünya məkanında nöqtələr götürəcək (giriş nöqtələri model çevrildikdən sonra bitəcək) və onları klip məkanına qoyacaqsınız. Yəni proyeksiya matrisinin iki vəzifəsi var:

Göstərilən hər hansı bir şeyin mənşəyi ətrafında mərkəzləşdirilmiş 2 × 2 × 2 küpə qoyulduğundan əmin olun. Yəni göstərilməsini istədiyimiz hər təpənin -1 ilə 1 arasında koordinatları olmalıdır.

Perspektiv istəsək, w koordinatını qurun ki, onunla bölünməsi perspektiv bölüşdürməsini həyata keçirsin.

Digər yerlərdə olduğu kimi perspektiv proyeksiya matrisinin riyaziyyatına girməyəcəm. Vacib olan matrisi bəzi parametrlər baxımından təyin edəcəyik, məsələn, yaxın və uzaq kəsmə bölmələrinə olan məsafə və baxış bucağı. Bəzi kodlara baxaq:

Bu matrisin mənasını vermək üçün aşağıdakılara diqqət yetirin:

Ən əsası, OpenGL-dəki matrislər sütun əsas qaydada təyin olunur. Yəni yuxarıdakı ilk dörd dəyər həqiqətən birincidir sütun. Eynilə, hər dördüncü dəyər birə kömək edir sıra, yəni ən alt sətir yuxarıda (0, 0, -1, 0) deməkdir.

İlk üç sıra x, y və z koordinatlarını düzgün aralığa gətirmək üçün perspektiv çevrilməni təyin edən sərhədlərdən istifadə edir.

Son sıra z koordinatını -1-ə vurur və çıxışı w-koordinatına yerləşdirir. Son "w ilə bölmək" in daha çox mənfi z koordinatına sahib olan obyektləri böyütməsinə səbəb olan (mənfi z dəyərlərinin bizdən uzaqlaşdığını xatırlamaq). Bir orfoqrafiya proyeksiyası aparsaydıq, çıxışı w-koordinatını 1 olaraq buraxardıq.

İndi bir matrisə sahib olduğumuz üçün, düzgün formatda, onu kölgədəki dəyişənlə əlaqələndirə bilərik. Bu, bir sıra bir atribut dəyişkənliyi ilə necə əlaqələndirildiyinə bir qədər bənzəyir. Lakin, forma mahiyyət etibarilə bütün təpələr tərəfindən paylaşılacaq bir məlumat parçasını ehtiva etdiyi üçün (bir məlumatdan fərqli olaraq) təpə başına), ara tampon yoxdur. Dəyişənə bir sapı tutun və məlumatları göndərin.

Bunu etdiyinizə əmin olun çöldə loop funksiyası. Proqramın icrası boyunca proyeksiyanı dəyişdirməyəcəyik, buna görə bu matrisi yalnız bir dəfə göndərməliyik!

Model çevrilmə matrisinin göstərilməsi

Ənənəvi proyeksiya matrisi, "görünüş məkanında", yəni kameranın görünüşündə nöqtələr götürür. İşləri asanlaşdırmaq üçün kameranın mənşəyində olduğunu və mənfi z istiqamətinə baxdığını düşünürük (baxış sahəsi əslində budur). Beləliklə, indi hədəf kölgəçi giriş mövqelərini perspektiv proyeksiyanın baxış sahəsi və qırpma təyyarələri ilə müəyyən edilə bilən ərazidə olan nöqtələrə çevirməkdir.

Aşağıdakı dəyişiklikləri aşağıdakı qaydada seçdim:

  1. Ölçü 2 dəfə artır.
  2. Y oxunun ətrafında bir bucaqla fırladın.
  3. X oxu ətrafında eyni bucaqla döndürün.
  4. Z oxu -9 vahid boyunca tərcümə edin.

Seçim olduqca ixtiyari idi, lakin bu, əksər tərəfi görünən (arxa üzü heç görünməmiş), kətanın çox hissəsini dolduran və əl ilə hesablamaq nisbətən asan olmayan bir küplə nəticələndi.

Bu çevrilmələr üçün adi çevrilmə matrislərini götürdüm (onları onlayn tapa bilərsiniz), əks qaydada çoxaltdım və nəhayət onları sütun-əsas sıraya gətirmək üçün köçürdüm. Matrisləri bəzi dəyişənlərlə təyin etdim, beləliklə fırlanma bucağını asanlıqla dəyişə bildim:

Model çevrilmə matrisinin dönmə bucağını təyin etmək üçün zaman parametrindən istifadə etməyə imkan verərək döngü funksiyası daxilində təyin olunduğuna diqqət yetirin. Əks təqdirdə, ortaya çıxan matrisi kölgələyən dəyişənlə əlaqələndirmək əvvəlki ilə tamamilə eynidır.

Bütün bunlarla birlikdə dönən kubumuz var! (Məqaləni oxuduğunuz zaman animasiyanın batareyanızın tükənməsinin qarşısını almaq üçün bir oynatma düyməsinin arxasına qoydum.)

Bütün kod bu yazıya daxil edilmişdir. Kodun böyük bir hissəsinin vertex shader giriş məlumatlarını təyin etdiyini tapa bilərsiniz.


3D Məkanında Bitmaplərin Daşınması

Tutorial 9-a xoş gəlmisiniz. İndiyə qədər OpenGL-i çox yaxşı başa düşməlisiniz. Bir OpenGL Pəncərəsi qurmaqdan, işıqlandırma və qarışdırma istifadə edərkən fırlanan bir obyektin xəritəsini düzəltməyə qədər hər şeyi öyrəndiniz. Bu ilk yarı inkişaf etmiş təlim olacaq. Aşağıdakıları öyrənəcəksiniz: Bitmapları ekranda 3D şəklində hərəkət etdirmək, bitmap ətrafındakı qara pikselləri silmək (qarışıqdan istifadə edərək), qara və amp ağ rəngli toxuma rəng əlavə etmək və nəhayət, zərif rənglər və sadə animasiya yaratmağı öyrənəcəksiniz. müxtəlif rəngli toxumaları bir-birinə qarışdırmaq.

Bu təlimat üçün birinci dərsdəki kodu dəyişdirəcəyik. Proqramın əvvəlinə bir neçə yeni dəyişən əlavə etməklə başlayacağıq. Kodun bütün hissəsini yenidən yazacağam, beləliklə dəyişikliklərin harada edildiyini görmək daha asandır.

Aşağıdakı sətirlər yenidir. twinkle və tp BOOLean dəyişənlərdir, yəni DOĞRU və ya YALAN ola bilər. parıldamaq parıldamaq effektinin aktiv olub-olmamasını izləyəcək. tp 'T' düyməsinə basılmış və ya sərbəst buraxıldığını yoxlamaq üçün istifadə olunur. (tp = TRUE basıldı, tp = YALAN).

num ekrana neçə ulduz çəkdiyimizi izləyəcək. Daimi olaraq təyin olunur. Bu o deməkdir ki, kod içərisində heç vaxt dəyişə bilməz. Bunu sabit olaraq təyin etməyimizin səbəbi bir massivi yenidən təyin edə bilməməyinizdir. Beləliklə, yalnız 50 ulduzlu bir sıra qurduq və kodun bir yerində num 51-ə qədər artırmağı qərara aldıqsa, sıra 51-ə qədər böyüyə bilməz, beləliklə bir səhv meydana gələ bilər. Bu dəyəri yalnız bu sətirdə olmasını istədiyinizə dəyişə bilərsiniz. Fəlakətin baş verməsini istəmədiyiniz təqdirdə koddakı numun dəyərini daha sonra dəyişdirməyə çalışmayın.

İndi bir quruluş yaradırıq. Söz quruluşu qorxuducu gəlir, amma əslində belə deyil. Bir quruluş daha böyük bir oxşar qrupu təmsil edən bir qrup sadə məlumatlardır (dəyişənlər və s.). İngilis dilində :) Ulduzları izlədiyimizi bilirik. Aşağıdakı 7-ci sətrin ulduz olduğunu görəcəksiniz. Hər ulduzun rəng üçün 3 dəyəri olacağını bilirik və bütün bu dəyərlər tam ədədi dəyərlər olacaqdır. Üçüncü sətir int r, g, b 3 tam ədədi təyin edir. Biri qırmızı (r), biri yaşıl (g), digəri mavi (b) üçün. Hər ulduzun ekranın mərkəzindən fərqli bir məsafədə olacağını və mərkəzdən 360 fərqli açıdan birində yerləşə biləcəyini bilirik. Aşağıdakı 4-cü sətirə baxırsınızsa, dist adlanan üzən nöqtə dəyəri edirik. Bu məsafəni izləyəcəkdir. 5-ci sətir bucaq adlanan üzən nöqtə dəyəri yaradır. Bu ulduzların bucağını izləyəcəkdir.

Beləliklə, indi ekrandakı bir ulduzun rəngini, məsafəsini və açısını təsvir edən bu məlumat qrupuna sahibik. Təəssüf ki, izləmək üçün birdən çox ulduzumuz var. 50 qırmızı dəyər, 50 yaşıl dəyər, 50 mavi dəyər, 50 məsafə dəyəri və 50 bucaq dəyəri yaratmaq əvəzinə yalnız ulduz adlı bir sıra yaradırıq. Ulduz massivindəki hər bir rəqəm, ulduz adlanan quruluşumuzdakı bütün məlumatları saxlayacaqdır. Ulduz dizini aşağıdakı 8-ci sətirdə düzəldirik. 8-ci sətiri yıxırıq: ulduzlar ulduz [num]. Bizim düşündüyümüz budur. Dizinin növü ulduz olacaq. ulduzlar bir quruluşdur. Beləliklə, massiv quruluşdakı bütün məlumatları saxlayacaq. Dizinin adı ulduzdur. Massivlərin sayı [num] -dur. Num = 50 olduğu üçün indi ulduz adlı bir sıra var. Dizimiz ulduz elementlərini saxlayır. Hər ulduzu ayrı-ayrı dəyişənlərlə izləməkdən daha asan. Bu, çox axmaq bir şey olardı və numun const dəyərini dəyişdirərək silmək ulduzlarını əlavə etməyimizə imkan verməzdi.

Daha sonra izləyicinin ulduzlardan nə qədər uzaq olduğunu (zoom) və ulduzları hansı açıdan (əymə) gördüyümüzü izləmək üçün dəyişənlər qurduq.Z oxundakı yanıb-sönən ulduzları fırladan spin adlı dəyişən hazırlayırıq ki, bu da onları indiki yerlərində fırlandıqları kimi göstərir.

loop, 50 ulduzun hamısını çəkmək üçün proqramda istifadə edəcəyimiz bir dəyişəndir və doku [1] yüklədiyimiz bir b & ampw toxumasını saxlamaq üçün istifadə ediləcək. Daha çox doku istəsəniz, dəyəri bir dənə artırardınız. istifadə etməyə qərar verdiyiniz bir çox toxuma.

Yuxarıdakı sətirdən dərhal sonra toxumamıza yükləmək üçün kod əlavə edirik. Kodu çox ətraflı izah etməli olmamalıydım. 6, 7 və 8-ci dərslərdə toxumaları yükləmək üçün istifadə etdiyimiz eyni kod. Bu dəfə yüklədiyimiz bitmap star.bmp adlanır. GlGenTextures (1, & amptexture [0]) istifadə edərək yalnız bir toxuma yaradırıq. Doku xətti süzgəcdən istifadə edəcəkdir.

Bu, bitmapi yükləyən (yuxarıdakı kodu çağıran) və toxumalara çevirən kod bölməsidir. Status, toxumanın yüklənib yaradılmadığını izləmək üçün istifadə olunur.

İndi istədiyimizi göstərmək üçün OpenGL qurduq. Bu layihədə Dərinlik Testini istifadə etməyəcəyik, buna görə dərsdəki koddan istifadə edərək glDepthFunc (GL_LEQUAL) və glEnable (GL_DEPTH_TEST) kodlarını istifadə etdiyinizə əmin olun, əks halda çox pis nəticələr görəcəksiniz. Bu kodda faktura Xəritəçəkmə istifadə edirik, buna görə də 1-ci sinifdə olmayan hər hansı bir sətir əlavə etdiyinizdən əmin olmağınız lazımdır. Qarışıqla birlikdə toxuma xəritəsini də işə saldığımızı görəcəksiniz.

Aşağıdakı kod yenidir. Hər ulduzun başlanğıc bucağını, məsafəsini və rəngini təyin edir. Quruluşdakı məlumatları dəyişdirməyin nə qədər asan olduğuna diqqət yetirin. Döngə bütün 50 ulduzdan keçəcəkdir. Ulduzun [1] bucağını dəyişdirmək üçün ulduz [1] demək lazımdır .bucaq = . Bu qədər sadədir!

Cari ulduzu götürərək (döngənin dəyəri olan) və ola biləcək maksimum ulduzlara bölərək məsafəni hesablayıram. Sonra nəticəni 5.0f-ə vururam. Əsasən bunun hər bir ulduzu əvvəlki ulduzdan bir qədər uzaqlaşdırmasıdır. Döngü 50 olduqda (son ulduz), num-a bölünən döngə 1.0f olacaqdır. 5.0f-yə vurmağımın səbəbi 1.0f * 5.0f'in 5.0f olmasıdır. 5.0f ekranın ən kənarındadır. 5.0f-nin mükəmməl olması üçün ulduzların ekrandan çıxmasını istəmirəm. Zoomu daha da ekrana qoysanız, 5.0f-dan daha yüksək bir rəqəm istifadə edə bilərsiniz, ancaq ulduzlarınız (perspektiv baxımından) çox kiçik olardı.

Hər bir ulduz üçün rənglərin 0-dan 255-ə qədər təsadüfi dəyərlərdən ibarət olduğunu görərsiniz. Normalda rənglər 0.0f-dən 1.0f-ə qədər olduqda belə böyük dəyərlərdən necə istifadə edə biləcəyimizi düşünə bilərsiniz. Rəngi ​​təyin etdikdə glColor4f əvəzinə glColor4ub istifadə edəcəyik. ub imzasız bayt deməkdir. Bir bayt 0 ilə 255 arasında hər hansı bir dəyər ola bilər. Bu proqramda təsadüfi bir üzən nöqtə dəyəri tapmaqdan daha çox bayt istifadə etmək daha asandır.

Yenidən ölçmə kodu eynidir, buna görə də rəsm koduna keçəcəyik. Dərsi birindəki kodu istifadə edirsinizsə, DrawGLScene kodunu silin və yalnız aşağıda olanları kopyalayın. Dərsdə onsuz da yalnız 2 sətir kod var, buna görə silmək üçün çox şey yoxdur.

İndi ulduzu hərəkətə gətiririk. Ulduz ekranın ortasında başlayır. Etdiyimiz ilk şey səhnəni x oxuna fırlatmaqdır. 90 dərəcə fırlasaq, x oxu artıq soldan sağa qaçmayacaq, ekrana girəcək və çıxacaq. Aydınlaşdırmağa kömək edəcək bir nümunə olaraq. Bir otağın mərkəzində olduğunuzu düşünün. İndi təsəvvür edin ki, sol divarın üstündə -x, ön divarın -z, sağ divarın üstündə + x, arxanızdakı divarın üstündə + z yazılmışdı. Otaq sağa 90 dərəcə dönsəydi, ancaq sən tərpənməsən, qarşındakı divar artıq -z deməzdi -x deyərdi. Divarların hamısı köçmüş olardı. -z sağda, + z solda, -x öndə, + x isə arxada olardı. Mənada? Səhnəni fırladaraq x və z təyyarələrinin istiqamətini dəyişdiririk.

Kodun ikinci sətri x müstəvisində müsbət bir dəyərə keçir. Normalda x-dəki müsbət dəyər bizi ekranın sağ tərəfinə aparacaqdır (adətən + x olduğu yerdə), ancaq y düzündə fırladığımız üçün + x hər yerdə ola bilər. 180 dərəcə dönsəydik, ekranın sağında deyil, solunda olardı. Beləliklə, müsbət x müstəvisi ilə irəlilədikdə sola, sağa, irəli və ya geri hərəkət edə bilərik.

İndi bəzi çətin kodlar üçün. Ulduz əslində düz bir toxumadır. İndi ekranın ortasında düz bir dördlüyü çəksəniz və toxuması eşitsəydi, yaxşı görünürdü. Olmalı olduğu kimi sizinlə qarşı-qarşıya qalacaqdı. Ancaq y oxunda 90 dərəcə dönsəydiniz, toxuma ekranın sağ və sol tərəflərinə baxırdı. Gördüyünüz təkcə incə bir xəttdir. Bunun baş verməsini istəmirik. Ekranı nə qədər fırladaraq əysək də ulduzların hər zaman ekranla üzləşməsini istəyirik.

Bunu ulduzu çəkməzdən əvvəl etdiyimiz rotasiyaları ləğv edərək edirik. Dönüşləri tərs qaydada ləğv edirsiniz. Beləliklə yuxarıda ekranı əydik, sonra ulduzlara cari bucağa döndük. Əks qaydada, ulduzları cari bucağını döndərməzdik (yeni söz). Bunu etmək üçün bucağın mənfi dəyərindən istifadə edirik və bununla fırlanırıq. Beləliklə, ulduzu 10 dərəcə döndərsək, -10 dərəcə geri döndərsək, ulduz bu oxda bir daha ekrana baxacaq. Beləliklə, aşağıdakı ilk sətir y oxundakı fırlanmanı ləğv edir. Sonra x oxundakı ekran əyilməsini ləğv etməliyik. Bunu etmək üçün ekranı -tilt ilə əyməyimiz kifayətdir. X və y növbələrini ləğv etdikdən sonra ulduz tamamilə ekranla üzləşəcəkdir.

Parıldamaq Həqiqidirsə, ekranda dönməyən bir ulduz çəkəcəyik. Fərqli bir rəng əldə etmək üçün maksimum ulduz sayını (num) götürürük və mövcud ulduzların sayını (döngəsini) çıxardırıq, sonra 1-i çıxarırıq, çünki dövrümüz yalnız 0-dan num-1-ə keçir. Nəticə 10 olsaydı, 10 nömrəli ulduzun rəngindən istifadə edərdik. Bu şəkildə iki ulduzun rəngi ümumiyyətlə fərqlidir. Bunu etmək üçün yaxşı bir yol deyil, təsirli. Son dəyər alfa dəyəridir. Dəyər nə qədər az olsa, ulduz daha tünd olur.

Parıldamaq effektiv olarsa, hər ulduz iki dəfə çəkiləcəkdir. Bu, hansı kompüter növünə sahib olduğunuza görə proqramı bir az ləngitəcəkdir. Parıldamaq effektiv olarsa, iki ulduzun rəngləri bir-birinə qarışacaq və həqiqətən gözəl rənglər yaradacaqdır. Həm də bu ulduz fırlanmadığı üçün, parıldamaq aktiv edildikdə, ulduzlar cizgi kimi görünür. (nə demək istədiyimi başa düşmürsənsə özün axtar).

Dokuya rəng qatmağın nə qədər asan olduğuna diqqət yetirin. Doku qara və ağ olmasına baxmayaraq, toxuma çəkmədən əvvəl seçdiyimiz rəngə çevriləcəkdir. Həm də nəzərə alın ki, üzən nöqtə nömrələrindən çox rəng dəyərləri üçün bayt istifadə edirik. Alfa dəyəri belə bir baytdır.

İndi əsas ulduzu çəkirik. Yuxarıdakı koddan fərq yalnız bu ulduzun daima çəkildiyi və bu ulduzun z oxunda fırlandığıdır.

Bütün hərəkəti burada edirik. Spin dəyərini artıraraq normal ulduzları fırlatırıq. Sonra hər ulduzun açısını dəyişdiririk. Hər ulduzun açısı loop / num ilə artırılır. Bunu edən, mərkəzdən daha uzaq olan ulduzları daha sürətli fırlatmaqdır. Mərkəzə yaxın olan ulduzlar daha yavaş fırlanır. Nəhayət, hər ulduzun ekranın mərkəzindən məsafəsini azaldırıq. Bu, ulduzları sanki ekranın ortasına çəkilmiş kimi göstərir.

Aşağıdakı sətirlər ulduzların ekranın mərkəzinə dəyib-düşmədiyini yoxlayır. Bir ulduz ekranın ortasına dəyəndə ona yeni bir rəng verilir və mərkəzdən 5 vahid köçürülür, beləliklə mərkəzə yeni bir ulduz kimi qayıtmağa başlaya bilər.

İndi hər hansı bir düyməyə basılmış olub olmadığını yoxlamaq üçün kod əlavə edəcəyik. WinMain () -ə enin. SwapBuffers (hDC) xəttinə baxın. Əsas yoxlama kodumuzu həmin sətrin altına əlavə edəcəyik. kod xətləri.

Aşağıdakı sətirlər T düyməsinə basılmış olub olmadığını yoxlayır. Basıldıysa və tutulmayacaqsa, aşağıdakılar baş verəcəkdir. Parıltı YALAN olarsa, DOĞRU olacaq. DOĞRU olsaydı, YALAN olacaq. T basıldıqdan sonra tp DOĞRU olacaq. Bu, T düyməsini basıb saxlasanız, kodun dəfələrlə işləməsinin qarşısını alır.

Aşağıdakı kod T düyməsini buraxıb buraxmadığınızı yoxlayır. Əgər varsa, tp = FALSE edir. T düyməsinə basmaq, tp FALSE olmadıqca heç bir şey etməz, buna görə kodun bu hissəsi çox vacibdir.

Kodun qalan hissəsi yuxarı ox, aşağı ox, səhifə yuxarı və ya səhifə aşağı düymələrinə basılmış olub olmadığını yoxlayır.

Bütün əvvəlki təlimlər kimi, pəncərənin yuxarı hissəsindəki başlığın düzgün olduğundan əmin olun.

Bu təlimatda boz miqyaslı bir bitmap şəklinə necə yüklənəcəyimi, görüntünün ətrafındakı qara boşluğu necə çıxardacağımı (qarışıqdan istifadə edərək) şəkilə rəng əlavə etdiyimi və görüntüyü ekran ətrafında 3D olaraq necə hərəkət etdirəcəyimi izah etməyə çalışdım. Orijinal bitmap-in üstündəki bitmap-in ikinci nüsxəsini üst-üstə qoyaraq sizə gözəl rənglər və animasiya yaratmağı da göstərdim. İndiyə qədər sizə öyrətdiyim hər şeyi yaxşı başa düşdükdən sonra, özünüzün 3D demolarını düzəltməkdə problem yaşamamalısınız. Bütün əsaslar əhatə olunmuşdur!

Jeff Molofee (NeHe)

* Bu Dərs üçün Visual C ++ Kodunu YÜKLƏ.

* Bu Dərs üçün Borland C ++ Builder 6 Kodunu YÜKLƏ. (Christian Kindahl tərəfindən konversiya)
* Bu Dərs üçün C # Kodunu YÜKLƏ. (Dönüşüm Brian Holley)
* Bu Dərs üçün Kod Warrior 5.3 Kodunu YÜKLƏ. (Dönüşüm Scott Lupton tərəfindən)
* Bu Dərs üçün Cygwin Kodunu YÜKLƏ. (Stephan Ferraro tərəfindən konversiya)
* Bu Dərs üçün D Dil Kodunu YÜKLƏ. (Dönüşüm Familia Pineda Garcia tərəfindən)
* Bu Dərs üçün Delphi Kodu YÜKLƏ. (Dönüşüm Michal Tucek tərəfindən)
* Bu Dərs üçün Dev C ++ Kodunu YÜKLƏ. (Dan tərəfindən konversiya)
* Bu Dərs üçün Eyforiya Kodunu YÜKLƏ. (Dönüşüm Evan Marshall tərəfindən)
* Bu Dərs üçün Oyun GLUT Kodunu YÜKLƏ. (Dönüşüm Milikas Anastasios tərəfindən)
* Bu Dərs üçün Irix Kodunu YÜKLƏ. (Dönüşüm Lakmal Günasekara tərəfindən)
* Bu Dərs üçün Java Kodunu YÜKLƏ. (Dönüşüm Jeff Kirby tərəfindən)
* Bu Dərs üçün Jedi-SDL Kodunu YÜKLƏ. (Dönüşüm Dominique Louis tərəfindən)
* Bu Dərs üçün JoGL Kodunu YÜKLƏ. (Dönüşüm Abdul Bezrati tərəfindən)
* Bu Dərs üçün LCC Win32 Kodunu YÜKLƏ. (Dönüşüm Robert Wishlaw tərəfindən)
* Bu Dərs üçün Linux Kodunu YÜKLƏ. (Dönüşüm Richard Campbell)
* Bu Dərs üçün Linux / GLX Kodunu YÜKLƏ. (Dönüşüm Mihael Vrbanec tərəfindən)
* Bu Dərs üçün Linux / SDL Kodunu YÜKLƏ. (Dönüşüm Ti Leggett)
* Bu Dərs üçün LWJGL Kodunu YÜKLƏ. (Dönüşüm Mark Bernard tərəfindən)
* Bu Dərs üçün Mac OS Kodunu YÜKLƏ. (Anthony Parker tərəfindən konversiya)
* Bu Dərs üçün Mac OS X / Kakao Kodunu YÜKLƏ. (Dönüşüm Bryan Blackburn tərəfindən)
* Bu Dərs üçün MASM Kodunu YÜKLƏ. (Nico (Baş Dərisi) tərəfindən Dönüşüm)
* Bu Dərs üçün Visual C ++ / OpenIL Kodunu YÜKLƏ. (Denton Woods tərəfindən dönüşüm)
* Bu Dərs üçün Power Basic Kodunu YÜKLƏ. (Angus Qanunu ilə Konversiya)
* Bu Dərs üçün Pelles C Kodunu YÜKLƏ. (Dönüşüm Pelle Orinius tərəfindən)
* Bu Dərs üçün Python Kodunu YÜKLƏ. (Dönüşüm Ryan Showalter tərəfindən)
* Bu Dərs üçün Solaris Kodunu YÜKLƏ. (Dönüşüm Lakmal Günasekara tərəfindən)
* Bu Dərs üçün Visual Basic Kodu YÜKLƏ. (Dönüşüm Peter De Tagyos tərəfindən)
* Bu Dərs üçün Visual Fortran Kodunu YÜKLƏ. (Jean-Philippe Perois tərəfindən konversiya)
* Bu Dərs üçün Visual Studio .NET Kodunu YÜKLƏ. (Qrant Ceymsin Konversiyası)


Videoya baxın: طريقة عمل لتصميم كرتوني ثلاثي الأبعاد (Avqust 2022).