![]() |
OpenGL - Allgemeine Fragen
Hi,
da ich in letzter Zeit öfters Fragen zu OpenGL hatte (und manche schon selber beantwortet hatte bevor eine Antwort kam), möchte ich hier ein Thread erstellen, wo ich alle meine Fragen hineinschreibe, damit das Forum sauber bleibt ;) Wenn ich lieber neue Threads erstellen soll, schreibt es mir hier rein oder schreibt mir eine Nachricht. Danke :) Fragen 1. DDS Dateien Laden Ich will .dds dateien laden. Nun kenne ich den glBitmap loader, allerdings funktioniert dieser bei mir nicht richtig. Ich lade die Datei (egal, ob *.dds oder *.bmp oder *.tga) aber das Bild wird falsch geladen (bzw. anders als bei Textures.pas). Hat jemand einen loader der läd wie Textures.pas? €dit: Anders geladen = Meine Flugzeug Textur wird in der falschen Richtung geladen und bei der Gras (Boden) Textur verändert er die Größe nicht... €dit²: Ich weiß wie, nur klappt es nicht (Rotieren), allerdings wird die Frage schon in Nr. 3 gefragt, deswegen Abgeschlossen Erledigt 2. Texturen verdopplung Wie verdopple ich Texturen? Habe es so versucht (leider nicht geklappt), dachte dan kämen vielleicht unten eine (in der größer von einer halben) und oben eine
Delphi-Quellcode:
3. Rotationen mit Texturen
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(-AWidth/2, -AHeight/2); glTexCoord2f(1, 0); glVertex2f(AWidth/2, -AHeight/2); glTexCoord2f(1, 2); glVertex2f(AWidth/2, AHeight/2); glTexCoord2f(0, 2); glVertex2f(-AWidth/2, AHeight/2); glEnd; Ganz oft habe ich das Problem, dass man mit Texturen fast nichts machen darf, da sie sonst nicht angezeigt werden :o Zum Bespiel hier (wenn ich glRotatef reinnehme zeigt er die Textur nicht mehr an.. warum?) Zitat:
4. GL_QUAD_STRIP bei Texturen Kann ich "GL_QUAD_STRIP" also mehrere Quadrate bei Texturen verwenden? Wenn ja, wie - wo die TexCoords angeben? Habe es versucht:
Delphi-Quellcode:
Aber das hat wohl nicht ganz geklappt ^^ Kamen 3 komische Figuren bei raus ;O
glBegin(GL_QUAD_STRIP);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0); glTexCoord2f(1, 0); glVertex3f(MapSizeX/2, 0, 0); glTexCoord2f(1, 1); glVertex3f(MapSizeX/2, MapSizeY, 0); glTexCoord2f(0, 1); glVertex3f(0, MapSizeY, 0); glTexCoord2f(0, 0); glVertex3f(MapSizeX/2, 0, 0); glTexCoord2f(1, 0); glVertex3f(MapSizeX, 0, 0); glTexCoord2f(1, 1); glVertex3f(MapSizeX, MapSizeY, 0); glTexCoord2f(0, 1); glVertex3f(MapSizeX/2, MapSizeY, 0); glEnd; Danke ! |
AW: OpenGL - Allgemeine Fragen
1) Wenn die Texturen auf dem Kopf stehen, ist das normal. Die muss man selber zurechtspiegeln.
2) Bei glTexCoord2f(); kommen die Textur-Koordinaten rein (welchen Teil der Textur zeichnet man) und bei glVertex2f(); die Weltkoordinaten (wo und wie (groß) zeichnet man den Texturteil). Du hast glaub ich an der falschen Stelle (glTextCoord) den Verdoppelungstrick angewendet. |
AW: OpenGL - Allgemeine Fragen
Zitat:
|
AW: OpenGL - Allgemeine Fragen
1) Werde ich gleich ma ausprobieren
2) Zitat:
Ich will in einem Viereck was voher zum Beispiel Width=4; Height=4; groß war und eine Textur drinne war 2 Texturen über einander haben... Dazu muss ich ja nicht das Quadrat vergrößern sondern die Textur (bei glTexCoord2f) oder? Dazu habe ich noch die Frage, ob eine Textur "neu anfängt" bei 1 und bei 2 ihr "neues Ende" hat. Falsche Bezeichnungen ich weiß, aber ich hoffe ihr wisst was ich meine ;) Danke! |
AW: OpenGL - Allgemeine Fragen
Ich habe 5 Sachen anzumerken:
1. glViewport würde ich nicht bei jedem Rendern aufrufen. Dies initialisiert den Viewport. Man weiß nicht wie langsam es ist und es muss nicht allzuoft benutzt werden. 2. Entferne beim Testen und Experimentieren alle Variablen aus dem Code und verwende nur konstante Zahlen. Dann sieht man, was man macht. 3. Du solltest dir möglichst bald die Verwendung von glPushmatrix und glPopmatrix angewöhnen. Du wirst dir die Finger brechen ohne Matrizenstacks größere Projekte umzusetzen. 4. Bei glRotate ist glaub ich Bogenmaß gefragt. Also statt 180, PI. 5. Schalte auch alles "unnötige" aus, wenn du dir über die OpenGL-Programmierung noch unsicher bist. Alpha test aus, blend aus, depth test aus und sich erstmal herantasten. Das sind nur die Dinge, diemir in deinem Code aufgefallen sind. Ob das hilft, sei dahingestellt. Außer, dass man die Textur 2x neben sich selbst zeichnen kann, kann man Folgendes benutzen:
Delphi-Quellcode:
Gegenstück zu GL_REPEAT ist GL_CLAMP. Dann kannst du in glTexCoord deine Parameter behalten.
glBindTexture(OpenGL.GL_TEXTURE_2D, ID);
OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_REPEAT); OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_REPEAT); |
AW: OpenGL - Allgemeine Fragen
Werde ich morgen ausprobieren, aber warum benutzt ihr alle "OpenGL."?
Ich schreib immer ohne das und es funzt alles^^ Mfg |
AW: OpenGL - Allgemeine Fragen
Zitat:
![]() Zitat:
|
AW: OpenGL - Allgemeine Fragen
Zitat:
Zitat:
Zitat:
|
AW: OpenGL - Allgemeine Fragen
Zitat:
Und wenn eine Konstante schlecht definiert ist, muss man eine bessere Alternative schaffen. Der Satz ist mehr als Aufhänger gedacht, damit man weiter liest. OK, mal ein anderer Satz, der im Zusammenhang mit Tau oft verwendet wird: The Pi is a lie. |
AW: OpenGL - Allgemeine Fragen
KK erstma danke werde jetzt alles ausprobieren ;D
€dit: Wegen der Rotation: ich weiß warum ich es nicht gesehen habe, es war außerhalb des Bildschirmes, deswegen meine Frage: Wie drehe ich ein Objekt auf einer Stelle? €dit²: Neue Frage: Wie lasse ich (für Tetris) die Objekte die herunterfallen nicht verschwinden? Am besten so, dass ich sie nicht immer neu zeichnen muss :o Mein Code: (wo sie verschwinden)
Delphi-Quellcode:
PS: Ich habe erst einen Typ gemacht!
procedure TForm1.Render(Sender: TObject; var Done: Boolean);
begin // Altes löschen glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Karte und sehfeld einstellen kommt noch in OnCreate - Event glMatrixMode(GL_PROJECTION); glLoadIdentity; glViewport(0, 0, ClientWidth, ClientHeight); glOrtho(0, SizeX, 0, SizeY, -128, 128); glMatrixMode(GL_MODELVIEW); glLoadIdentity; // Prüfen ob ein Block grade runterfällt, wenn nicht, erstelle einen neuen If SelBlock.Typ = 0 then begin SelBlock.Typ := 1; // Kommt noch Zufalls-Funkt. hin SelBlock.pX := SizeX/2-TypDaten[SelBlock.Typ].pWidth/2; SelBlock.pY := SizeY; end; // Den jeweiligen Typen erstellen glBegin(GL_QUADS); glColor3f(TypDaten[1].Red, TypDaten[1].Green, TypDaten[1].Blue); glVertex3f(SelBlock.pX, SelBlock.pY, 0); glVertex3f(SelBlock.pX, SelBlock.pY-TypDaten[SelBlock.Typ].pHeight, 0); glVertex3f(SelBlock.pX+TypDaten[SelBlock.Typ].pWidth, SelBlock.pY-TypDaten[SelBlock.Typ].pHeight, 0); glVertex3f(SelBlock.pX+TypDaten[SelBlock.Typ].pWidth, SelBlock.pY, 0); glEnd; // Objekt weiterfallen lassen If SelBlock.pY > TypDaten[SelBlock.Typ].pHeight then SelBlock.pY := SelBlock.pY - 2 else SelBlock.Typ := 0; SwapBuffers(DC); Done := False; end; Tutorial-Frage Da ich sehr viele Fragen habe, würde ich gerne ein Tutorial wissen, wo auf OpenGL 2D Spiele Programmierung eingegangen wird, und später dann vielleicht auch 3D. Weiß da jemand eins? Danke! |
AW: OpenGL - Allgemeine Fragen
Zitat:
Zitat:
![]() |
AW: OpenGL - Allgemeine Fragen
Du suchst Tutorials?
1) Surf mal zu ![]() 2) Die DelphiGL-Tutorials sind auch mehr als einen Blick wert: ![]() 3) Sich durch den Code von ![]() (ich habe mir so am Anfang das meiste OpenGL-Zeugs angeeignet, indem ich manche Bugs von GLScene beseitigt habe / einiges davon erweitert habe) P.S (nur so als Info, weil du sagst "zuerst 2D, dann später 3D"): In OpenGL ist eigentlich alles 3D, da es eine reine 3D-API ist. OpenGL für 2D zu Verwenden heisst eigentlich nichts anderes als ein konsequentes Ignorieren der Z-Achse, da man bei einer 3D-API ja immer die 3. Dimension wegnehmen kann (im Gegensatz zu einer 2D-API, bei der man die dritte Dimension nicht so einfach "dazuzaubern" könnte). Die API für die 2D-Verwendung bleibt aber in OpenGL die gleiche wie bei 3D, somit ist es vom Schwierigkeitsgrad her nicht sonderlich viel einfacher, 2D damit zu machen, eher im Gegenteil, da man bei Verwendung von 2D eben eine Koordinate / Achse konsequent ignorieren muss, die der API innewohnt :-) Somit kannst du 2D in OpenGL eher als Sonderform bzw. eine spezielle Verwendungsmöglichkeit ansehen, die meisten Tutorials sind aber für den 3D Gebrauch und gehen nur am Rande auf den 2D-Gebrauch ein. 2D in OpenGL funktioniert, keine Frage, und das sehr gut sogar :-) Ich wollte dir damit nur sagen, dass du gleich mit 3D starten kannst, wenn dich OpenGL interessiert, da es von der Lernkurve her kaum einen Unterschied macht. (Ausserdem lernst du beim 3D-Gebrauch noch viel mehr den Umgang mit Matrizen, was einer der Kernpunkte bei OpenGL überhaupt ist..und je früher du damit lernst umzugehen, umso besser :-)) |
AW: OpenGL - Allgemeine Fragen
Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz