JOGL - Szybki przewodnik

Ten rozdział przedstawia OpenGL, jego funkcje, powiązania OpenGL w java (GL4java, LWJGL, JOGL) oraz zalety JOGL nad innymi powiązaniami OpenGL.

Java wiązanie dla OdługopisGL(JOGL) to najnowsze powiązanie interfejsu API grafiki OpenGL w Javie. Jest to biblioteka opakowująca, która ma dostęp do API OpenGL i jest przeznaczona do tworzenia aplikacji graficznych 2D i 3D zakodowanych w Javie. JOGL to biblioteka open source, początkowo opracowana przez byłych absolwentów MIT, Kena Russella i Chrisa Kline'a. Później został przyjęty przez grupę gamingową w Sun Microsystems, a teraz jest obsługiwany przez Javę w dziale Graphics Audio and Processing (JOGAMP). JOGL działa w różnych systemach operacyjnych, takich jak Windows, Solaris, Mac OS X i Linux (na x86).

Co to jest OpenGL?

OpenGL oznacza Open Graphics Library, która jest zbiorem poleceń do tworzenia grafiki 2D i 3D. Dzięki OpenGL możesz tworzyć skomplikowane kształty 3D przy użyciu bardzo podstawowych elementów, takich jak punkty, linie, wielokąty, mapy bitowe i obrazy.

Oto kilka funkcji OpenGL -

  • Może działać na wielu platformach.

  • Ma powiązania w kilku językach, takich jak C ++, Python itp

  • Może renderować grafikę wektorową 2D i 3D.

  • Współdziała z graficzną jednostką przetwarzania (GPU) w celu uzyskania szybkiego renderowania o wysokiej jakości. Renderowanie to proces tworzenia obrazu z modelu 2D lub 3D.

  • Jest to branżowy standard API do pisania aplikacji grafiki 3D. Na przykład gry, wygaszacze ekranu itp.

  • Zawiera około 150 poleceń, których programiści mogą używać do określania obiektów i operacji w celu tworzenia aplikacji.

  • Zawiera bibliotekę narzędzi OpenGL (GLU), która zapewnia różne funkcje modelowania, takie jak powierzchnie kwadratowe i krzywe NURBS. GLU to standardowy składnik OpenGL.

  • Projekt OpenGL koncentruje się na wydajności, skuteczności i jego implementacji na wielu platformach przy użyciu wielu języków. Aby zachować prostotę API OpenGL, zadania okienkowania nie są uwzględniane.

Dlatego OpenGL zależy od innych języków programowania w zadaniach okienkowych.

Powiązanie Java dla OpenGL API

Jest to specyfikacja API Java Specification Request (JSR), która umożliwia korzystanie z OpenGL na platformie Java.

Specyfikacje Detale
JSR 231 Ten pakiet powiązań Java obsługuje platformę Java SE.
JSR 239 Ten pakiet powiązań Java obsługuje platformę Java ME.

W Javie istnieją różne powiązania OpenGL. Omówiono je poniżej

GL4java

Jest znany jako OpenGL dla technologii Java. Zawiera łącza do OpenGL 1.3 i prawie wszystkich rozszerzeń dostawców. Może być również używany z Abstract Window Toolkit (AWT) i Swings. Jest to powiązanie OpenGL skupione na grze, które jest pojedynczym oknem wyświetlającym aplikacje pełnoekranowe.

LWJGL

  • Lekka biblioteka gier Java (LWJGL), używa OpenGL 1.5 i współpracuje z najnowszą wersją java.

  • Może wykorzystywać pełnoekranowe możliwości JSE 1.4. Ma ograniczone wsparcie dla AWT / Swings.

  • Nadaje się do lekkich urządzeń, takich jak telefony komórkowe, urządzenia wbudowane itp.

JOGL

  • JOGL skupia się tylko na renderowaniu 2D i 3D. Interfejsy obsługujące dźwięk i wejścia-wyjścia nie są zawarte w JOGL.

  • Zawiera bibliotekę narzędzi graficznych (GLU), zestaw narzędzi GLUT (GLUT) i własne API - Native Windowing Toolkit (NEWT).

Dlaczego JOGL?

  • Zapewnia pełny dostęp do API OpenGL (wersja 1.0, 4.3, ES 1, ES 2 i ES 3), jak również prawie do wszystkich rozszerzeń dostawców. Dlatego wszystkie funkcje OpenGL są zawarte w JOGL.

  • JOGL integruje się z AWT, Swing i Standard Widget Toolkit (SWT). Zawiera również własny Native Windowing Toolkit (NEWT). W związku z tym zapewnia pełne wsparcie dla okienkowania.

Historia JOGL

  • 1992 - Silicon Graphics Inc. wydała pierwszą specyfikację OpenGL.

  • 2003 - Uruchomiono witrynę Java.net z nowymi funkcjami, a JOGL został opublikowany po raz pierwszy w tej samej witrynie.

  • 2010 - Od 2010 roku jest niezależnym projektem open source na licencji BSD, czyli liberalnej licencji na oprogramowanie komputerowe.

W tym rozdziale omówiono konfigurowanie środowiska do korzystania z JOGL w systemie przy użyciu różnych zintegrowanych środowisk programistycznych (IDE).

Instalowanie JOGL

Aby zainstalować JOGL, musisz mieć następujące wymagania systemowe -

wymagania systemowe

Pierwszym wymaganiem jest zainstalowanie zestawu Java Development Kit (JDK) na komputerze.

Wymaganie Opis
Wersja JDK 1.4 lub nowszy
Pamięć brak wymagań minimalnych
Miejsca na dysku brak wymagań minimalnych
System operacyjny brak wymagań minimalnych

Aby rozpocząć tworzenie aplikacji JOGL, należy wykonać podane czynności, aby skonfigurować środowisko -

Krok 1 - Weryfikacja instalacji Java na Twoim komputerze

Otwórz konsolę swojego systemu i wykonaj następujące polecenie java -

Platforma ZADANIE KOMENDA
Windows Otwórz konsolę poleceń C: \> wersja java
Linux Otwórz terminal poleceń $ java -version
PROCHOWIEC Otwórz Terminal Maszyna: ~ joseph $ java -version

Sprawdź dane wyjściowe w odpowiednim systemie operacyjnym.

Platforma Wynik
Windows

Java “1.6.0.21”

java (TM) SE Runtime Environment (build 1..6.0_21-b07) Java HotSpot (TM) Client VM (build 17.0-b7, tryb mieszany, udostępnianie)

Linux

Java “1.6.0.21”

java (TM) SE Runtime Environment (build 1..6.0_21-b07) Java HotSpot (TM) Client VM (build 17.0-b7, tryb mieszany, udostępnianie)

PROCHOWIEC

Java “1.6.0.21”

java (TM) SE Runtime Environment (build 1..6.0_21-b07) Java HotSpot (TM) Client VM (build 17.0-b7, tryb mieszany, udostępnianie)

Krok 2 - Konfiguracja Java Development Kit (JDK)

Jeśli Java nie jest zainstalowana na twoim komputerze, musisz zainstalować Java SDK z serwisu WWW Oracle : Oracle . Możesz znaleźć instrukcje dotyczące instalacji JDK z pobranych plików. Musisz postępować zgodnie z podanymi instrukcjami, aby zainstalować i skonfigurować konfigurację. Na koniec ustaw zmienne środowiskowe PATH i JAVA_HOME, aby odnosiły się do katalogu zawierającego pliki java.exe i javac.exe, zazwyczaj odpowiednio katalog_instalacyjny_java / bin i katalog_instalacyjny_java.

Zestaw Java-home zmienna środowiskowa wskazująca lokalizację katalogu podstawowego w tej samej ścieżce, w której na komputerze jest zainstalowana Java.

Platforma Komenda
Windows Ustaw zmienną środowiskową JAVA_HOME na C: \ ProgramFiles \ Java \ Jdk1.6.0_21
Linux Eksportuj JAVA_HOME = / usr / local / java-current
PROCHOWIEC Eksportuj JAVA_HOME = / Library / Java / Home

Dołącz lokalizację kompilatora Java do ścieżki systemowej w następujący sposób -

Platforma Komenda
Windows Dołącz ciąg;% JAVA_HOME% bin na końcu zmiennej systemowej i ścieżki
Linux ŚCIEŻKA eksportu = $ ŚCIEŻKA: $ JAVA_HOME / bin /
PROCHOWIEC Nie wymagane

Krok 3 - Pobieranie JOGL

  • Najnowszą wersję JOGL można pobrać ze strony internetowej www.jogamp.org

  • Przejdź do strony głównej www.jogamp.org

  • Kliknij Kompilacje / Pobrane> Bieżące (zip).

Spowoduje to przejście do listy plików .jar dla wszystkich interfejsów API obsługiwanych przez witrynę internetową.

  • Pobierz plik biblioteki .jar jogamp-all-platforms.7z, dokumentacje java dla natywnej biblioteki OpenGL glugen-javadoc.7zi JOGL jogl-javadocs.7z.

  • Rozpakuj pobrane pliki .jar za pomocą dowolnego oprogramowania do rozpakowywania plików ZIP.

Po otwarciu wyodrębnionego folderu znajdziesz folder jar, kody źródłowe i inne pliki.

Zdobądź kody źródłowe gluegen-java-src.zip i jogl-java-src.zipdo obsługi IDE. To jest opcjonalne.

  • W folderze jar znajduje się wiele plików .jar. Ta kolekcja plików należy do firm Glugen i JOGL.

  • JOAMP zapewnia natywne biblioteki obsługujące różne systemy operacyjne, takie jak Windows, Solaris, Linux i Android. Dlatego musisz wziąć odpowiednie pliki jar, które można uruchomić na wybranej platformie. Na przykład, jeśli używasz 64-bitowego systemu operacyjnego Windows, pobierz następujące pliki .jar z folderu jar -

    • gluegenrt.jar
    • jogl-all.jar
    • gluegen-rt-natives-windows-amd64.jar
    • jogl-all-natives-windowsamd64.jar

Konfiguracja JOGL dla Eclipse 4.4

Postępuj zgodnie z podaną procedurą konfigurowania JOGL -

Dodawanie bibliotek

Step 1 - Otwórz Eclipse.

Step 2 - Utwórz nowy projekt.

Step 3- Utwórz nowy folder o nazwie lib w folderze projektu.

Step 4- Skopiuj pliki gluegen-rt-natives-windows-amd64.jar, gluegenrt.jar, jogl-all-natives-windowsamd64.jar ijogl-all.jardo folderu lib .

Step 5- Teraz wybierz te pliki i kliknij prawym przyciskiem myszy. Zostanie wyświetlone menu skrótów zawierające plikiBuild Path > Add to Build Path.

Step 6- Aby udostępnić wszystkie pliki .jar innym projektom, przejdź do menu głównego. Wybierz polecenie Okno> Preferencje. Zostanie wyświetlone okno Preferencje.

  • W oknie preferencji, w rozwijanym menu po lewej stronie, postępuj zgodnie z hierarchią - Java → Build Path → User Libraries.

  • Kliknij przycisk „Nowy…”.

  • Otwiera okno dialogowe. Wprowadź nazwę biblioteki jako jogl2.1.

  • Dodaj pliki jar glugen-rt.jar i jogl-all.jar używając przycisku „Dodaj zewnętrzne pliki JAR…”.

  • Tworzy nową bibliotekę użytkownika o nazwie jogl2.1.

W ten sam sposób możemy dodać dokumentację java i kod źródłowy dla plików added.jar.

Dodawanie bibliotek natywnych

Step 1 - Rozwiń węzeł jogl-all.jar, wybierz lokalizację Javadoc (brak).

Step 2- Kliknij przycisk „Nowy…”. Wprowadź nazwę dokumentu JOGL Java.

Step 3 - Kliknij przycisk „Dodaj zewnętrzne pliki JAR…”.

Step 4 - Otwiera okno dialogowe, w którym należy wybrać lokalizację dokumentacji JOGL Java, którą wcześniej pobraliśmy.

Dodawanie kodu źródłowego

Step 1 - Wybierz lokalizację biblioteki natywnej węzła: (Brak).

Step 2 - Kliknij przycisk „Nowy…”.

Step 3 - Wprowadź nazwę dla natywnych bibliotek i kliknij przycisk „OK”.

Step 4 - Kliknij przycisk „Dodaj zewnętrzne pliki JAR…”.

Step 5- Teraz wybierz ścieżkę, w której znajdują się natywne pliki bibliotek („gluegen-rt-natives-windows-amd64.jar i joglall-natives-windows-amd64.jar”) .

Step 6 - Powtórz tę samą procedurę dla kodu źródłowego.

Step 7 - Możemy ustawić lokalizacje dla Javadoc, kodu źródłowego i plików jar w taki sam sposób, jak podano powyżej dla obu natywnych plików bibliotek glegen-rt.jar i glugen-natives-windows-amd64.jar.

Konfiguracja JOGL dla NetBeans 4.4

Przejdźmy przez kroki konfiguracji JOGL dla NetBeans 4.4 -

Dodawanie bibliotek

Step 1 - W menu głównym wybierz Tools > Libraries.

Step 2 - Prowadzi cię do Ant Library Manager.

Step 3 - Pod Classpath kliknij New Libraryprzycisk znajdujący się w lewym dolnym rogu. Otwiera małe okno dialogowe.

Step 4 - Wpisz nazwę biblioteki jako JoGl2.0.

Step 5 - Kliknij przycisk „OK”.

Step 6 - Kliknij przycisk „Dodaj JAR / Folder…”.

Step 7 - Wybierz ścieżkę, w której znajdują się pliki .jar jogl.all.jar i gluegen-rt.jar są położone.

Aby dołączyć bibliotekę JOGL do każdego projektu, wykonaj kroki podane poniżej -

Step 1 - Kliknij prawym przyciskiem myszy plik project name. Pokazuje menu skrótów.

Step 2 - Wybierz Properties. Otwiera okno o nazwie Project properties.

Step 3 - Wybierz Libraries z kategorii po lewej stronie.

Step 4 - Wybierz Compile tabi kliknij przycisk „Dodaj bibliotekę…”. Pojawi się okno dialogowe Dodaj bibliotekę.

Step 5 - Teraz dodaj bibliotekę JOGL2.0, którą stworzyłeś wcześniej.

W tym natywna biblioteka w każdym projekcie

Wykonaj podane kroki, aby uwzględnić bibliotekę natywną w każdym projekcie -

Step 1 - Kliknij projekt prawym przyciskiem myszy.

Step 2 - Wybierz Set Configuration > Customize…

Prowadzi do Project Properties okno.

Step 3 - Po prawej stronie, w VM options, kliknij przycisk „Dostosuj”.

Step 4 - Wyszukaj ścieżkę zawierającą natywne biblioteki JOGL gluegen-rtnatives-windows-amd64.jar'' i 'jogl-all-natives-windowsamd64.jar.

Dodawanie dokumentacji Java natywnych bibliotek

Musisz ponownie otworzyć menedżera biblioteki Ant, aby udostępnić źródła i Javadoc dla każdego projektu. Postępuj zgodnie z podaną procedurą -

Step 1 - Otwórz main menu.

Step 2 - Wybierz Tools > Libraries. To prowadzi cię doLibrary manager.

Step 3 - Pod JavaDoc kliknij przycisk „Nowa biblioteka…”.

Step 4 - Wejdź JOGLJavadocNazwa. (Możesz wprowadzić dowolną nazwę.)

Step 5 - Kliknij przycisk „Dodaj słoiki / biblioteki…”.

Step 6 - Wybierz ścieżkę, w której rozpakowano JOGL documentation kod jest zlokalizowany.

Dodawanie kodu źródłowego bibliotek natywnych

Step 1 - Pod Sourceskliknij przycisk „Nowa biblioteka…”. WchodzićJOGLsources Nazwa.

Step 2- Kliknij przycisk „Dodaj słoiki / biblioteki…”. Wybierz ścieżkę, w której znajduje się rozpakowany kod źródłowy.

Dostosowywanie edytora JDK

Step 1 - Ustaw Classpath dla plików jogl.all.jar i gluegen-rt.jar.

Step 2- Ustaw ścieżkę do natywnych bibliotek gluegen-rt-natives-windows-amd64.jar i joglall-natives-windowsamd64.jar lub skopiuj wszystkie pliki jar z folderu, do którego je pobrałeś i wklej je dojse lib teczka.

Za pomocą programowania JOGL można rysować różne kształty graficzne, takie jak linie proste, trójkąty, kształty 3D łącznie z efektami specjalnymi, takimi jak obrót, oświetlenie, kolory itp. Aby rysować obiekty w JOGL przede wszystkim musimy skonstruować podstawową ramkę JOGL . Poniżej podane są klasy wymagane do skonstruowania ramy podstawowej.

Interfejs GLEventListener

Aby Twój program mógł korzystać z graficznego interfejsu API JOGL, musisz go zaimplementować GLEventListenerberło. Możesz znaleźćGLEventListener interfejs w javax.media.opengl pakiet.

Poniższa tabela zawiera szczegółowe informacje na temat różnych metod i opisów GLEventListener interfejs -

Sr.No. Metody i opisy
1

Void display(GLAutoDrawable drawable)

Jest wywoływana przez obiekt interfejsu GLAutoDrawable w celu zainicjowania renderowania OpenGL przez klienta. tj. ta metoda zawiera logikę używaną do rysowania elementów graficznych przy użyciu interfejsu API OpenGL.

2

Void dispose(GLAutoDrawable drawable)

Ta metoda sygnalizuje odbiornikowi, aby zwolnił wszystkie zasoby OpenGL dla każdego GLContext, takie jak bufory pamięci i programy GLSL.

3

Void init(GLAutoDrawble drawable)

Jest wywoływana przez obiekt interfejsu GLAutoDrawable natychmiast po zainicjowaniu kontekstu OpenGL.

4

Void reshape(GLAutoDrawble drawble, int x, int y, int width, int height)

Jest wywoływana przez obiekt interfejsu GLAutoDrawable podczas pierwszego ponownego malowania po zmianie rozmiaru komponentu. Jest również wywoływana za każdym razem, gdy zmieni się położenie komponentu w oknie.

Wszystkie metody GLEventListener wymagają przedmiotu GLAutoDrawable interfejs jako parametr.

GLAutoDrawable Interface

Ten interfejs udostępnia mechanizm oparty na zdarzeniach (GLEventListener) do renderowania OpenGL. GLAutoDrawable automatycznie tworzy główny kontekst renderowania, z którym jest skojarzony GLAutoDrawable przez cały okres użytkowania obiektu.

Poniższa tabela zawiera szczegółowe informacje na temat różnych metod i opisów GLAutoDrawable interfejs -

Sr.No Metody i opisy
1

GL getGL()

Zwraca obiekt potoku GL, który jest używany przez bieżący obiekt interfejsu GLAutoDrawable.

2

void addGLEventListener(GLEventListener Listener)

Dodaje podany detektor na koniec bieżącej kolejki do rysowania.

3

void addGLEventListener(int index, GLEventListener listener)

Dodaje podany detektor w podanym indeksie tej kolejki rysunkowej.

4

void destroy()

Destroys wszystkie zasoby związane z tym obiektem interfejsu GLAutoDrawable, w tym GLContext.

Note- W tym pakiecie są inne metody. W tym interfejsie omówiono tylko kilka ważnych metod dotyczących szablonu.

Klasa GLCanvas

GLCanvas i GLJpanel to dwie główne klasy interfejsu GUI JOGL, które implementują GLAutoDrawable interfejs, który można wykorzystać jako powierzchnie rysowania dla poleceń OpenGL.

GLCanvas to ciężki składnik AWT, który zapewnia obsługę renderowania OpenGL. To jest podstawowa implementacjaAWTAutoGLDrawableberło. Dziedziczy równieżjava.awt.Canvasklasa. Ponieważ jest to element ciężki, w niektórych przypadkachGLJCanvasmoże nie zintegrować się prawidłowo z elementem swing. Dlatego należy zachować ostrożność podczas używania go z Swing. Zawsze, gdy masz problemy zGLJCanvas, musisz użyć GLJPanel klasa.

Hierarchiczny diagram klasy GLCanvas może być jak pokazano poniżej -

  • GLEventistener interfejs współpracuje z GLCanvasklasa. Reaguje na zmiany wGLCanvas klasa i do zgłoszonych przez nich żądań rysowania.

  • Kiedy tylko GLCanvas jest tworzona instancja klasy init() metoda GLEventListenerjest wywoływana. Możesz przesłonić tę metodę, aby zainicjować stan OpenGL.

  • Kiedy tylko GLCanvas jest rysowany początkowo (utworzony) lub zmieniony rozmiar, reshape() metoda GLEventListenerjest wykonywany. Służy do inicjalizacji rzutni OpenGL i macierzy projekcji. Jest również wywoływana za każdym razem, gdy zmienia się lokalizacja komponentu.

  • Metoda display () GLEventListenerzawiera kod do renderowania sceny 3D. Jest wywoływana za każdym razem, gdy metoda display ()GLCanvas jest wywoływana.

Poniżej podano konstruktory wymagane do utworzenia instancji klasy GLCanvas.

Sr.No Konstruktor i opis
1

GLCanvas()

Tworzy nowy komponent GLCanvas z domyślnym zestawem możliwości OpenGL, używając domyślnego mechanizmu wyboru możliwości OpenGL, na domyślnym urządzeniu ekranowym.

2

GLCanvas(GLCapabilitiesImmutable)

Tworzy nowy komponent GLCanvas z żądanym zestawem możliwości OpenGL przy użyciu domyślnego mechanizmu wyboru możliwości OpenGL na domyślnym urządzeniu ekranowym.

Poniżej podane są metody używane do obsługi zdarzeń klasy GLCanvas.

Sr. No. Metody i opis
1

void addGLEventListener(GLEventListener listener)

Dodaje podany detektor na końcu tej kolejki do rysowania.

2

void addGLEventListener(int indexGLEventListener listener)

Dodaje podany detektor w podanym indeksie tej kolejki rysunkowej.

Aby utworzyć wystąpienie GLCanvas klasa, potrzebujesz obiektu GLCapabilitiesImmutable interfejs, który określa niezmienny zestaw możliwości OpenGL.

Jeden ze sposobów na zdobycie przedmiotu CapabilitiesImmutable interfejs jest do utworzenia wystąpienia GLCapabilitiesklasa, która implementuje interfejs. WystąpienieGLCapabilities klasa może służyć do tego celu.

Klasa GLCapabilities

Ta klasa określa zestaw możliwości OpenGL. Jako parametr przyjmuje obiekt GLCapabilities. PlikGLCapabilities class opisuje pożądane możliwości, które musi obsługiwać kontekst renderowania, taki jak profil OpenGL.

Poniżej podany jest konstruktor do tworzenia instancji klasy GLCapabilities

Sr. No. Metody i opis
1

GLCapabilities(GLProfile glprofile)

Tworzy obiekt GLCapabilities.

Aby utworzyć wystąpienie GLCanvas class, potrzebujesz obiektu interfejsu GLCapabilitiesImmutable, który określa niezmienny zestaw możliwości OpenGL.

Jeden ze sposobów na zdobycie przedmiotu CapabilitiesImmutable interfejs jest do utworzenia wystąpienia GLCapabilitiesklasa, która implementuje interfejs. WystąpienieGLCapabilities klasa może służyć do tego celu.

Plik GLCapabilities klasa z kolei wymaga GLProfile obiekt.

Klasa GLProfile

Ponieważ wydano kilka wersji API OpenGL; musisz określić dokładną wersję API OpenGL używanego w programie w wirtualnej maszynie Java (JVM). Odbywa się to za pomocąGLProfile klasa.

Plik get() metoda tej klasy akceptuje różne predefiniowane Stringobiekty jako parametry. Każdy obiekt String to nazwa interfejsu, a każdy interfejs obsługuje określone wersje OpenGL. Jeśli zainicjujesz tę klasę jako statyczną i pojedynczą, otrzymasz singletonGLProfile obiekty dla każdego dostępnego profilu JOGL.

Poniżej podano prototyp metody get z klasy GLProfile.

Sr.No. Metoda i opis
1

Static GLProfile get(String profile)

Używa domyślnego urządzenia.

Ponieważ jest to metoda statyczna, należy ją wywołać przy użyciu nazwy klasy i wymaga ona wstępnie zdefiniowanej statycznej zmiennej łańcuchowej jako parametru. W tej klasie jest 12 takich zmiennych, każda reprezentuje indywidualną implementację interfejsu GL.

GLProfile.get(GLProfile.GL2);

Parametry metody get ()

Sr.No Predefiniowana wartość ciągu (nazwa interfejsu) i opis
1

GL2

Ten interfejs zawiera wszystkie metody OpenGL [1.0… 3.0], a także większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

2

GLES1

Ten interfejs zawiera wszystkie metody OpenGL ES [1.0 ... 1.1], a także większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

3

GLES2

Ten interfejs zawiera wszystkie metody OpenGL ES 2.0, a także większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

4

GLES3

Ten interfejs zawiera wszystkie metody OpenGL ES 3.0, a także większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

5

GL2ES1

Ten interfejs zawiera wspólny podzbiór GL2 i GLES1.

6

GL2ES2

Ten interfejs zawiera wspólny podzbiór GL3, GL2 i GLES2.

7

GL2GL3

Ten interfejs zawiera wspólny podzbiór core GL3 (OpenGL 3.1+) i GL2.

8

GL3

Ten interfejs zawiera wszystkie podstawowe metody OpenGL [3.1 ... 3.3] , jak również większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

9

GL3bc

Ten interfejs zawiera wszystkie metody zgodności OpenGL [3.1 ... 3.3] , a także większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

10

GL3ES3

Ten interfejs zawiera wspólny podzbiór core GL3 (OpenGL 3.1+) i GLES3 (OpenGL ES 3.0).

11

GL4

Ten interfejs zawiera wszystkie podstawowe metody OpenGL [4.0 ... 4.3] , jak również większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

12

GL4bc

Ten interfejs zawiera wszystkie profile zgodności OpenGL [4.0 ... 4.3] , jak również większość jego rozszerzeń zdefiniowanych w czasie tej specyfikacji.

13

GL4ES3

Interfejs zawierający wspólny podzbiór core GL4 (OpenGL 4.0+) i GLES3 (OpenGL ES 3.0).

Klasa GLJPanel

Jest to lekki komponent Swing, który zapewnia obsługę renderowania OpenGL. Zapewnia kompatybilność z Swing.

Hierarchia klas GLJPanel

Poniższy diagram przedstawia hierarchię klas GLJPanel.

Poniżej podane są różne konstruktory klasy GLJPanel.

Sr. No. Konstruktorzy i opis
1

GJPanel()

Tworzy nowy komponent GLJPanel z domyślnym zestawem możliwości OpenGL.

2

(GLCapabilitiesImmutable)

Tworzy nowy komponent GLJPanel z żądanym zestawem możliwości OpenGL.

3

GLJPanel(GLCapabilitiesImmutable userCapsRequest, GLCapabilitiesChooser chooser)

Tworzy nowy komponent GLJPanel.

Poniżej podane są metody klasy GLJPanel.

Sr.No. Metody i opis
1

void addGLEventListener(GLEventListener listener)

Ta metoda dodaje podany detektor na końcu tej kolejki do rysowania.

2

void addGLEventListener(int indexGLEventListener listener)

Ta metoda dodaje podany detektor pod podanym indeksem tej kolejki rysunkowej.

W tym rozdziale wyjaśniono, jak narysować podstawową ramkę JOGL za pomocą Canvas z ramką AWT. Tutaj skonstruujemy ramkę AWT i dodamy obiekt płótna do ramki AWT za pomocąadd() metoda klasy ramek.

Poniżej podano kroki, jakie należy wykonać, aby napisać program, który tworzy podstawową ramkę JOGL z kombinacją klasy JOGL Canvas i klasy Frame AWT.

Krok 1: Tworzenie klasy

Najpierw utwórz klasę, która implementuje GlEventListenerinterfejs i zaimportuj pakiet javax.media.opengl. Zastosuj wszystkie cztery metodydisplay(), dispose(), reshape(), init().Ponieważ jest to podstawowa rama, omówiono prymitywne zadania, takie jak tworzenie klasy canvas, dodawanie jej do ramki. WszystkieGLEVentListener metody interfejsu nie zostały zaimplementowane.

Krok 2: Przygotowanie płótna

(a) Konstruowanie GLCanvas obiekt klasy

final GLCanvas glcanvas = new GLCanvas( xxxxxxx );

//here capabilities obj should be passed as parameter

(b) Tworzenie wystąpienia GLCapabilities klasa

GLCapabilities capabilities = new GLCapabilities( xxxxx );

//here profile obj should be passed as parameter

(c) Generowanie GLProfile obiekt

Ponieważ jest to metoda statyczna, jest wywoływana przy użyciu nazwy klasy. Ponieważ ten samouczek dotyczy JOGL2, wygenerujmy obiekt interfejsu GL2.

final GLProfile profile = GLProfile.get( GLProfile.GL2 );

// both, variable and method are static hence both are called using class name.

Zobaczmy fragment kodu dla kanwy.

//getting the capabilities object of GL2 profile

final GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);

// The canvas
final GLCanvas glcanvas = new GLCanvas(capabilities);

(d) Teraz dodaj GLEventListener do płótna za pomocą metody addGLEventListener(). Ta metoda wymaga obiektuGLEventListenerinterfejs jako parametr. W związku z tym przekaż obiekt klasy, która implementujeGLEventListener.

BasicFrame basicframe = newBasic Frame( );// class which implements
GLEventListener interface
glcanvas.addGLEventListener( basicframe );

(e) Ustaw rozmiar ramki za pomocą metody setSize () odziedziczonej przez GLCanvas z javax.media.opengl.awt.AWTGLAutoDrawable.

glcanvas.setSize( 400, 400 );

Teraz jesteś gotowy GLCanvas.

Krok 3: Tworzenie ramy

Utwórz ramkę, tworząc wystąpienie Frame class Obiekt komponentu ramki JSE AWT.

Dodaj do niego płótno i spraw, aby ramka była widoczna.

//creating frame
final Frame frame = new frame( " Basic Frame" );

//adding canvas to frame
frame.add( glcanvas );
frame.setVisible( true );

Krok 4: Oglądanie ramki na pełnym ekranie

Aby wyświetlić ramkę na pełnym ekranie, ustaw domyślny rozmiar ekranu za pomocą java.awt.Toolkitklasa. Teraz, używając tych domyślnych wymiarów ekranu, ustaw rozmiar klatki za pomocąsetSize() metoda.

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize(screenSize.width, screenSize.height);

Przejdźmy przez program, aby wygenerować podstawową ramkę za pomocą AWT -

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class BasicFrame implements GLEventListener {

   @Override
   public void display(GLAutoDrawable arg0) {
      // method body
   }
	
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
	
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
	
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }
	
   public static void main(String[] args) {
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
        
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      BasicFrame b = new BasicFrame();
      glcanvas.addGLEventListener(b);        
      glcanvas.setSize(400, 400);
        
      //creating frame
      final Frame frame = new Frame (" Basic Frame");
        
      //adding canvas to frame
      frame.add(glcanvas);
      frame.setSize( 640, 480 );
      frame.setVisible(true);
   }
	
}

Jeśli kompilujesz i wykonujesz powyższy program, generowany jest następujący wynik. Pokazuje podstawową ramkę utworzoną podczas używaniaGLCanvas klasa z AWT -

W tym rozdziale wyjaśniono, jak narysować podstawową ramkę JOGL za pomocą Canvas, i JFrameklasa pakietu javax.swing. W tym miejscu utworzymy instancję JFrame i dodamy obiekt kanwy do instancji JFrame przy użyciuadd() metoda.

Używanie Canvas z AWT daje graficzną ramkę z ciężkimi funkcjami. Aby mieć lekką ramkę graficzną, musisz użyćGLCanvasz huśtawką. Podczas używaniaGLCanvas z huśtawką możesz umieścić GLCanvas w JFrame okno bezpośrednio lub możesz je dodać do JPanel.

Poniżej podany jest program, który tworzy podstawową ramkę JOGL z kombinacją JOGL GLCanvas klasa i JFrameklasa pakietu javax.swing .

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class BasicFrame implements GLEventListener {

   @Override
   public void display(GLAutoDrawable arg0) {
      // method body
   }
	
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
	
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   } 
	
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }
	
   public static void main(String[] args) {
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
               
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      BasicFrame b = new BasicFrame();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);
		
      //creating frame
      final JFrame frame = new JFrame (" Basic Frame");
		
      //adding canvas to it
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
      
   }//end of main
	
}//end of classimport

Jeśli kompilujesz i wykonujesz powyższy program, generowany jest następujący wynik. Pokazuje podstawową ramkę utworzoną podczas używaniaGLCanvas z oknem obrotowym.

W tym rozdziale wyjaśniono, jak narysować podstawową ramkę JOGL przy użyciu klasy GLJpanel. Jest to lekki komponent Swing, który zapewnia obsługę renderowania OpenGL. Zapewnia kompatybilność z Swing. W tym miejscu utworzymy instancję JFrame i dodamy obiekt GLJpanel do instancji JFrame przy użyciuadd() metoda.

Poniższy program generuje ramkę podstawową przy użyciu GLJPanel z oknem uchylnym -

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class BasicFrame implements GLEventListener {

   @Override
   public void display(GLAutoDrawable arg0) {
      // method body
   }
   
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
   
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }
   
   public static void main(String[] args) {
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
      
      // The GLJpanel class
      GLJPanel gljpanel = new GLJPanel( glcapabilities ); 
      BasicFrame b = new BasicFrame();
      gljpanel.addGLEventListener(b);
      gljpanel.setSize(400, 400);
      
      //creating frame
      final JFrame frame = new JFrame (" Basic Frame");
      
      //adding canvas to it
      frame.getContentPane().add( gljpanel);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
      
   }//end of main
	
}//end of classimport

Jeśli kompilujesz i wykonujesz powyższy program, generowany jest następujący wynik. Pokazuje podstawową ramkę utworzoną podczas używaniaGLJPanel z oknem uchylnym -

OpenGL API udostępnia prymitywne metody rysowania podstawowych elementów graficznych, takich jak punkt, wierzchołek, linia itp. Za pomocą tych metod można tworzyć kształty takie jak trójkąt, wielokąt i okrąg. W wymiarach 2D i 3D. Ten rozdział uczy, jak narysować podstawową linię za pomocą JOGL w programie Java.

Rysowanie obiektów

Aby uzyskać dostęp do programów, które są specyficzne dla platform sprzętowych i systemów operacyjnych i gdzie biblioteki są napisane w innych językach, takich jak C i C ++ (aplikacje natywne), Java używa struktury programistycznej o nazwie Java Native Interface (JNI). JOGL używa tego interfejsu wewnętrznie, aby uzyskać dostęp do funkcji OpenGL, jak pokazano na poniższym diagramie.

Wszystkie cztery metody GLEventListenerinterfejs ma kod (metody JOGL java) do wewnętrznego wywoływania funkcji OpenGL. Nazewnictwo tych metod JOGL jest również podobne do konwencji nazewnictwa OpenGL. Jeśli nazwa funkcji w OpenGL toglBegin(), jest używany jako gl.glBegin().

Zawsze, gdy gl.glBegin() java JOGL, wywołuje wewnętrznie metodę glBegin()metoda OpenGL. Z tego powodu podczas instalacji JOGL w systemie użytkownika należy instalować natywne pliki biblioteczne.

Metoda Display ()

Jest to ważna metoda, która przechowuje kod do tworzenia grafiki. WymagaGLAutoDrawable obiekt interfejsu jako jego parametr.

Plik display()metoda początkowo pobiera kontekst OpenGL za pomocą obiektu interfejsu GL (GL dziedziczy interfejs GLBase, który zawiera metody do generowania wszystkich obiektów kontekstu OpenGL). Ponieważ ten samouczek dotyczy JOGL2, wygenerujmy obiekt GL2.

Poniższy fragment kodu pokazuje, jak wygenerować obiekt GL2 -

//Generating GL object
GL gl = drawable.getGL();
GL gl = drawable.getGL();

//Using this Getting the Gl2 Object
//this can be written in a single line like
final GL2 gl = drawable.getGL().getGL2();

Korzystając z obiektu interfejsu GL2, można uzyskać dostęp do elementów tego interfejsu, które z kolei zapewniają dostęp do funkcji OpenGL [1.0 ... 3.0].

Rysowanie linii

Interfejs GL2 zawiera ogromną listę metod, ale tutaj omówione są trzy główne, ważne metody glBegin(), glVertex(), i glEnd().

Sr.No. Metody i opis
1

glBegin()

Ta metoda rozpoczyna proces rysowania linii. Pobiera predefiniowaną liczbę całkowitą „GL_LINES” jako parametr dziedziczony z interfejsu GL.

2

glVertex3f()/glVertex2f()

Ta metoda tworzy wierzchołek i musimy przekazać współrzędne jako parametry 3f i 2f, które oznaczają odpowiednio 3-wymiarowe współrzędne zmiennoprzecinkowe i 2-wymiarowe współrzędne zmiennoprzecinkowe.

3

glEnd()

kończy linię

Poniżej podany jest program do rysowania linii podstawowej za pomocą JOGL -

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class Line implements GLEventListener{

   @Override
   public void display(GLAutoDrawable drawable) {
      final GL2 gl = drawable.getGL().getGL2();
            
      gl.glBegin (GL2.GL_LINES);//static field
      gl.glVertex3f(0.50f,-0.50f,0);
      gl.glVertex3f(-0.50f,0.50f,0);
      gl.glEnd();

   }
            
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
            
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
	
   public static void main(String[] args) {

      //getting the capabilities object of GL2 profile        
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
   
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      Line l = new Line();
      glcanvas.addGLEventListener(l);
      glcanvas.setSize(400, 400);
   
      //creating frame
      final JFrame frame = new JFrame ("straight Line");
   
      //adding canvas to frame
      frame.getContentPane().add(glcanvas);
                 
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
      
   }//end of main
	
}//end of classimport javax.media.opengl.GL2;

W poprzednim rozdziale nauczyliśmy się, jak narysować podstawową linię za pomocą JOGL. Rysujemy linie przechodząc przez predefiniowane pole,Gl_linesdo metody glBegin () .

Ten rozdział zawiera przykłady rysowania kształtów, takich jak trójkąt, romb i dom, za pomocą metody glBegin () i GL_Lines.

Przejdźmy przez program, aby narysować trójkąt za pomocą GL_LINES -

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class Triangle implements GLEventListener{

   @Override
   public void display(GLAutoDrawable drawable) {
      final GL2 gl = drawable.getGL().getGL2();
      gl.glBegin (GL2.GL_LINES);
   
      //drawing the base
      gl.glBegin (GL2.GL_LINES);
      gl.glVertex3f(-0.50f, -0.50f, 0);
      gl.glVertex3f(0.50f, -0.50f, 0);
      gl.glEnd();
   
      //drawing the right edge
      gl.glBegin (GL2.GL_LINES);
      gl.glVertex3f(0f, 0.50f, 0);
      gl.glVertex3f(-0.50f, -0.50f, 0);
      gl.glEnd();
   
      //drawing the lft edge
      gl.glBegin (GL2.GL_LINES);
      gl.glVertex3f(0f, 0.50f, 0);
      gl.glVertex3f(0.50f, -0.50f, 0);
      gl.glEnd();
      gl.glFlush();
   }
   
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
   
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }
   
   public static void main(String[] args) {
      
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
   
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      Triangle l = new Triangle();
      glcanvas.addGLEventListener(l);
      glcanvas.setSize(400, 400);
   
      //creating frame
      final JFrame frame = new JFrame ("Triangle");
   
      //adding canvas to frame
      frame.getContentPane().add(glcanvas);
          
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
      
   }//end of main
	
}//end of classimport javax.media.opengl.GL2;

Jeśli kompilujesz i wykonujesz powyższy program, generowany jest następujący wynik. Pokazuje trójkąt narysowany przy użyciu GL_LINES ofglBegin() metoda.

Przejdźmy przez program rysujący romb za pomocą GL_LINES -

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class Rhombus implements GLEventListener{

   @Override
   public void display( GLAutoDrawable drawable ) {
      final GL2 gl = drawable.getGL().getGL2();
      
      //edge1  
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( 0.0f,0.75f,0 );
      gl.glVertex3f( -0.75f,0f,0 );
      gl.glEnd();
      
      //edge2
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( -0.75f,0f,0 );
      gl.glVertex3f( 0f,-0.75f, 0 );
      gl.glEnd();
      
      //edge3
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( 0f,-0.75f, 0 );
      gl.glVertex3f( 0.75f,0f, 0 );
      gl.glEnd();
      
      //edge4
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( 0.75f,0f, 0 );
      gl.glVertex3f( 0.0f,0.75f,0 );
      gl.glEnd();
      gl.glFlush();
   }
	
   @Override
   public void dispose( GLAutoDrawable arg0 ) {
      //method body
   }
	
   @Override
   public void init(GLAutoDrawable arg0 ) {
      // method body
   }
	
   @Override
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) {
      // method body
   }
	
   public static void main( String[] args ) {
	
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities(profile);
      
      // The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Rhombus rhombus = new Rhombus();
      glcanvas.addGLEventListener( rhombus );
      glcanvas.setSize( 400, 400 );
      
      //creating frame
      final JFrame frame = new JFrame ( "Rhombus" );
      
      //adding canvas to frame
      frame.getContentPane().add( glcanvas );
      frame.setSize(frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
   }
	
}

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujące dane wyjściowe. Pokazuje romb wygenerowany przy użyciu GL_LINES ofglBegin() metoda.

Przejdźmy przez program do rysowania domu za pomocą GL_LINES -

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class House implements GLEventListener{

   @Override
   public void display( GLAutoDrawable drawable ) {
      final GL2 gl = drawable.getGL().getGL2();
      
      //drawing top
      gl.glBegin ( GL2.GL_LINES );
      gl.glVertex3f( -0.3f, 0.3f, 0 );
      gl.glVertex3f( 0.3f,0.3f, 0 );
      gl.glEnd();
      
      //drawing bottom
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( -0.3f,-0.3f, 0 );
      gl.glVertex3f( 0.3f,-0.3f, 0 );
      gl.glEnd();
      
      //drawing the right edge
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( -0.3f,0.3f, 0 );
      gl.glVertex3f( -0.3f,-0.3f, 0 );
      gl.glEnd();
      
      //drawing the left edge
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( 0.3f,0.3f,0 );
      gl.glVertex3f( 0.3f,-0.3f,0 );
      gl.glEnd();
      
      //building roof
      //building lft dia
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( 0f,0.6f, 0 );
      gl.glVertex3f( -0.3f,0.3f, 0 );
      gl.glEnd();
      
      //building rt dia
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( 0f,0.6f, 0 );
      gl.glVertex3f( 0.3f,0.3f, 0 );
      gl.glEnd();
      
      //building door
      //drawing top
      gl.glBegin ( GL2.GL_LINES );
      gl.glVertex3f( -0.05f, 0.05f, 0 );
      gl.glVertex3f( 0.05f, 0.05f, 0 );
      gl.glEnd();
      
      //drawing the left edge
      gl.glBegin ( GL2.GL_LINES );
      gl.glVertex3f( -0.05f, 0.05f, 0 );
      gl.glVertex3f( -0.05f, -0.3f, 0 );
      gl.glEnd();
      
      //drawing the right edge
      gl.glBegin ( GL2.GL_LINES );
      gl.glVertex3f( 0.05f, 0.05f, 0 );
      gl.glVertex3f( 0.05f, -0.3f, 0 );
      gl.glEnd();
   }
      
   @Override
   public void dispose( GLAutoDrawable arg0 ) {
      //method body
   }
   
   @Override
   public void init( GLAutoDrawable arg0 ) {
      // method body
   }       
   
   @Override
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) {
      // method body
   }
	
   public static void main( String[] args ) {
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities(profile);
   
      // The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      House house = new House();
      glcanvas.addGLEventListener( house );
      glcanvas.setSize(400, 400);
   
      //creating frame
      final JFrame frame = new JFrame( "House" );
   
      //adding canvas to frame
      frame.getContentPane().add( glcanvas );
      frame.setSize(frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
      
   }//end of main
	
}//end of class

Jeśli skompilujesz i uruchomisz powyższy program, otrzymasz następujące dane wyjściowe. Przedstawia diagram domu wygenerowany przy użyciu metody GL_LINES ().

W poprzednich rozdziałach nauczyliśmy się rysować kształty takie jak linia, trójkąt, romb za pomocą JOGL. Rysujemy linie przechodząc przez predefiniowane pole,Gl_linesdo metody glBegin () .

Inny niż GL_LINES, the glBegin()metoda przyjmuje osiem dodatkowych parametrów. Możesz ich używać do rysowania różnych kształtów. Są one używane w taki sam sposób, jak GL_LINES.

W poniższej tabeli przedstawiono glBegin() parametry metody wraz z ich opisem -

Sr.No Parametry i opis
1

GL_LINES

Tworzy każdą parę wierzchołków jako niezależny segment linii.

2

GL_LINE_STRIP

Rysuje połączoną grupę segmentów linii od pierwszego do ostatniego wierzchołka.

3

GL_LINE_LOOP

Rysuje połączoną grupę segmentów linii od pierwszego wierzchołka do ostatniego, ponownie z powrotem do pierwszego.

4

GL_TRIANGLES

Traktuje każdą trójkę wierzchołków jako niezależny trójkąt.

5

GL_TRIANGLE_STRIP

Rysuje połączoną grupę trójkątów. Dla każdego wierzchołka przedstawionego za pierwszymi dwoma wierzchołkami definiowany jest jeden trójkąt.

6

GL_TRIANGLE_FAN

Rysuje połączoną grupę trójkątów. Dla każdego wierzchołka przedstawionego za pierwszymi dwoma wierzchołkami definiowany jest jeden trójkąt.

7

GL_QUADS

Traktuje każdą grupę czterech wierzchołków jako niezależny czworokąt.

8

GL_QUAD_STRIP

Rysuje połączoną grupę czworoboków. Dla każdej pary wierzchołków przedstawionych za pierwszą parą definiuje się jeden czworokąt.

9

GL_POLYGON

Rysuje pojedynczy, wypukły wielokąt. Wierzchołki 1,…, n definiują ten wielokąt.

Zobaczmy kilka przykładów użycia glBegin() parametry.

Program do rysowania paska linii

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import javax.swing.JFrame;

public class LineStrip implements GLEventListener{

   @Override
   public void display(GLAutoDrawable drawable) {
   
      final GL2 gl = drawable.getGL().getGL2();
		
      gl.glBegin (GL2.GL_LINE_STRIP);
      gl.glVertex3f(-0.50f,-0.75f, 0);
      gl.glVertex3f(0.7f,0.5f, 0);
      gl.glVertex3f(0.70f,-0.70f, 0);
      gl.glVertex3f(0f,0.5f, 0);
      gl.glEnd();
   }
   
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
   
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }
   
   public static void main(String[] args) {
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
      
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      LineStrip r = new LineStrip();
      glcanvas.addGLEventListener(r);
      glcanvas.setSize(400, 400);
      
      //creating frame
      final JFrame frame = new JFrame ("LineStrip");
      
      //adding canvas to frame
      frame.getContentPane().add(glcanvas);
            
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
      
   }//end of main
	
}//end of classimport javax.media.opengl.GL2;

Jeśli kompilujesz i wykonujesz powyższy kod, generowane są następujące dane wyjściowe -

Fragment kodu metody display () do rysowania pętli linii

public void display(GLAutoDrawable drawable) {

   final GL2 gl = drawable.getGL().getGL2();
   
   gl.glBegin (GL2.GL_LINE_LOOP);
   
   gl.glVertex3f( -0.50f, -0.75f, 0);
   gl.glVertex3f(0.7f, .5f, 0);
   gl.glVertex3f(0.70f, -0.70f, 0);
   gl.glVertex3f(0f, 0.5f, 0);
   
   gl.glEnd();
}

Jeśli wymienisz display() metody dowolnego z podstawowych programów szablonów z powyższym kodem, skompiluj go i uruchom, generowany jest następujący wynik -

Fragment kodu metody display () do rysowania trójkąta przy użyciu GL_TRIANGLES

public void display(GLAutoDrawable drawable) {

   final GL2 gl = drawable.getGL().getGL2();
   
   gl.glBegin(GL2.GL_TRIANGLES);        // Drawing Using Triangles
   
   gl.glVertex3f(0.5f,0.7f,0.0f);       // Top
   gl.glVertex3f(-0.2f,-0.50f,0.0f);    // Bottom Left
   gl.glVertex3f(0.5f,-0.5f,0.0f);      // Bottom Right
   
   gl.glEnd();
}

Jeśli wymienisz display() metody dowolnego z podstawowych programów szablonów z powyższym kodem, skompiluj go i uruchom, generowany jest następujący wynik -

Fragment kodu metody display () do rysowania paska trójkąta

public void display(GLAutoDrawable drawable) {

   final GL2 gl = drawable.getGL().getGL2();
   
   gl.glBegin (GL2.GL_TRIANGLE_STRIP);
   
   gl.glVertex3f(0f,0.5f,0);
   gl.glVertex3f(-0.50f,-0.75f,0);
   gl.glVertex3f(0.28f,0.06f,0);
   gl.glVertex3f(0.7f,0.5f,0);
   gl.glVertex3f(0.7f,-0.7f,0);
   
   gl.glEnd();
}

Jeśli wymienisz display() metody dowolnego z podstawowych programów szablonów z powyższym kodem, skompiluj go i uruchom, generowany jest następujący wynik -

Fragment kodu metody display () służącej do rysowania czworoboku

