AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OpenGL - Allgemeine Fragen

Ein Thema von Destroxi · begonnen am 31. Okt 2011 · letzter Beitrag vom 2. Nov 2011
Antwort Antwort
Seite 1 von 2  1 2      
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#1

OpenGL - Allgemeine Fragen

  Alt 31. Okt 2011, 13:38
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:
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;
3. Rotationen mit Texturen
Ganz oft habe ich das Problem, dass man mit Texturen fast nichts machen darf, da sie sonst nicht angezeigt werden
Zum Bespiel hier (wenn ich glRotatef reinnehme zeigt er die Textur nicht mehr an.. warum?)
Zitat:
procedure TForm1.Render(Sender: TObject; var Done: Boolean);
begin
//glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewPort(0, 0, ClientWidth, ClientHeight);
glOrtho(0, MapSizeX, 0, MapSizeY, 0, 128);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glBindTexture(GL_TEXTURE_2D, Tex);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
//glRotatef(180, 0, 0, 1);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(MapSizeX/4, MapSizeY/4);
glTexCoord2f(1, 0); glVertex2f(MapSizeX-MapSizeX/4, MapSizeY/4);
glTexCoord2f(1, 1); glVertex2f(MapSizeX-MapSizeX/4, MapSizeY-MapSizeY/4);
glTexCoord2f(0, 1); glVertex2f(MapSizeX/4, MapSizeY-MapSizeY/4);
glEnd;

SwapBuffers(DC);

Done := False;
end;

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:
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;
Aber das hat wohl nicht ganz geklappt ^^ Kamen 3 komische Figuren bei raus ;O



Danke !

Geändert von Destroxi (31. Okt 2011 um 17:51 Uhr)
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#2

AW: OpenGL - Allgemeine Fragen

  Alt 31. Okt 2011, 14:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: OpenGL - Allgemeine Fragen

  Alt 31. Okt 2011, 14:54
1) Wenn die Texturen auf dem Kopf stehen, ist das normal. Die muss man selber zurechtspiegeln.
Dafür genügt es afaik die entsprechende Textur-Koordinate zu negieren.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: OpenGL - Allgemeine Fragen

  Alt 31. Okt 2011, 16:24
1) Werde ich gleich ma ausprobieren
2)
Zitat:
Du hast glaub ich an der falschen Stelle
Mhh ich glaube nicht ^^
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!
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#5

AW: OpenGL - Allgemeine Fragen

  Alt 31. Okt 2011, 21:55
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:
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);
Gegenstück zu GL_REPEAT ist GL_CLAMP. Dann kannst du in glTexCoord deine Parameter behalten.

Geändert von Cicaro (31. Okt 2011 um 22:05 Uhr)
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: OpenGL - Allgemeine Fragen

  Alt 31. Okt 2011, 22:17
Werde ich morgen ausprobieren, aber warum benutzt ihr alle "OpenGL."?
Ich schreib immer ohne das und es funzt alles^^

Mfg
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#7

AW: OpenGL - Allgemeine Fragen

  Alt 1. Nov 2011, 10:03
4. Bei glRotate ist glaub ich Bogenmaß gefragt. Also statt 180, PI.
Pi is wrong: Das Tau-Manifest

Werde ich morgen ausprobieren, aber warum benutzt ihr alle "OpenGL."?
Ich schreib immer ohne das und es funzt alles^^
Das ist das Unit-Präfix - das ist natürlich optional, liest sich aber einfach schöner und ist eindeutiger.
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#8

AW: OpenGL - Allgemeine Fragen

  Alt 1. Nov 2011, 11:17
Werde ich morgen ausprobieren, aber warum benutzt ihr alle "OpenGL."?
Delphi-Quellcode:
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);
Wenn du genauer hinschaust, steht bei glBindTexture kein "OpenGL.". Das ist, weil ich die Funktion in der Borland-Unit nicht finden konnte. Dann hab ich sie selber eingebunden. Und in Java kommt man nicht drum herum "GL." oder "GL11." vor die Funktionen zu schreiben, also mach ichs überall gleich. Außerdem muss ich die komischen Konstanten etc. nicht ausschreiben sondern blättere, nachdem ich "OpenGL." eingegeben habe, zu der richtigen mit der Codevervollständigung. Und letzter Grund: Gewohnheit mittlerweile.
Konstanten sind nicht wrong! Definiert ist definiert. Mit Defintionen muss man leben. Deswegen sagst du auch, dass
  • 5 + 3 * 2 = 16 (falsch)
  • 5 + 3 * 2 = 11 (richtig)
ist, obwohl es mit anderen Definitionen anders herum oder OHNE beides richtig wäre.

Geändert von Cicaro ( 1. Nov 2011 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#9

AW: OpenGL - Allgemeine Fragen

  Alt 1. Nov 2011, 11:33
Konstanten sind nicht wrong! Definiert ist definiert. Mit Defintionen muss man leben. Deswegen sagst du auch, dass
  • 5 + 3 * 2 = 16 (falsch)
  • 5 + 3 * 2 = 11 (richtig)
ist, obwohl es mit anderen Definitionen anders herum oder OHNE beides richtig wäre.
Wenn ich zu einer Konstanten sage, sie sei falsch, heißt das, sie ist schlecht definiert.
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.

Geändert von implementation ( 1. Nov 2011 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: OpenGL - Allgemeine Fragen

  Alt 1. Nov 2011, 13:37
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
Mein Code: (wo sie verschwinden)
Delphi-Quellcode:
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;
PS: Ich habe erst einen Typ gemacht!

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!

Geändert von Destroxi ( 1. Nov 2011 um 15:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz