2012-06-06 16 views
8

Próbuję nauczyć się OpenGL. Mam doświadczenie w C i C++, ustawiam środowisko kompilacji i cały ten jazz, ale staram się znaleźć dobry punkt wyjścia.OpenGL Core i zgodność

Jestem świadomy potokowej funkcji, która była widoczna w OpenGL < = 2.1 i wydaje się stosunkowo łatwo zacząć. Jednak główny profil, który OpenGL wypycha w OpenGL> = 3.1, sprawia, że ​​chcę trzymać się z dala od FFP z powodu wycofania. Ale jestem zdezorientowany, jak to wszystko działa w wersji 3.1 i wyżej. W wersji 2.1 i poniżej masz glBegin (GL_WHATEVER) i glEnd() kiedy rysujesz kształty. Pierwszą rzeczą, którą zauważyłem podczas przeglądania interfejsu API podstawowego profilu, jest to, że te dwa wywołania funkcji zniknęły. Zdaję sobie sprawę, że najprawdopodobniej jest to prosty zamiennik, ale jest to dość szokujące, gdy widzę coś tak (na pozór użytecznego) wyjęte z tak podstawowego zadania. Wydaje się prawie, że zdejmowanie printf() ze standardowej biblioteki c. A kiedy pracuję nad najnowszą Czerwoną Księgą, nadal używają starego, przestarzałego kodu, który jeszcze bardziej mąci moje myślenie.

Podczas czytania różnych odpowiedzi na podobne pytania widzę typowy "oparta na shaderze" lub "wszystko jest zrobione z shaderem" itp. Jeśli chcę narysować prosty biały kwadrat na czarnym tle (pierwszy przykład w najnowsza Czerwona Księga), nie rozumiem, w jaki sposób shader ma znaczenie przy rysowaniu pudełka. Czy nie powinni ... cóż ... zacieniować? Szukałem już Orange Book i Blue Book, ale nie chcę już wydawać pieniędzy na coś, co ukryje wszystko za biblioteką (Blue Book) lub czymś, co będzie mówić o programowaniu shadera wykonać pewne zadanie oświetleniowe w środowisku 3D (Pomarańczowa książka).

Więc od czego zacząć? Jak narysować pudełko (lub sześcian lub piramidę lub coś podobnego), używając tylko podstawowego profilu. Nie proszę o fragment kodu tutaj, szukam ekspansywnego samouczka lub książki lub czegoś, na co ktoś mógłby mnie wskazać. Jeśli odpowiedź na to pytanie została poprzedzona i nie znalazłem, proszę przekierować mnie.

+4

Chciałbym poradzić ci, abyś wybrał dobrą "książkę" na temat nowoczesnego OpenGL. Moim pierwszym zaleceniem byłby http://www.arcsynthesis.org/gltut/, który jest dostępny online i za darmo. To powinno ci na początek wystarczyć. – Bart

+1

Możesz użyć programowanego potoku w wersji 2.0. Naprawiono funkcję jest brzydka i nieskuteczna, niezależnie od wersji. –

+0

@CatPlusPlus To jest PIERWSZY czas, o którym słyszałem, że ktokolwiek odsyła do rurociągu o ustalonej funkcji jako nieefektywnego. :) Możesz chcieć ponownie rozważyć to słowo.Crappy - Zgadzam się. – Ani

Odpowiedz

11

Powodem nagłej "złożoności" w profilu podstawowym jest fakt, że trasa ustalonej funkcjonalności nie była reprezentatywna dla tego, co GPU faktycznie robi dla ciebie. Znaczna część funkcjonalności została wykonana na procesorze i tylko rzeczywisty rysunek wydarzył się na GPU. Innym problemem ze stacjonarnym potokiem jest to, że przegrywa. Stały rurociąg ma bardzo dużo gałek i przełączników! Więc nie tylko jest już boleśnie skomplikowana, nigdy nie nadąży za niekończącym się żądaniem nowych sposobów rysowania scen. Wprowadź GLSL, a będziesz miał możliwość poinformowania GPU o tym, jak chcesz narysować swoją scenę. Przenosi to moc na programistę i uwalnia wszystkich od konieczności czekania na aktualizacje OpenGL dla nowych przełączników/gałek.

Teraz, jeśli chodzi o frustrację związaną z nagłą utratą glBegin i glEnd ... istnieją proste struktury, które naśladują ich zachowanie na nowym profilu podstawowym i to jest dobre. Ponownie, przenosi to na deweloperów, aby mogli wybrać sposób, w jaki zbliżają się do potoku. Jednak nie ma nic złego w ćwiczeniu 3D na FFP. Najpierw musisz nauczyć się matematyki 3D i koncepcji. Te pojęcia obowiązują niezależnie od API. (Matrix matematyka uratuje ci życie zarówno w OpenGL, jak i Direct3D.) Najpierw ćwicz z prostymi trójkątami i kolorami. Następnie przenosimy się na tekstury (ze współrzędnymi tekstury). Następnie dodajesz normalne (z oświetleniem). Następnie, po zrozumieniu wszystkich tych pojęć, przestajesz używać glBegin/glEnd i zaczynasz grupować duże ilości danych werteksów w bufory. Nie zrozumiesz glDrawElements, jeśli nie zrozumiesz glBegin/glEnd. Tak więc, można uczyć się na tych narzędziach.

+0

Zgadzam się, myślę, że droga do przejścia jest odczytywana w pierwszej redakcji książki (1993 myślę), a następnie wskocz do najnowszej pomarańczowej książki, czy jakkolwiek gorąca jest 2015 rok ... dobrze się uczyć podstaw od czasu, gdy opengl miał tylko 120 funkcji. –

+0

Dziękuję za to; to jedna z najlepszych odpowiedzi, jakie kiedykolwiek widziałem. Przez długi czas szczerze zastanawiałem się, jak wydaje się, że cała społeczność OpenGL straciła rozum: wszyscy bezmyślnie powtarzają mantrę "ustalony rurociąg był zły, nie powinieneś go używać", jednocześnie opowiadając się za znacznie bardziej skomplikowaną alternatywą z niewiarygodnie stroma krzywa uczenia się i absolutnie żadna widoczna przewaga dla zdecydowanej większości użytkowników. Jest to pierwsza rzecz, jaką kiedykolwiek przeczytałem, która daje wgląd w to, co może być problematyczne w przypadku ustalonego rurociągu, i daje jasny i zdrowy ogólny obraz. –

+0

Nie ma za co. Cieszę się, że mogłem pomóc. – TheBuzzSaw