public void display(GLAutoDrawable drawable) {

   final GL2 gl = drawable.getGL().getGL2();
   
   gl.glBegin(GL2.GL_QUADS);
   
   gl.glVertex3f( 0.0f,0.75f,0);
   gl.glVertex3f(-0.75f,0f,0);
   gl.glVertex3f(0f,-0.75f,0);
   gl.glVertex3f(0.75f,0f,0);
   
   gl.glEnd();
}

Jeśli wymienisz display() metody dowolnego z podstawowych programów szablonów z powyższym kodem, skompiluj go i uruchom, generowany jest następujący wynik -

Fragment kodu metody display () do rysowania wielokąta

public void display(GLAutoDrawable drawable) {

   final GL2 gl = drawable.getGL().getGL2();
   
   gl.glBegin(GL2.GL_POLYGON);
   
   gl.glVertex3f(0f,0.5f,0f);
   gl.glVertex3f(-0.5f,0.2f,0f);
   gl.glVertex3f(-0.5f,-0.2f,0f);
   gl.glVertex3f(0f,-0.5f,0f);
   gl.glVertex3f(0f,0.5f,0f);
   gl.glVertex3f(0.5f,0.2f,0f);
   gl.glVertex3f(0.5f,-0.2f,0f);
   gl.glVertex3f(0f,-0.5f,0f);
   
   gl.glEnd();
}

Jeśli wymienisz display() metody dowolnego z podstawowych programów szablonów z powyższym kodem, skompiluj go i uruchom, generowany jest następujący wynik -

OpenGL udostępnia więcej funkcji, takich jak nakładanie kolorów na obiekt, skalowanie, oświetlenie, obracanie obiektu itp. W tym rozdziale opisano niektóre przekształcenia obiektów za pomocą JOGL.

Przenoszenie obiektu w oknie

We wcześniejszych rozdziałach omawialiśmy programy do rysowania linii i rysowania różnych kształtów za pomocą prostych linii. Utworzone w ten sposób kształty można wyświetlać w dowolnym miejscu w oknie. Odbywa się to metodąglTranslatef (float x, float y, float z).

Ta metoda należy do GLMatrixFunc interfejs, który znajduje się w javax.media.opengl.fixedfunc pakiet.

Interfejs GLMatrixFunc

interface - GLMatrixFunc

package - javax.media.opengl.fixedfunc

W poniższej tabeli wymieniono kilka ważnych metod tego interfejsu -

Sr.No. Metody i opis
1

void glRotatef(float angle, float x, float y, float z)

Obraca bieżącą macierz.

2

void glScalef(float x, float y, float z)

Służy do skalowania bieżącej macierzy.

3

void glTranslatef(float x, float y,float z)

Służy do tłumaczenia aktualnej macierzy.

4

void glLoadIdentity()

Ładuje bieżącą macierz z macierzą tożsamości.

Plik glTranslate() metoda przenosi początek układu współrzędnych do punktu określonego przez parametry (x, y, z), przekazane do glTranslate() metoda jako

argument. Aby zapisać i przywrócić nieprzetłumaczony układ współrzędnych,glPushMatrix() i glPopMatrix() stosowane są metody.

gl.glTranslatef(0f, 0f, -2.5f);

Kiedy tylko glTranslate()jest używany, zmienia położenie komponentu na ekranie. Stądreshape() metoda GLEventListener interfejs powinien zostać zastąpiony, a rzutnia OpenGL i macierz projekcji powinny zostać zainicjowane.

Poniższy kod przedstawia szablon do inicjalizacji portu widoku i macierzy projekcji -

public void reshape(GLAutoDrawable drawable, int x,  int y, int width, int height) { 
  
   // TODO Auto-generated method stub 
   final GL2 gl = drawable.getGL().getGL2();  
            
   // get the OpenGL 2 graphics object   
   if(height <=0) height = 1; 
       
   //preventing devided by 0 exception height = 1; 
   final float h = (float) width / (float) height; 
            
   // display area to cover the entire window 
   gl.glViewport(0, 0, width, height); 
            
   //transforming projection matrix 
   gl.glMatrixMode(GL2.GL_PROJECTION); 
   gl.glLoadIdentity(); 
   glu.gluPerspective(45.0f, h, 1.0, 20.0); 
      
   //transforming model view gl.glLoadIdentity(); 
   gl.glMatrixMode(GL2.GL_MODELVIEW); 
   gl.glLoadIdentity(); 
}

W tym rozdziale nauczysz się, jak stosować kolory do obiektów za pomocą JOGL. Aby zastosować kolor do obiektu, użyj metodyglColor() z GL2. Poniżej podana jest składnia użycia metody glColor.

Składnia

gl.glColorXY(1f,0f,0f);

gdzie,

  • X oznacza liczbę użytych kolorów, 3 (czerwony, zielony, niebieski) lub 4 (czerwony, zielony, niebieski, alfa). Aby uzyskać różne kombinacje kolorów, wartości tych kolorów są przekazywane jako parametry. W tej kolejności należy zachować kolejność parametrów kolorów.

    Example

    Jeśli przekażesz wartości kolorów jako (1, 0, 0), otrzymasz kolor czerwony. Podobnie (1, 1, 0) daje żółty kolor.

  • Y oznacza typ danych, który akceptuje parametry, takie jak bajt (b), double (d), float (f), int (i), short (s), ubyte (ub), uint (ui) i ushort (us) .

gl.glColor3f(1f,0f,0f);   //gives us red          
gl.glColor3f(0f,1f,0f);   //gives us green            
gl.glColor3f(0f,0f,1f);   //gives us blue

W przypadku trójkąta możesz zastosować inny kolor dla każdego wierzchołka.

Przejdźmy przez program, aby zastosować kolory do trójkąta -

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 

import javax.swing.JFrame; 
 
public class TriangleColor implements GLEventListener { 

   @Override 
   public void display( GLAutoDrawable drawable ) { 
   
      final GL2 gl = drawable.getGL().getGL2(); 
      gl.glBegin( GL2.GL_TRIANGLES );  
      
      // Drawing Using Triangles 
    
      gl.glColor3f( 1.0f, 0.0f, 0.0f );   // Red 
      gl.glVertex3f( 0.5f,0.7f,0.0f );    // Top 
		
      gl.glColor3f( 0.0f,1.0f,0.0f );     // green 
      gl.glVertex3f( -0.2f,-0.50f,0.0f ); // Bottom Left 
		
      gl.glColor3f( 0.0f,0.0f,1.0f );     // blue 
      gl.glVertex3f( 0.5f,-0.5f,0.0f );   // Bottom Right 
		
      gl.glEnd();         
   } 
   
   @Override 
   public void dispose( GLAutoDrawable arg0 ) { 
      //method body 
   } 
   
   @Override 
   public void init( GLAutoDrawable arg0 ) { 
      // method body    
   }
   
   @Override 
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) { 
      // method body 
   } 
   
   public static void main( String[] args ) {    
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get( GLProfile.GL2 ); 
      GLCapabilities capabilities = new GLCapabilities(profile);
          
      // The canvas  
      final GLCanvas glcanvas = new GLCanvas( capabilities ); 
      TriangleColor triangle = new TriangleColor(); 
      glcanvas.addGLEventListener( triangle ); 
      glcanvas.setSize( 400, 400 );   
      
      //creating frame 
      final JFrame frame = new JFrame (" Colored Triangle"); 
          
      //adding canvas to it 
      frame.getContentPane().add( glcanvas ); 
      frame.setSize( frame.getContentPane().getPreferredSize()); 
      frame.setVisible( true );   
      
   } //end of main
	
} //end of class

Kiedy kompilujesz i wykonujesz powyższy program, otrzymasz następujący kolorowy trójkąt -

Stosowanie koloru do wielokąta

Przejdźmy przez program, aby zastosować kolory do wielokąta -

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 

import javax.swing.JFrame; 

public class PolygonColor implements GLEventListener { 

   @Override 
   public void display( GLAutoDrawable drawable ) { 
   
      final GL2 gl = drawable.getGL().getGL2(); 
      gl.glColor3f( 1f,0f,0f ); //applying red  
  
      gl.glBegin( GL2.GL_POLYGON ); 
      
      gl.glVertex3f( 0f,0.5f,0f  ); 
      gl.glVertex3f( -0.5f,0.2f,0f ); 
      gl.glVertex3f( -0.5f,-0.2f,0f ); 
      gl.glVertex3f( 0f,-0.5f,0f ); 
      gl.glVertex3f( 0f,0.5f,0f ); 
      gl.glVertex3f( 0.5f,0.2f,0f ); 
      gl.glVertex3f( 0.5f,-0.2f,0f ); 
      gl.glVertex3f( 0f,-0.5f,0f ); 
      
      gl.glEnd(); 
   }
   
   @Override 
   public void dispose( GLAutoDrawable arg0 ) { 
      //method body 
   } 
   
   @Override 
   public void init( GLAutoDrawable arg0 ) {   
      // method body 
   } 
   
   @Override 
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) {    
      // method body 
   } 
   
   public static void main( String[] args ) { 
   
      //getting the capabilities object of GL2 profile  
      final GLProfile profile = GLProfile.get( GLProfile.GL2 ); 
      GLCapabilities capabilities = new GLCapabilities(profile); 
      
      // The canvas  
      final GLCanvas glcanvas = new GLCanvas( capabilities ); 
      PolygonColor polygon = new PolygonColor(); 
      glcanvas.addGLEventListener( polygon ); 
      glcanvas.setSize( 400, 400 ); 
      
      //creating frame 
      final JFrame frame = new JFrame ( "Colored Polygon" ); 
      
      //adding canvas to frame 
      frame.getContentPane().add( glcanvas ); 
      frame.setSize(frame.getContentPane().getPreferredSize() ); 
      frame.setVisible( true );    
      
   } //end of main 
	
 } //end of class

Kiedy kompilujesz i wykonujesz powyższy program, otrzymasz następujący kolorowy wielokąt -

Ten rozdział uczy, jak skalować obiekt, tj. Zwiększać lub zmniejszać rozmiar obiektu za pomocą JOGL.

Skalowanie obiektu odbywa się za pomocą rozszerzenia glScalef(float x, float y, float z) metoda GLMatrixFuncberło. Ta metoda przyjmuje trzy parametry zmiennoprzecinkowe, za pomocą których określamy współczynniki skali odpowiednio wzdłuż osi x, y i z.

Na przykład w poniższym programie trójkąt jest zmniejszany do 50%. Tutaj wartość 50 jest przekazywana jako parametr wzdłuż wszystkich osi.

Przejdźmy przez program, aby wyskalować trójkąt -

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 

import javax.swing.JFrame;
 
public class Scaling implements GLEventListener {
 
   @Override 
	
   public void display( GLAutoDrawable drawable ) { 
   
      final GL2 gl = drawable.getGL().getGL2(); 
      gl.glScalef( 0.50f,0.25f,0.50f ); 
      gl.glBegin( GL2.GL_TRIANGLES );
		
      // Drawing Using Triangles 
      gl.glColor3f( 1.0f, 0.0f, 0.0f );   // Red 
      gl.glVertex3f( 0.5f,0.7f,0.0f );    // Top 
		
      gl.glColor3f( 0.0f,1.0f,0.0f );     // blue 
      gl.glVertex3f( -0.2f,-0.50f,0.0f ); // Bottom Left 
		
      gl.glColor3f( 0.0f,0.0f,1.0f );     // green 
      gl.glVertex3f( 0.5f,-0.5f,0.0f );   // Bottom Right 
		
      gl.glEnd(); 
   }
   
   @Override 
   public void dispose( GLAutoDrawable arg0 ) { 
      //method body 
   } 
   
   @Override 
   public void init( GLAutoDrawable arg0 ) { 
      // method body 
   } 
   
   @Override 
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) { 
      // method body 
   }
   
   public static void main( String[] args ) {   
   
      //getting the capabilities object of GL2 profile 
      final GLProfile profile = GLProfile.get( GLProfile.GL2 ); 
      GLCapabilities capabilities = new GLCapabilities(profile);
        
      // The canvas  
      final GLCanvas glcanvas = new GLCanvas( capabilities ); 
      Scaling scaling = new Scaling(); 
      glcanvas.addGLEventListener( scaling ); 
      glcanvas.setSize( 400, 400 );  

      //creating frame 
      final JFrame frame  = new JFrame (" Dimnished Triangle (Scaling )");   

      //adding canvas to it 
      frame.getContentPane().add(glcanvas); 
      frame.setSize(frame.getContentPane().getPreferredSize()); 
      frame.setVisible(true);         
      
   } //end of main 
	
} //end of classimport javax.media.opengl.GL2;

Podczas kompilowania i wykonywania powyższego programu otrzymujemy następujące dane wyjściowe. Tutaj możesz zaobserwować zmniejszony trójkąt w porównaniu do oryginalnego trójkąta utworzonego przez TriangleColor.java -

W tym rozdziale wyjaśniliśmy, jak obrócić obiekt za pomocą JOGL. Obrót obiektów można wykonać wzdłuż dowolnej z trzech osi, korzystając zglRotatef(float angle, float x, float y, float z) metoda GLMatrixFuncberło. Musisz podać kąt obrotu i osie x, y, z jako parametry tej metody.

Poniższe kroki prowadzą do pomyślnego obrócenia obiektu -

  • Wyczyść bufor kolorów i bufor głębi początkowo za pomocą gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT)metoda. Ta metoda usuwa poprzedni stan obiektu i sprawia, że ​​widok jest wyraźny.

  • Zresetuj matrycę projekcji za pomocą glLoadIdentity() metoda.

Utwórz wystąpienie klasy animatora i uruchom animator przy użyciu start() metoda.

Klasa FPSAnimator

Poniżej podano różne konstruktory klasy FPSAnimator.

Sr.No. Metody i opisy
1

FPSAnimator(GLAutoDrawable drawable, int fps)

Tworzy FPSAnimator z zadaną docelową wartością klatek na sekundę i początkowym rysunkiem do animacji.

2

FPSAnimator(GLAutoDrawable drawable, int fps, boolean cheduleAtFixedRate)

Tworzy FPSAnimator z zadaną docelową wartością klatek na sekundę, początkowym rysunkiem do animacji i flagą wskazującą, czy używać harmonogramu o stałej szybkości.

3

FPSAnimator(int fps)

Tworzy FPSAnimator z podaną docelową wartością klatek na sekundę.

4 Tworzy FPSAnimator z podaną docelową wartością liczby klatek na sekundę i flagą wskazującą, czy używać harmonogramu o stałej szybkości.

Tworzy FPSAnimator z podaną docelową wartością liczby klatek na sekundę i flagą wskazującą, czy używać harmonogramu o stałej szybkości.

start() i stop()to dwie ważne metody w tej klasie. Poniższy program pokazuje, jak obrócić trójkąt za pomocą klasy FPSAnimator -

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 

import javax.swing.JFrame; 

import com.jogamp.opengl.util.FPSAnimator; 

public class TriangleRotation implements GLEventListener { 
   private float rtri;  //for angle of rotation
      
   @Override 
   public void display( GLAutoDrawable drawable ) {
   
      final GL2 gl = drawable.getGL().getGL2(); 
      gl.glClear (GL2.GL_COLOR_BUFFER_BIT |  GL2.GL_DEPTH_BUFFER_BIT );  
      
      // Clear The Screen And The Depth Buffer 
      gl.glLoadIdentity();  // Reset The View     
              
      //triangle rotation      
      gl.glRotatef( rtri, 0.0f, 1.0f, 0.0f );  
              
      // Drawing Using Triangles 
      gl.glBegin( GL2.GL_TRIANGLES );          
      
      gl.glColor3f( 1.0f, 0.0f, 0.0f );   // Red 
      gl.glVertex3f( 0.5f,0.7f,0.0f );    // Top 
      gl.glColor3f( 0.0f,1.0f,0.0f );     // blue 
      gl.glVertex3f( -0.2f,-0.50f,0.0f ); // Bottom Left 
      gl.glColor3f( 0.0f,0.0f,1.0f );     // green 
      gl.glVertex3f( 0.5f,-0.5f,0.0f );   // Bottom Right 
      
      gl.glEnd();    
      gl.glFlush(); 
      
      rtri +=0.2f;  //assigning the angle               
   } 
	
   @Override 
   public void dispose( GLAutoDrawable arg0 ) { 
      //method body 
   } 
   
   @Override 
   public void init( GLAutoDrawable arg0 ) { 
      // method body 
   }
   
   @Override 
   public void reshape( GLAutoDrawable drawable, int x, int y, int width, int height ) { 
   
      public static void main( String[] args ) {
		
         //getting the capabilities object of GL2 profile
         final GLProfile profile  = GLProfile.get(GLProfile.GL2 ); 
         GLCapabilities capabilities  = new GLCapabilities( profile );

         // The canvas  
         final GLCanvas glcanvas = new GLCanvas( capabilities); 
         TriangleRotation triangle = new TriangleRotation(); 
         glcanvas.addGLEventListener( triangle ); 
         glcanvas.setSize( 400, 400 );  

         // creating frame 
         final JFrame frame = new JFrame ("Rotating Triangle");

         // adding canvas to it 
         frame.getContentPane().add( glcanvas ); 
         frame.setSize(frame.getContentPane() .getPreferredSize());                 
         frame.setVisible( true ); 
                
         //Instantiating and Initiating Animator 
         final FPSAnimator animator = new FPSAnimator(glcanvas, 300,true); 
         animator.start(); 
      }
		
   } //end of main
	
} //end of class

Jeśli kompilujesz i wykonujesz powyższy program, generuje on następujące dane wyjściowe. Tutaj możesz obserwować różne migawki obracającego się kolorowego trójkąta wokół osi X.

W tym rozdziale wyjaśniono, jak zastosować efekt oświetlenia do obiektu za pomocą JOGL.

Aby ustawić oświetlenie, najpierw włącz oświetlenie za pomocą glEnable()metoda. Następnie zastosuj oświetlenie obiektów za pomocąglLightfv(int light, int pname, float[] params, int params_offset) metoda GLLightingFuncberło. Ta metoda przyjmuje cztery parametry.

W poniższej tabeli opisano parametry gllightfv() metoda.

Sr.No. Nazwa i opis parametru
1

Light

Określa światło. Liczba świateł zależy od implementacji, ale obsługiwanych jest co najmniej osiem świateł. Przyjmuje dziesięć wartości, parametry te są omówione w osobnej tabeli o nazwie Parametry źródła światła podanej poniżej.

2

Pname

Określa parametr źródła światła o pojedynczej wartości. W przypadku źródła światła istnieje dziesięć parametrów omówionych poniżej.

3

Params

Określa wskaźnik do wartości lub wartości ustawionych w parametrze pname światła źródła światła .

4

Light source parameter

Możesz użyć dowolnego z parametrów źródła światła podanych poniżej.

Parametry źródła światła

Sr.No. Parametr i opis
1

GL_AMBIENT

Zawiera parametry określające natężenie światła w otoczeniu.

2

GL_DIFFUSE

Zawiera parametry określające rozproszone natężenie światła.

3

GL_SPECULAR

Zawiera parametry określające zwierciadlane natężenie światła.

4

GL_POSITION

Zawiera cztery wartości całkowite lub zmiennoprzecinkowe, które określają położenie światła w jednorodnych współrzędnych obiektu.

5

GL_SPOT_DIRECTION

Zawiera parametry określające kierunek światła w jednorodnych współrzędnych obiektu.

6

GL_SPOT_EXPONENT

Jego parametry określają rozkład natężenia światła.

7

GL_SPOT_CUTOFF

Pojedynczy parametr określa maksymalny kąt rozproszenia światła.

8

GL_CONSTANT_ATTENUATION or GL_LINEAR_ATTENUATION or GL_QUADRATIC_ATTENUATION

Możesz użyć dowolnego z tych współczynników tłumienia, które są reprezentowane przez pojedynczą wartość.

Oświetlenie jest włączane lub wyłączane za pomocą glEnable() i glDisable () z argumentem GL_LIGHTING.

Poniższy szablon dotyczy oświetlenia -

gl.glEnable(GL2.GL_LIGHTING); 
gl.glEnable(GL2.GL_LIGHT0);  
gl.glEnable(GL2.GL_NORMALIZE); 

float[] ambientLight = { 0.1f, 0.f, 0.f,0f };  // weak RED ambient 
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0); 

float[] diffuseLight = { 1f,2f,1f,0f };  // multicolor diffuse 
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);

Stosowanie światła do obracającego się wielokąta

Wykonaj podane czynności, aby zastosować światło do obracającego się wielokąta.

Obróć wielokąt za pomocą metody glRotate ()

gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
  
// Clear The Screen And The Depth Buffer  
gl.glLoadIdentity();  
                 
// Reset The View  
gl.glRotatef(rpoly, 0.0f, 1.0f, 0.0f);

Przejdźmy przez program, aby zastosować światło do obracającego się wielokąta -

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 

import javax.swing.JFrame; 

import com.jogamp.opengl.util.FPSAnimator; 
 
public class PolygonLighting implements GLEventListener { 
   private float rpoly;
	
   @Override 
	
   public void display( GLAutoDrawable drawable ) {
   
      final GL2 gl = drawable.getGL().getGL2(); 
      gl.glColor3f(1f,0f,0f); //applying red
      
      // Clear The Screen And The Depth Buffer 
      gl.glClear( GL2.GL_COLOR_BUFFER_BIT |  
      GL2.GL_DEPTH_BUFFER_BIT );   
      gl.glLoadIdentity();       // Reset The View    
      gl.glRotatef( rpoly, 0.0f, 1.0f, 0.0f ); 
		
      gl.glBegin( GL2.GL_POLYGON ); 
      
      gl.glVertex3f( 0f,0.5f,0f ); 
      gl.glVertex3f( -0.5f,0.2f,0f ); 
      gl.glVertex3f( -0.5f,-0.2f,0f ); 
      gl.glVertex3f( 0f,-0.5f,0f ); 
      gl.glVertex3f( 0f,0.5f,0f ); 
      gl.glVertex3f( 0.5f,0.2f,0f ); 
      gl.glVertex3f( 0.5f,-0.2f,0f ); 
      gl.glVertex3f( 0f,-0.5f,0f ); 
      
      gl.glEnd(); 
		
      gl.glFlush(); 
      
      rpoly += 0.2f;  //assigning the angle 
      
      gl.glEnable( GL2.GL_LIGHTING );  
      gl.glEnable( GL2.GL_LIGHT0 );  
      gl.glEnable( GL2.GL_NORMALIZE );  

      // weak RED ambient 
      float[] ambientLight = { 0.1f, 0.f, 0.f,0f };  
      gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambient-Light, 0);  

      // multicolor diffuse 
      float[] diffuseLight = { 1f,2f,1f,0f };  
      gl.glLightfv( GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuse-Light, 0 ); 
   }  
      
   @Override 
   public void dispose( GLAutoDrawable arg0 ) { 
      //method body  
   } 
  
   @Override 
   public void init( GLAutoDrawable arg0 ) { 
      // method body     
   } 
	
   @Override 
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) { 
      // method body 
   } 
	
   public static void main( String[] args ) { 
   
      //getting the capabilities object of GL2 profile 
      final GLProfile profile = GLProfile.get( GLProfile.GL2 ); 
      GLCapabilities capabilities = new GLCapabilities( profile);

      // The canvas  
      final GLCanvas glcanvas = new GLCanvas( capabilities ); 
      PolygonLighting polygonlighting = new PolygonLighting(); 
      glcanvas.addGLEventListener( polygonlighting ); 
      glcanvas.setSize( 400, 400 ); 

      //creating frame 
      final JFrame frame = new JFrame (" Polygon lighting ");  

      //adding canvas to it 
      frame.getContentPane().add( glcanvas ); 
      frame.setSize( frame.getContentPane().getPreferredSize()); 
      frame.setVisible( true );  
                    
      //Instantiating and Initiating Animator 
      final FPSAnimator animator = new FPSAnimator(glcanvas, 300,true ); 
      animator.start();                     
      
   } //end of main 
	
} //end of class

Jeśli kompilujesz i wykonujesz powyższy program, generuje on następujące dane wyjściowe. Tutaj możesz obserwować różne migawki obracającego się wielokąta z oświetleniem.

W poprzednich rozdziałach widzieliśmy, jak tworzyć obiekty 2d, stosować do nich efekty i przekształcać obiekt. W tym rozdziale nauczysz się, jak narysować linię z trzecim wymiarem i niektórymi kształtami.

Narysujmy prostą linię z osią Z i zobaczmy różnicę między liniami 2D i 3D. Najpierw narysuj prostą linię, a następnie narysuj drugą linię 3 jednostki w oknie.

Przejdźmy przez program, aby narysować linię 3D -

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;
   
public class Line3d implements GLEventListener {
   private GLU glu = new GLU();
	
   @Override
   
