Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Apr 28, 2024 23:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: TexturProblem (glBitmap.pas)
BeitragVerfasst: Do Mär 08, 2007 10:04 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Ich habe ein Problem beim Texturieren von Sonne Erde und Mond, die jeweils mit gluSphere gezeichnet werden. Bei der Sonne und der Erde werden die Texturen korrekt angezeigt, aber wenn die Texturen des Mondes und der Erde dazukommen bricht die Performance extrem (4fps) ein und die Textur des Mondes wird gar nicht dargestellt. Die Texturen werden bei Programmstart mit glBitmap geladen. Bei den Texturen handelt es sich um .tga Files der Größe 1000*500 pixel.
Kann es vielleicht daran liegen, dass die Texturen einfach zu groß sind und beim Vergeben der uv-Koordinaten auf den Spheres der Rechenaufwand einfach zu groß ist? Das mit Sonne, Erde, Mond stammt übrigens aus den Tutorial von Phobeus ;-) Danke für den Anreiz

Code:
  1. // =============================================================================
  2. //   OpenGL1.5 - VCL Template (opengl15_vcl_template.zip)
  3. // =============================================================================
  4. //   Copyright © 2003 by DGL - http://www.delphigl.com
  5. // =============================================================================
  6. //   Contents of this file are subject to the GNU Public License (GPL) which can
  7. // =============================================================================
  8. //   History :
  9. //    Version 1.0 - Initial Release                            (Sascha Willems)
  10. // =============================================================================
  11.  
  12. unit OpenGL15_MainForm;
  13.  
  14. interface
  15.  
  16. uses
  17.   Windows,
  18.   Messages,
  19.   SysUtils,
  20.   Classes,
  21.   Graphics,
  22.   Controls,
  23.   Forms,
  24.   Dialogs,
  25.   glBitmap,
  26.   dglOpenGL;
  27.  
  28. type
  29.   TGLForm = class(TForm)
  30.     procedure FormCreate(Sender: TObject);
  31.     procedure FormDestroy(Sender: TObject);
  32.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  33.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  34.   private
  35.     { Private-Deklarationen }
  36.   public
  37.     TexSonne,TexErdeD,TexMond,TexErdeN,TexUniverse  : TGluInt;
  38.     BerechnungsZeit : Int64;
  39.     Frequenz        : Int64;
  40.     Position        : Double;
  41.     Daytime   : boolean;
  42.     Angle,Angle2     : Extended;
  43.     Container : PGLUquadric;
  44.     RC        : HGLRC;
  45.     DC        : HDC;
  46.     ShowFPS   : Boolean;
  47.     FontBase  : GLUInt;
  48.     StartTick : Cardinal;
  49.     Frames    : Integer;
  50.     FPS       : Single;
  51.     procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  52.     procedure BuildFont(pFontName : String);
  53.     procedure PrintText(pX,pY : Integer; const pText : String);
  54.     procedure ShowText;
  55.   end;
  56.  
  57. var
  58.   GLForm: TGLForm;
  59.  
  60. implementation
  61.  
  62. {$R *.dfm}
  63.  
  64. // =============================================================================
  65. //  TForm1.GoToFullScreen
  66. // =============================================================================
  67. //  Wechselt in den mit den Parametern angegebenen Vollbildmodus
  68. // =============================================================================
  69. procedure TGLForm.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  70. var
  71.  dmScreenSettings : DevMode;
  72. begin
  73. // Fenster vor Vollbild vorbereiten
  74. WindowState := wsMaximized;
  75. BorderStyle := bsNone;
  76. ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  77. with dmScreenSettings do
  78.  begin
  79.  dmSize              := SizeOf(dmScreenSettings);
  80.  dmPelsWidth         := pWidth;                    // Breite
  81.  dmPelsHeight        := pHeight;                   // Höhe
  82.  dmBitsPerPel        := pBPP;                      // Farbtiefe
  83.  dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
  84.  dmFields            := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  85.  end;
  86. if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  87.  begin
  88.  MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  89.  exit
  90.  end;
  91. end;
  92.  
  93. // =============================================================================
  94. //  TForm1.BuildFont
  95. // =============================================================================
  96. //  Displaylisten für Bitmapfont erstellen
  97. // =============================================================================
  98. procedure TGLForm.BuildFont(pFontName : String);
  99. var
  100.  Font : HFONT;
  101. begin
  102. // Displaylisten für 256 Zeichen erstellen
  103. FontBase := glGenLists(96);
  104. // Fontobjekt erstellen
  105. Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  106.                        ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, PChar(pFontName));
  107. // Fontobjekt als aktuell setzen
  108. SelectObject(DC, Font);
  109. // Displaylisten erstellen
  110. wglUseFontBitmaps(DC, 0, 256, FontBase);
  111. // Fontobjekt wieder freigeben
  112. DeleteObject(Font)
  113. end;
  114.  
  115. // =============================================================================
  116. //  TForm1.PrintText
  117. // =============================================================================
  118. //  Gibt einen Text an Position x/y aus
  119. // =============================================================================
  120. procedure TGLForm.PrintText(pX,pY : Integer; const pText : String);
  121. begin
  122. if (pText = '') then
  123.  exit;
  124. glPushAttrib(GL_LIST_BIT);
  125.  glRasterPos2i(pX, pY);
  126.  glListBase(FontBase);
  127.  glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText));
  128. glPopAttrib;
  129. end;
  130.  
  131. // =============================================================================
  132. //  TForm1.ShowText
  133. // =============================================================================
  134. //  FPS, Hilfstext usw. ausgeben
  135. // =============================================================================
  136. procedure TGLForm.ShowText;
  137. begin
  138. // Tiefentest und Texturierung für Textanzeige deaktivieren
  139. glDisable(GL_DEPTH_TEST);
  140. glDisable(GL_TEXTURE_2D);
  141. // In orthagonale (2D) Ansicht wechseln
  142. glMatrixMode(GL_PROJECTION);
  143. glLoadIdentity;
  144. glOrtho(0,640,480,0, -1,1);
  145. glMatrixMode(GL_MODELVIEW);
  146. glLoadIdentity;
  147. PrintText(5,15, FloatToStr(FPS)+' fps');
  148. glEnable(GL_DEPTH_TEST);
  149. glEnable(GL_TEXTURE_2D);
  150. end;
  151.  
  152. // =============================================================================
  153. //  TForm1.FormCreate
  154. // =============================================================================
  155. //  OpenGL-Initialisierungen kommen hier rein
  156. // =============================================================================
  157. procedure TGLForm.FormCreate(Sender: TObject);
  158. begin
  159. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  160. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  161. // Gerätekontext ungültig wird!
  162.  GoToFullscreen(1280, 1024, 32, 75);
  163.                      
  164.   if not QueryPerformanceFrequency(Frequenz) then // Frequenz ermitteln
  165.    raise Exception.create('Kein Hardware Timer vorhanden');
  166.   QueryPerformanceCounter(BerechnungsZeit); // Aktuelle Zeit ermitteln
  167.  
  168. // OpenGL-Funtionen initialisieren
  169. InitOpenGL;
  170. // Gerätekontext holen
  171. DC := GetDC(Handle);
  172. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  173. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  174. // Erstellten Renderkontext aktivieren
  175. ActivateRenderingContext(DC, RC);
  176. // Tiefenpuffer aktivieren
  177. glEnable(GL_DEPTH_TEST);
  178. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  179. glDepthFunc(GL_LESS);
  180. // Löschfarbe für Farbpuffer setzen
  181. glClearColor(0,0,0.2,0);
  182. // Displayfont erstellen
  183. BuildFont('MS Sans Serif');
  184. // Idleevent für Rendervorgang zuweisen
  185. Application.OnIdle := ApplicationEventsIdle;
  186. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  187. StartTick := GetTickCount;
  188. LoadTexture('myTex\sunmap.tga',TexSonne,false);
  189. LoadTexture('myTex\earthmap.tga',TexErdeD,false);
  190. LoadTexture('myTex\earthnightmap.tga',TexErdeN,false);
  191. LoadTexture('myTex\mond.tga',TexMond,false);
  192. LoadTexture('myTex\universe.tga',TexUniverse,false);
  193. glGetError;
  194. end;
  195.  
  196. // =============================================================================
  197. //  TForm1.FormDestroy
  198. // =============================================================================
  199. //  Hier sollte man wieder alles freigeben was man so im Speicher belegt hat
  200. // =============================================================================
  201. procedure TGLForm.FormDestroy(Sender: TObject);
  202. begin
  203. {glDeleteTextures(1,texSonne);
  204. glDeleteTextures(1,texErde);
  205. glDeleteTextures(1,texMond);}
  206. gluDeleteQuadric(Container);
  207. // Renderkontext deaktiveren
  208. DeactivateRenderingContext;
  209. // Renderkontext "befreien"
  210. wglDeleteContext(RC);
  211. // Erhaltenen Gerätekontext auch wieder freigeben
  212. ReleaseDC(Handle, DC);
  213. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  214. ChangeDisplaySettings(devmode(nil^), 0);
  215. end;
  216.  
  217. //==============================================================================
  218. // Der Render-Abschnitt
  219. //==============================================================================
  220. // Hier werden die Objekte gerendert.
  221. //==============================================================================
  222.  
  223.  
  224.  
  225. // =============================================================================
  226. //  TForm1.ApplicationEventsIdle
  227. // =============================================================================
  228. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  229. // =============================================================================
  230. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  231. var i:integer;
  232.     AktuelleZeit: Int64;
  233. begin
  234. // Farb- und Tiefenpuffer löschen
  235. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  236. // In die Projektionsmatrix wechseln
  237. glMatrixMode(GL_PROJECTION);
  238. // Identitätsmatrix laden
  239. glLoadIdentity;
  240. // Viewport an Clientareal des Fensters anpassen
  241. glViewPort(0, 0, ClientWidth, ClientHeight);
  242. // Perspective, FOV und Tiefenreichweite setzen
  243. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  244.  
  245. // In die Modelansichtsmatrix wechseln
  246. glMatrixMode(GL_MODELVIEW);
  247. // Identitätsmatrix laden
  248. glLoadIdentity;
  249. Container := gluNewQuadric();
  250. glRotatef(Angle,1,0,0);
  251. glPushMatrix();
  252. glRotatef(90,1,0,0);
  253. glDepthMask(false);
  254. glBindTexture(GL_TEXTURE_2D,TexUniverse);
  255. glEnable(GL_TEXTURE_2D);
  256. gluQuadricTexture(Container,true);
  257. gluSphere(Container,3,10,10);
  258. glDisable(GL_TEXTURE_2D);
  259. glDepthMask(true);
  260. glPopMatrix();
  261. glTranslatef(0,0,-10);
  262. glTranslatef(0,0,Angle2);
  263. //glRotatef(Angle,1,0,0);
  264.   glBindTexture(GL_TEXTURE_2D,TexSonne);
  265.   glEnable(GL_TEXTURE_2D);
  266.   //glColor3f(255,140,0);
  267.   //gluQuadricTexture(Container,true);
  268.   gluSphere(Container,1,40,40);
  269.   glDisable(GL_TEXTURE_2D);
  270.  
  271.   glRotatef(Position,0,1,0);
  272.   glPushMatrix();
  273.     glTranslatef(-4,0,0);
  274.     glRotatef(90,1,0,0);
  275.     if DayTime = false then
  276.       glBindTexture(GL_TEXTURE_2D,TexErdeD);
  277.     if Daytime = true then
  278.       glBindTexture(GL_TEXTURE_2D,TexErdeN);
  279.     glEnable(GL_TEXTURE_2D);
  280.     gluQuadricTexture(Container,true);
  281.     //glColor3f(0,0,255);
  282.     gluSphere(Container,0.5,20,20);
  283.     glDisable(GL_TEXTURE_2D);
  284.       glPushMatrix();
  285.         glRotatef(Position*5,0,0,1);
  286.         glTranslatef(-1,0,0);
  287.         glBindTexture(GL_TEXTURE_2D,TexMond);
  288.         glEnable(GL_TEXTURE_2D);
  289.         gluSphere(Container,0.1,10,10);
  290.         glDisable(GL_TEXTURE_2D);
  291.       glPopMatrix();
  292.     glRotatef(90,1,0,0);
  293.   glPopMatrix();
  294. ShowText;
  295.  
  296. // Hinteren Puffer nach vorne bringen
  297. SwapBuffers(DC);
  298.  
  299. // Windows denken lassen, das wir noch nicht fertig wären
  300. Done := False;
  301.  
  302. // Nummer des gezeichneten Frames erhöhen
  303. inc(Frames);
  304. // FPS aktualisieren
  305. if GetTickCount - StartTick >= 500 then
  306.  begin
  307.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  308.  Frames    := 0;
  309.  StartTick := GetTickCount
  310.  end;
  311.  QueryPerformanceCounter(AktuelleZeit);
  312.  Position := 10*((AktuelleZeit-Berechnungszeit)/Frequenz)+Position;
  313.  Berechnungszeit := AktuelleZeit;
  314.  if Position = 360 then
  315.    Position := 0;
  316.  
  317.  glGetError;
  318. end;
  319.  
  320. // =============================================================================
  321. //  TForm1.FormKeyPress
  322. // =============================================================================
  323. procedure TGLForm.FormKeyPress(Sender: TObject; var Key: Char);
  324. begin
  325. case Key of
  326.  #27 : Close;
  327.  #119: Angle := Angle+2;
  328.  #115: Angle := Angle-2;
  329.  #110: DayTime := true;
  330.  #100: Daytime := false;
  331.  #113: Angle2 := Angle2+0.5;
  332.  #101: Angle2 := Angle2-0.5;
  333.  
  334. end;
  335. end;
  336.  
  337. end.


Hier is der Downloadlink für das komplette Projekt, weil ihr ja die Texturen nicht habt: http://rapidshare.com/files/19979684/Sonnensystem.rar.htmll


Zuletzt geändert von bluenavajo am Do Mär 08, 2007 16:19, insgesamt 5-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 10:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich habe ein Déjà Vu. ;)

Die Texturen müssen als Höhe/Breite eine Potenz von 2 haben. Passe deine Textur mal auf 1024x512 an. Demit sollte es dann gehen. Und die Größe ist schon recht anständig aber ich denke das ist alles noch halb so wild.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: re
BeitragVerfasst: Do Mär 08, 2007 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Jo nur gehts. Danke! Aber die Textur für den Mond seh ich immernoch nich. Kann es sein, dass die Textur für den kleinen Popelmond einfach zu groß is und ich deswegen nichts seh?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hmmm. Also eigentlich sieht das soweit okay aus. Du machst ja bei dem Mond nichts anders als wie bei der Erde. Und gluSphere benutzt automatisch die gesammte Größe der Textur. Von daher sollte das so gehen.

Prüfe mal an verschiedenen Stellen (Nach dem Initialisieren, Nach dem Rendern) ob du Fehler bekommen hat. Das geht mit dem Aufruf von glGetError. Wenn ja dann schaue mal ob du das evtl noch etwas näher eingrenzen kannst.

Du solltest im übrigen deine mit gluNewQuadric erstellten quadrics auch wieder frei geben. Sonst hast du ein Speicherloch. Und eigentlich sollte ein quadric auch reichen.

PS: Stehen deine Texturen eigentlich auf dem Kopf? "Normal" sollten sie es.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 14:14 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Nein die stehen glaub ich nicht auf dem Kopf. Das war doch bei dem Loader dass er die Texturen umgekehrt in den Speicher schreibt oder? Also ich hab das nichts verändert. Ich musste nur die Erde einnal um 90° drehen weil die Textur so auf der Seite zu liegen schien. Bei der Gelegenheit: Kannst du mir auch noch erklären wie das mit den glDeleteTextures funktioniert. Das hatte ich unten auskommentiert, weil es irgendwie nich ging. PS: Ich hab oeben nochmal den neuen code gepostet. Nach dem Initialisieren und nach dem Rendern liefert glGetError keine Meldung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Ich hab da noch eine Sache entdeckt. Wenn ich versuchshalber mal die Texturen vom Mond weglasse und ihm einfach nur eine Farbe gebe (ich hab Magenta genommen) dann wird nicht nur der Mond bunt, sondern auch Sonne und Erde inklusive der Textur darauf.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 14:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Auf der Seite liegen. Hmmm. Finde ich irgendwie seltsam. Na ja. Lässt sich ja alles drehen. Und ja ich lade die Texturen anders als alle anderen. Weil ich es nicht einsehe, dass sie auf dem Kopf stehen müssen vor allem, wenn einige Funktionen von OpenGL Texturen so verlangen wie ich sie habe. ;)

quadrics gibst du mit dem Befehl gluDeleteQuadric wieder frei.

Bei glDeleteTextures übergibst du eine Anzahl und einen Pointer auf die die TextureID und schon ist sie gelöscht. Du kannst sowohl bei GenTexture als auch bei DeleteTextures mehrere Namen erstellen oder freigeben lassen. Das sind normal Arrays oder besser gesagt ein Pointer auf das erste Element. Aber wenn man nur eine hat, dann kann man auch direkt einen Pointer auf eine Variable übergeben.

Code:
  1. glDeleteTextures(1, @TexMond);


PS: Ich persönlich empfehle eigentlich eher die Benutzung der Klasse TglBitmap2D die in der glBitmap.pas enthalten ist. Weil die Möglichkeiten die man mit der Funktion hat entsprechen in etwa 5% dessen was man mit der Klasse an Möglichkeiten hat. Wenn es ausreicht. Okay. Aber so würde sich die Klasse komplett um die Verwaltung kümmern und hätte mehr Einstellungsmöglichkeiten.

Zu dem Mond. Ich habe keine Ahnung woran das liegen könnte. Ich bin derzeit auf Arbeit. Da kann ich nicht aber wenn ich heute abend zu hause bin, dann schaue ich mir das mal in ruhe an. Ich denke dann sollte sich das auch klären lassen.

Bunt: Du musst vor dem Zeichnen der Sonne natürlich dort die normale Farbe wieder setzen. OpenGL merkt sich das über die Framegrenzen hinweg. Aber was du mit Bunt beim Mond meinst verstehe ich nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 15:02 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Ok Problem gelöst. Es lag an der Mondtextur. Die .tga Datei schien wohl irgendwie beschädigt. Ich habs mal mit ner anderen MondTextur im Jpeg Format versucht und dann ging es.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Konntest du die Textur in Grafikprogrammen laden? Falls ja könntest du mir die evtl mal per Mail zuschicken? Meine Adresse findest du auf der Teamseite. Da ich TGAs vollständig per Hand lade versuche ich die natürlich bestmöglich zu unterstützen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 16:02 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Klar schick ich dir. Ich hab die Textur erst im Jpeg Format gehabt und dann mit Adobe Photoshop CS in nen Tga File umgewandelt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 16:18 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Hier mal nen kleines Foto vom Ergebnis. PS.: Ich hab den Quelltext oben nochmal geändert.
Würd mich freuen wenn ihr vielleicht mal nen kleines Statement dazu abgeben könntet.
Habt ihr ne Idee wie man z.B ne Atmosphäre um die Erde Rendern kann?

http://img403.imageshack.us/img403/2349/sonnensystemcm1.jpg

// edit Lossy: Das Bild ist von den Ausmaßen ein bisschen Groß deswegen als Link


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Sieht schon ganz hübsch aus, nur die Universum-textur sieht etwas verwaschen aus.
Für die Atmosphäre könntest du noch eine etwas größere Kugel um die Erde zeichnen mit
Wolkentextur und Additivem oder Alpha Blending. Die Textur sollte sich dann natürlich auch bewegen, das kannst
du dann ganz bequem per TextureMatrix machen. (einfach in den TextureMatrix Modus wechseln und dann die Textur translaten)
Gruß,
Matreno

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 07, 2006 20:20
Beiträge: 20
Ich hab leider keine bessere Textur für die Sky Sphere bekommen. Weiss jemand von euch wo man etwas höher aufgelöstes bekommt oder wie man das allgemein besser hinbekommt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 18:01 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Die Nasa kann helfen:
http://visibleearth.nasa.gov/view_set.php?categoryID=2364
Sogar mit 21600 x 10800 falls interesse besteht :)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 08, 2007 18:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe mir die Textur einmal angesehen und ich weiß was das "Problem" dabei ist. Diese Textur ist ein Graustufenbild. Das bedeutet, dass das Bild nur einen einzigen Kanal mitbringt. Wärend aber bei dem JPEG 3 Kanäle vorhanden sind. Die aber alle 3 das Gleiche beinhalten. (Wobei JPEG auch Graustufen kann.) In jedem Falle ist eine Textur mit nur einem Kanal auch wesentlich Speicherschonender. Bei der Größe der Texturen nicht unbedingt von Nachteil. ;)

Die glBitmap nimmt bei einen Kanal diesen immer als Alpha. Das hat dafür gesorgt, dass du keine Farbe hattest obwohl das Bild richtig geladen wurde. Mit der Methode LoadTextures kannst du darauf keinen Einfluss nehmen. Objekt orientiert sähe der entsprechende Code wie folgt aus.

Code:
  1.   Tex := TglBitmap2D.Create;
  2.   Tex.LoadFromFile('moonmap.tga');
  3.   Tex.InternalFormat := ifLuminance;  // Das ist wichtig. Dort wird ein anderes Format gesetzt.
  4.   Tex.GenTexture;


Wenn du gerne mit IDs arbeitest benötigst du noch dieses Stück.

Code:
  1.   MoonID := Tex.ID;
  2.   Tex.DeleteTextureOnFree := False;  // Verhindert, dass die Texture gelöscht wird
  3.   Tex.Free;


Die ist dann genau wie die Methode LoadTextures. Nur, dass für die eine spezielle Textur das Format geändert wird.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.045s | 15 Queries | GZIP : On ]