   public void display( GLAutoDrawable drawable ) {
      final GL2 gl = drawable.getGL().getGL2();
      gl.glTranslatef( 0f, 0f, -2.5f );
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( -0.75f,0f,0 );
      gl.glVertex3f( 0f,-0.75f, 0 );
      gl.glEnd();
      
      //3d line
      gl.glBegin( GL2.GL_LINES );
      gl.glVertex3f( -0.75f,0f,3f );// 3 units into the window
      gl.glVertex3f( 0f,-0.75f,3f );
      gl.glEnd();
   }
   
   @Override
   public void dispose( GLAutoDrawable arg0 ) {
      //method body
   }
   
   @Override
   public void init( GLAutoDrawable arg0 ) {
      // method body
   }
   
   @Override
   public void reshape( GLAutoDrawable drawable, int x, int y, int width, int height ) {
	
      GL2 gl = drawable.getGL().getGL2();
      
      if( height <= 0 )
         height = 1;
			
      final float h = ( float ) width / ( float ) height;
      gl.glViewport( 0, 0, width, height );
      gl.glMatrixMode( GL2.GL_PROJECTION );
      gl.glLoadIdentity();
		
      glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
      gl.glMatrixMode( GL2.GL_MODELVIEW );
      gl.glLoadIdentity();
   }
   
   public static void main( String[] args ) {
	
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities(profile);
          
      // The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Line3d line3d = new Line3d();
      glcanvas.addGLEventListener( line3d );
      glcanvas.setSize( 400, 400 );
       
      //creating frame
      final JFrame frame = new JFrame (" 3d line");
          
      //adding canvas to it
      frame.getContentPane().add( glcanvas );
      frame.setSize(frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
   }//end of main
	
}//end of class

Podczas kompilacji i wykonywania powyższego programu generowane są następujące dane wyjściowe -

Kształty 3D można rysować, podając niezerowe wartości kwadrantowi z glVertex3f()metoda, która generuje powyższy widok. Teraz połączenie pozostałych linii doprowadzi do krawędzi 3D.

Teraz w ten sam sposób opracujmy krawędź z trzecim wymiarem.

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

public class Edge1 implements GLEventListener {
   private GLU glu = new GLU();
	
   @Override
   public void display(GLAutoDrawable drawable) {
   
      // TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      gl.glTranslatef(0f, 0f, -2.5f);
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(-0.75f,0f,0);
      gl.glVertex3f(0f,-0.75f, 0);
      gl.glEnd();

      //3d line
      gl.glBegin(GL2.GL_LINES);

      //3 units in to the window
      gl.glVertex3f(-0.75f,0f,3f);
      gl.glVertex3f(0f,-0.75f,3f);
      gl.glEnd();

      //top
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(-0.75f,0f,0);
      gl.glVertex3f(-0.75f,0f,3f);
      gl.glEnd();

      //bottom
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0f,-0.75f, 0);
      gl.glVertex3f(0f,-0.75f,3f);
      gl.glEnd();
   }

   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
	
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   
   @Override
   public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
	
      // TODO Auto-generated method stubfinal
      GL2 gl = drawable.getGL().getGL2();
      if(height <= 0)
         height = 1;
			
      final float h = (float) width / (float) height;
      gl.glViewport(0, 0, width, height);
      gl.glMatrixMode(GL2.GL_PROJECTION);
      gl.glLoadIdentity();
		
      glu.gluPerspective(45.0f, h, 1.0, 20.0);
      gl.glMatrixMode(GL2.GL_MODELVIEW);
      gl.glLoadIdentity();

   }
   
   public static void main(String[] args) {
   
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);

      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      Edge1 b = new Edge1();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);

      //creating frame
      final JFrame frame = new JFrame (" 3d edge");

      //adding canvas to it
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
   }//end of main
	
}//end of class

Podczas kompilacji i wykonywania powyższego programu generowane są następujące dane wyjściowe -

W ten sam sposób, rozwijając krawędzie 3D do odpowiednich boków dowolnego czworoboku 2D i łącząc sąsiednie wierzchołki, można uzyskać czworokąt 3D.

Poniżej podany jest program do rysowania rombów za pomocą JOGL.

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

public class Rhombus implements GLEventListener {
   private GLU glu = new GLU();
    
   @Override
   public void display(GLAutoDrawable drawable) {
	
      final GL2 gl = drawable.getGL().getGL2();
      gl.glTranslatef(0f, 0f, -2.5f);

      //drawing edge1.....
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(-0.75f,0f,0);
      gl.glVertex3f(0f,-0.75f, 0);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(-0.75f,0f,3f); // 3 units into the window
      gl.glVertex3f(0f,-0.75f,3f);
      gl.glEnd();

      //top
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(-0.75f,0f,0);
      gl.glVertex3f(-0.75f,0f,3f);
      gl.glEnd();

      // bottom
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0f,-0.75f, 0);
      gl.glVertex3f(0f,-0.75f,3f);
      gl.glEnd();
   
      // edge 2....
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0f,-0.75f, 0);
      gl.glVertex3f(0.75f,0f, 0);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0f,-0.75f, 3f);
      gl.glVertex3f(0.75f,0f, 3f);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0f,-0.75f, 0);
      gl.glVertex3f(0f,-0.75f, 3f);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0.75f,0f, 0);
      gl.glVertex3f(0.75f,0f, 3f);
      gl.glEnd();

      //Edge 3.............
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f( 0.0f,0.75f,0);
      gl.glVertex3f(-0.75f,0f,0);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f( 0.0f,0.75f,3f);
      gl.glVertex3f(-0.75f,0f,3f);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f( 0.0f,0.75f,0);
      gl.glVertex3f( 0.0f,0.75f,3f);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(-0.75f,0f,0);
      gl.glVertex3f(-0.75f,0f,3f);
      gl.glEnd();

      //final edge
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0.75f,0f, 0);
      gl.glVertex3f( 0.0f,0.75f,0);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0.75f,0f,3f);
      gl.glVertex3f( 0.0f,0.75f,3f);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f(0.75f,0f, 0);
      gl.glVertex3f(0.75f,0f,3f);
      gl.glEnd();
		
      gl.glBegin(GL2.GL_LINES);
      gl.glVertex3f( 0.0f,0.75f,0);
      gl.glVertex3f( 0.0f,0.75f,3f);
      gl.glEnd();
   }
   
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
	
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
	
   @Override
   public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
   
      // TODO Auto-generated method stub final
      GL2 gl = drawable.getGL().getGL2();
      if(height lt;= 0)
         height = 1;
			
      final float h = (float) width / (float) height;
      gl.glViewport(3, 6, width, height);
      gl.glMatrixMode(GL2.GL_PROJECTION);
      gl.glLoadIdentity();
		
      glu.gluPerspective(45.0f, h, 1.0, 20.0);
      gl.glMatrixMode(GL2.GL_MODELVIEW);
      gl.glLoadIdentity();
   }
   
   public static void main(String[] args) {
	
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);

      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      Rhombus b = new Rhombus();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);

      //creating frame
      final JFrame frame = new JFrame (" Rhombus 3d");

      //adding canvas to it
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
   }//end of main
	
}//end of classimport javax.media.opengl.GL2;

Podczas kompilowania i wykonywania powyższego programu generowane są następujące dane wyjściowe. Przedstawia romb narysowany za pomocą linii 3D.

Predefiniowane parametry glBegin() metoda może być używana do rysowania kształtów 3D.

W poprzednim rozdziale widzieliśmy, jak rysować kształty 3D, w tym rozdziale nauczyliśmy się rysować trójkąt 3D i obracać go.

Poniżej podany jest program do rysowania trójkąta 3D i obracania go.

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

import com.jogamp.opengl.util.FPSAnimator;

public class Triangle3d implements GLEventListener {

   private GLU glu = new GLU();
   private float rtri = 0.0f;
      
   @Override
   public void display(GLAutoDrawable drawable) {
      final GL2 gl = drawable.getGL().getGL2();

      // Clear The Screen And The Depth Buffer
      gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
      gl.glLoadIdentity(); // Reset The View
      gl.glTranslatef( -0.5f, 0.0f, -6.0f ); // Move the triangle
      gl.glRotatef( rtri, 0.0f, 1.0f, 0.0f );
      gl.glBegin( GL2.GL_TRIANGLES ); 
        
      //drawing triangle in all dimensions
      // Front
      gl.glColor3f( 1.0f, 0.0f, 0.0f ); // Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top Of Triangle (Front)
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f ); // Green
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Left Of Triangle (Front)
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f ); // Blue
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Right Of Triangle (Front)
        
      // Right
      gl.glColor3f( 1.0f, 0.0f, 0.0f ); // Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top Of Triangle (Right)
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f ); // Blue
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Left Of Triangle (Right)
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f ); // Green
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Right Of Triangle (Right)
        
      // Left
      gl.glColor3f( 1.0f, 0.0f, 0.0f ); // Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top Of Triangle (Back)
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f ); // Green
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Left Of Triangle (Back)
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f ); // Blue
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Right Of Triangle (Back)
        
      //left
      gl.glColor3f( 0.0f, 1.0f, 0.0f ); // Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top Of Triangle (Left)
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f ); // Blue
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Left Of Triangle (Left)
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f ); // Green
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Right Of Triangle (Left)
		
      gl.glEnd(); // Done Drawing 3d triangle (Pyramid)
      gl.glFlush();
      rtri += 0.2f;
   }
   
   @Override
   public void dispose( GLAutoDrawable drawable ) {
      //method body
   }
   
   @Override
   public void init( GLAutoDrawable drawable ) {
      //method body
   }
   
   @Override
   public void reshape( GLAutoDrawable drawable, int x, int y, int width, int height ) {
	
      // TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      if(height lt;=;)
         height = 1;
			
      final float h = ( float ) width / ( float ) height;
      gl.glViewport( 0, 0, width, height );
      gl.glMatrixMode( GL2.GL_PROJECTION );
      gl.glLoadIdentity();
		
      glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
      gl.glMatrixMode( GL2.GL_MODELVIEW );
      gl.glLoadIdentity();
   }
   
   public static void main( String[] args ) {
   
      // TODO Auto-generated method stub
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities( profile );
         
      // The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Triangle3d triangle = new Triangle3d();
		
      glcanvas.addGLEventListener( triangle );
      glcanvas.setSize( 400, 400 );
		
      final JFrame frame = new JFrame ( "3d Triangle (shallow)" );
		
      frame.getContentPane().add( glcanvas );
      frame.setSize( frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
		
      final FPSAnimator animator = new FPSAnimator(glcanvas,300,true);
      animator.start();
   }
	
}

Podczas kompilowania i wykonywania powyższego programu generowane są następujące dane wyjściowe. Tutaj masz migawki obracającego się trójkąta 3D. Ponieważ ten program nie zawiera testu głębokości, trójkąt jest generowany jako pusty.

Aby trójkąt był pełny, musisz włączyć test głębokości za pomocą glEnable(GL_DEPTH_TEST). Włączenie bufora głębokości powoduje wyświetlenie pustego ekranu. Można to usunąć, usuwając kolor za pomocąglClear(GL_COLOR_BUFFERBIT | GL_DEPTH_BUFFER_BIT)metoda. Aby włączyć test głębokości w metodzie init () lub wglDisplay() metoda, napisz następujący kod -

public void init(GLAutoDrawable drawable) {
   final GL2 gl = drawable.getGL().getGL2();
	
   gl.glShadeModel(GL2.GL_SMOOTH);
   gl.glClearColor(0f, 0f, 0f, 0f);
   gl.glClearDepth(1.0f);
   gl.glEnable(GL2.GL_DEPTH_TEST);
   gl.glDepthFunc(GL2.GL_LEQUAL);
   gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
 }

Poniżej podany jest program do rysowania trójkąta 3D z testem głębokości.

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

import com.jogamp.opengl.util.FPSAnimator;

public class Triangledepthtest implements GLEventListener {

   private GLU glu = new GLU();
   private float rtri = 0.0f; 
	
   @Override
   public void display( GLAutoDrawable drawable ) {
	
      final GL2 gl = drawable.getGL().getGL2();
		
      gl.glShadeModel( GL2.GL_SMOOTH );
      gl.glClearColor( 0f, 0f, 0f, 0f );
      gl.glClearDepth( 1.0f );
      gl.glEnable( GL2.GL_DEPTH_TEST );
      gl.glDepthFunc( GL2.GL_LEQUAL );
      gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);

      // Clear The Screen And The Depth Buffer
      gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
      gl.glLoadIdentity(); // Reset The View
      gl.glTranslatef( -0.5f,0.0f,-6.0f ); // Move the triangle
      gl.glRotatef( rtri, 0.0f, 1.0f, 0.0f );
      gl.glBegin( GL2.GL_TRIANGLES ); 

      //drawing triangle in all dimensions
      //front
      gl.glColor3f( 1.0f, 0.0f, 0.0f ); // Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f ); // Green
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Left
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f ); // Blue
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Right)

      //right
      gl.glColor3f( 1.0f, 0.0f, 0.0f );
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f );
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Left
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Right

      //left
      gl.glColor3f( 1.0f, 0.0f, 0.0f );
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Left 
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f );
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Right 

      //top
      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( 1.0f, 2.0f, 0.0f ); // Top
		
      gl.glColor3f( 0.0f, 0.0f, 1.0f );
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Left
		
      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Right
		
      gl.glEnd(); // Done Drawing 3d triangle (Pyramid)

      gl.glFlush();
      rtri += 0.2f;
   }
      
   @Override
   public void dispose( GLAutoDrawable drawable ) {
   }
   
   @Override
   public void init( GLAutoDrawable drawable ) {
	
      final GL2 gl = drawable.getGL().getGL2();
		
      gl.glShadeModel( GL2.GL_SMOOTH );
      gl.glClearColor( 0f, 0f, 0f, 0f );
      gl.glClearDepth( 1.0f );
      gl.glEnable( GL2.GL_DEPTH_TEST );
      gl.glDepthFunc( GL2.GL_LEQUAL );
      gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST );
   }
   
   @Override
   public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height ) {
	
      // TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      if( height <= 0 ) 
         height = 1;
			
      final float h = ( float ) width / ( float ) height;
      gl.glViewport( 0, 0, width, height );
      gl.glMatrixMode( GL2.GL_PROJECTION );
      gl.glLoadIdentity();
		
      glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
      gl.glMatrixMode( GL2.GL_MODELVIEW );
      gl.glLoadIdentity();
   }
      
   public static void main( String[] args ) {
	
      // TODO Auto-generated method stub
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities( profile );
		
      // The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Triangledepthtest triangledepthtest = new Triangledepthtest();
		
      glcanvas.addGLEventListener( triangledepthtest );
      glcanvas.setSize( 400, 400 );
		
      final JFrame frame = new JFrame ( "3d Triangle (solid)" );
      frame.getContentPane().add(glcanvas);
      frame.setSize( frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
      final FPSAnimator animator = new FPSAnimator( glcanvas, 300,true);
		
      animator.start();
   }
	
}

Podczas kompilowania i wykonywania powyższego programu generowane są następujące dane wyjściowe.

Tutaj możesz zobaczyć migawki obracającego się trójkąta 3D. Ponieważ ten program zawiera kod do testu głębokości, trójkąt jest generowany w postaci stałej.

W poprzednich rozdziałach widzieliśmy, jak narysować trójkąt 3D i obrócić go. Teraz w tym rozdziale możesz dowiedzieć się, jak wykonać kostkę 3D, jak ją obracać, jak dołączyć do niej obraz. W ten sam sposób, w tym rozdziale przedstawiono przykłady rysowania kostki 3D i stosowania do niej kolorów oraz dołączania do niej obrazu.

Poniżej podany jest program do rysowania kostki 3d i nanoszenia na nią kolorów.

import java.awt.DisplayMode;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

import com.jogamp.opengl.util.FPSAnimator;

public class Cube implements GLEventListener {

   public static DisplayMode dm, dm_old;
   private GLU glu = new GLU();
   private float rquad = 0.0f;
      
   @Override
   public void display( GLAutoDrawable drawable ) {
	
      final GL2 gl = drawable.getGL().getGL2();
      gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
      gl.glLoadIdentity();
      gl.glTranslatef( 0f, 0f, -5.0f ); 

      // Rotate The Cube On X, Y & Z
      gl.glRotatef(rquad, 1.0f, 1.0f, 1.0f); 
 
      //giving different colors to different sides
      gl.glBegin(GL2.GL_QUADS); // Start Drawing The Cube
      gl.glColor3f(1f,0f,0f); //red color
      gl.glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Top)
      gl.glVertex3f( -1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top)
      gl.glVertex3f( -1.0f, 1.0f, 1.0f ); // Bottom Left Of The Quad (Top)
      gl.glVertex3f( 1.0f, 1.0f, 1.0f ); // Bottom Right Of The Quad (Top)
		
      gl.glColor3f( 0f,1f,0f ); //green color
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Top Right Of The Quad
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Top Left Of The Quad
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Bottom Left Of The Quad
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Bottom Right Of The Quad 

      gl.glColor3f( 0f,0f,1f ); //blue color
      gl.glVertex3f( 1.0f, 1.0f, 1.0f ); // Top Right Of The Quad (Front)
      gl.glVertex3f( -1.0f, 1.0f, 1.0f ); // Top Left Of The Quad (Front)
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Bottom Left Of The Quad
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Bottom Right Of The Quad 

      gl.glColor3f( 1f,1f,0f ); //yellow (red + green)
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Bottom Left Of The Quad
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Bottom Right Of The Quad
      gl.glVertex3f( -1.0f, 1.0f, -1.0f ); // Top Right Of The Quad (Back)
      gl.glVertex3f( 1.0f, 1.0f, -1.0f ); // Top Left Of The Quad (Back)

      gl.glColor3f( 1f,0f,1f ); //purple (red + green)
      gl.glVertex3f( -1.0f, 1.0f, 1.0f ); // Top Right Of The Quad (Left)
      gl.glVertex3f( -1.0f, 1.0f, -1.0f ); // Top Left Of The Quad (Left)
      gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // Bottom Left Of The Quad
      gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // Bottom Right Of The Quad 

      gl.glColor3f( 0f,1f, 1f ); //sky blue (blue +green)
      gl.glVertex3f( 1.0f, 1.0f, -1.0f ); // Top Right Of The Quad (Right)
      gl.glVertex3f( 1.0f, 1.0f, 1.0f ); // Top Left Of The Quad
      gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // Bottom Left Of The Quad
      gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // Bottom Right Of The Quad
      gl.glEnd(); // Done Drawing The Quad
      gl.glFlush();
      rquad -= 0.15f;
   }
   
   @Override
   public void dispose( GLAutoDrawable drawable ) {
      // TODO Auto-generated method stub
   }
   
   @Override
   public void init( GLAutoDrawable drawable ) {
	
      final GL2 gl = drawable.getGL().getGL2();
      gl.glShadeModel( GL2.GL_SMOOTH );
      gl.glClearColor( 0f, 0f, 0f, 0f );
      gl.glClearDepth( 1.0f );
      gl.glEnable( GL2.GL_DEPTH_TEST );
      gl.glDepthFunc( GL2.GL_LEQUAL );
      gl.glHint( GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST );
   }
      
   @Override
   public void reshape( GLAutoDrawable drawable, int x, int y, int width, int height ) {
	
      // TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      if( height lt;= 0 )
         height = 1;
			
      final float h = ( float ) width / ( float ) height;
      gl.glViewport( 0, 0, width, height );
      gl.glMatrixMode( GL2.GL_PROJECTION );
      gl.glLoadIdentity();
		
      glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
      gl.glMatrixMode( GL2.GL_MODELVIEW );
      gl.glLoadIdentity();
   }
      
   public static void main( String[] args ) {
	
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities( profile );
      
      // The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Cube cube = new Cube();
		
      glcanvas.addGLEventListener( cube );
      glcanvas.setSize( 400, 400 );
		
      final JFrame frame = new JFrame ( " Multicolored cube" );
      frame.getContentPane().add( glcanvas );
      frame.setSize( frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
      final FPSAnimator animator = new FPSAnimator(glcanvas, 300,true);
		
      animator.start();
   }
	
}

Podczas kompilowania i wykonywania powyższego programu generowane są następujące dane wyjściowe. Pokazuje kolorową kostkę 3D.

Nakładanie tekstury na kostkę

Podano następujące kroki, aby zastosować teksturę do kostki -

  • Możesz powiązać wymaganą teksturę z kostką za pomocą gl.glBindTexture(GL2.GL_TEXTURE_2D.texture) metoda interfejsu Drawable.

  • Ta metoda wymaga argumentu texture (int) wraz z GL2.GL_TEXTURE_2D(int).

  • Zanim wykonasz Display(), musisz utworzyć zmienną tekstury

  • w init() metoda lub w liniach początkowych glDisplay() włącz teksturę using gl.glEnable(GL2.GL_TEXTURE_2D) metoda.

  • Utwórz obiekt tekstury, który wymaga obiektu pliku jako parametru, który z kolei wymaga ścieżki obrazu używanego jako tekstura do obiektu.

File file = new File(“c:\\pictures\\boy.jpg”);
Texture t = textureIO.newTexture(file, true);
texture = t.getTextureObject(gl);
  • Obsłuż wyjątek „nie znaleziono pliku”

Poniżej podany jest program do załączania obrazu na kostce.

import java.awt.DisplayMode;

import java.io.File;
import java.io.IOException;

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

import com.jogamp.opengl.util.FPSAnimator;
import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureIO;

public class CubeTexture implements GLEventListener {

   public static DisplayMode dm, dm_old;
   private GLU glu = new GLU();
   private float xrot,yrot,zrot;
   private int texture;
   
   @Override
   public void display(GLAutoDrawable drawable) {
   
      // TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
      gl.glLoadIdentity(); // Reset The View
      gl.glTranslatef(0f, 0f, -5.0f);
		
      gl.glRotatef(xrot, 1.0f, 1.0f, 1.0f);
      gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
      gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);
		
      gl.glBindTexture(GL2.GL_TEXTURE_2D, texture);
      gl.glBegin(GL2.GL_QUADS);

      // Front Face
      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);
      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);
      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);

      // Back Face
      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f);
      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f);
      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f);
      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f);

      // Top Face
      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f);
      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);
      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);
      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f);

      // Bottom Face
      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f);
      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f);
      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);
      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);

      // Right face
      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f);
      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f);
      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);
      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);

      // Left Face
      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f);
      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);
      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f);
      gl.glEnd();
      gl.glFlush();

      //change the speeds here
      xrot += .1f;
      yrot += .1f;
      zrot += .1f;
   }
   
   @Override
   public void dispose(GLAutoDrawable drawable) {
      // method body
   }
   
   @Override
   public void init(GLAutoDrawable drawable) {
	
      final GL2 gl = drawable.getGL().getGL2();
		
      gl.glShadeModel(GL2.GL_SMOOTH);
      gl.glClearColor(0f, 0f, 0f, 0f);
      gl.glClearDepth(1.0f);
      gl.glEnable(GL2.GL_DEPTH_TEST);
      gl.glDepthFunc(GL2.GL_LEQUAL);
      gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
      
      //
      gl.glEnable(GL2.GL_TEXTURE_2D);
      try{
		
         File im = new File("E:\\office\\boy.jpg ");
         Texture t = TextureIO.newTexture(im, true);
         texture= t.getTextureObject(gl);
          
      }catch(IOException e){
         e.printStackTrace();
      }
   }
      
   @Override
   public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
   
      // TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      if(height lt;= 0)
         height = 1;
			
      final float h = (float) width / (float) height;
      gl.glViewport(0, 0, width, height);
      gl.glMatrixMode(GL2.GL_PROJECTION);
      gl.glLoadIdentity();
		
      glu.gluPerspective(45.0f, h, 1.0, 20.0);
      gl.glMatrixMode(GL2.GL_MODELVIEW);
      gl.glLoadIdentity();
   }
   
   public static void main(String[] args) {
   
      // TODO Auto-generated method stub
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
      
      // The canvas
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      CubeTexture r = new CubeTexture();
		
      glcanvas.addGLEventListener(r);
      glcanvas.setSize(400, 400);
		
      final JFrame frame = new JFrame (" Textured Cube");
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
      final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true);
		
      animator.start();
   }
	
}

Podczas kompilowania i wykonywania powyższego programu generowane są następujące dane wyjściowe. Możesz zobaczyć kostkę 3D z nałożoną na nią pożądaną teksturą.

GPU - Graficzna jednostka przetwarzająca, to specjalne urządzenie elektroniczne, które przyspiesza renderowanie obrazów.

JNI- Natywny interfejs Java. Używając których, java uzyskuje dostęp do metod natywnych.

Model - Są to obiekty zbudowane z podstawowych prymitywów graficznych, takich jak punkty, linie i wielokąty.

Pixel - Najmniejsza jednostka wyświetlania widoczna na ekranie.

Projection - Metoda odwzorowania współrzędnych obiektu na dwuwymiarową płaszczyznę nazywa się rzutowaniem.

Projection matrix - Jest to liniowa transformacja obiektu na powierzchni 2D.

Rendering - Proces, w którym komputer tworzy obrazy z modeli.

Viewport - Rzutnia to obszar wyświetlania na ekranie w grafice komputerowej.