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

Aktuelle Zeit: Sa Jun 08, 2024 03:48

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur gespiegelt
BeitragVerfasst: Mo Apr 02, 2012 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Moin,

bevor ich mich weiter damit beschäftigen kann, wie man prüft ob eine Kugel eine Ebene trifft, muss ich erstmal aufräumen. Meine Projekte sind einfach zu unaufgeräumt und ein klares und vor allem logisches Denken ist kaum noch möglich, eine einzelne Codezeile hat meist eine andere Wirkung als man es erwartet und so kann ich einfach nicht mehr weiterarbeiten. Effektiv bedeutet das, dass ich Units auf Funktion prüfe.

Um die Units wirklich zu testen nehme ich offensichtlich funktionierende Projekte und ersetze deren Units durch eigene um zu schauen, ob meine Units in der Funktion und Bedienung her einigermaßen einem Standard entsprechen, sodass ich endlich weniger Ärger habe. Da mich das Terrain-Tutorial eh interessierte, nahm ich den Code vom ersten und begann auch direkt zu experimentieren damit, sodass jetzt eine Mischung aus Tutorial1 und 2 vorhanden ist. Nachdem ich mich da ausgetobt hatte, habe ich endlich doch mal was sinnvolleres getan und die mitgelieferte Textures.pas durch meine uTexture.pas ersetzt, sowie mein SDL-Gerüst eingebaut etc., da ja auch die uTexture SDL verwendet. Und siehe da: Die Skybox ist vertikal gespiegelt. Da wegen unvollständigen SDL-Gerüst-Einbau keine Drehung möglich, kann ich nur sagen dass die zunächst sichtbare Skybox-Seite vertikal gespiegelt ist. Kurz: Ich habe die mitgelieferte Textures.pas durch meine ersetzt und es läuft nicht mehr.
Ich habe das eben geschildert, weil sonst würde der Verdacht direkt auf irgendetwas programminternes fallen, denn Ihr müsst bedenken, dass meine Unit seit Jahren erfolgreich eingesetzt wird und es erstmal komisch erscheint, dass in ihr ein Fehler sein soll - in meinen Augen ist der Fehler sehr wahrscheinlich in ihr, denn es ist so auffällig, dass der Fehler direkt auftritt, wenn ich die Textur-Units austausche.

Im Folgenden die Unit, sämtliche Funktionen die ich bei der Skybox weder direkt noch indirekt nutze, sind nicht aufgeführt. Ich wünschte ich könnte den Fehler einschränken, jedoch habe ich keine Ahnung was hier schiefgeht.
Zur Funktion: Ich rufe LoadTexture('...', irgendeineId) auf und lade so die Texturen, Id ist eine Ganzzahl, jeder Textur ist eine eindeutige Ganzzahl zugeordnet. Mit Bind binde ich die Textur, wobei zu beachten ist, dass Bind(Id) erwartet, dass nicht Id sondern Id-1 angegeben wird - das ist verwirrender Mist, den ich noch verbessern werde.
Die Skybox wird recht weit oben im Terrain-Tutorial behandelt und der Code zum Laden und zeichnen ist genau dieser, eben bis auf den Einsatz meiner Unit, deren Aufruf-Funktionsweise ich eben ja schon kurz erklärt habe.

Das sind die wesentlichen Stellen die Ihr wissen solltet, mehr einschränken kann ich leider nicht. Sieht hier irgendjemand einen Fehler ?
Code:
  1. unit uTexture;                                                  
  2.  
  3. interface
  4.  
  5. uses SDL, SDLUtils, SDLImage, dglOpenGL, SysUtils, uBase;
  6.  
  7. type
  8.   TTextur = record
  9.     Id     : Integer;
  10.     Textur : GluInt;
  11.   end;
  12.   TDynTexArr = Array of TTextur;
  13.  
  14. function LoadTexture(Filename : String; aId : Integer) : Boolean; // Textur aus Datei laden und mit definierten Index in Texturarray schreiben
  15. procedure SwapBGR(SDLSurface : PSDL_Surface);                                           // Farben vertauschen
  16. procedure Bind(Id : Integer);                                                           // Textur binden
  17.  
  18. implementation
  19.  
  20. uses
  21.   uVars;
  22.  
  23. // OpenGL-Textur erstellen
  24. function CreateTexture(SDL_Surface : PSDL_Surface) : Integer;
  25. var tmpInitial : PSDL_Surface;
  26.       Texture    : GluInt;
  27.     MaxAni     : Real;
  28. begin
  29.   // Es ist nicht klar, ob die Funktion erfolgreich durchläuft.
  30.   Result := -1;
  31.   if Assigned(SDL_Surface) then
  32.   begin
  33.     // Für Alphakanal
  34.     tmpInitial := SDL_DisplayFormatAlpha(SDL_Surface);
  35.     SDL_FreeSurface(SDL_Surface);
  36.     // Da der Alphakanal die Farben vertauscht, muss dies über SwapRGB gerade gebogen werden.
  37.     SwapBGR(tmpInitial);
  38.  
  39.     glGenTextures(1, @Texture);
  40.     glBindTexture(GL_TEXTURE_2D, Texture);
  41.     // Die Größen werden automatisch berechnet. Sonst wären nur Potenzen von 2 möglich (16x16, 32x32, usw.).
  42.     if tmpInitial.format.BytesPerPixel > 3 then
  43.       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tmpInitial^.w, tmpInitial^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmpInitial^.pixels)
  44.     else
  45.       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tmpInitial^.w, tmpInitial^.h, 0, GL_RGB, GL_UNSIGNED_BYTE, tmpInitial^.pixels);
  46.     // Textureigenschaften setzen
  47.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
  48.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  49.     if IsExtensionSupported('GL_EXT_texture_filter_anisotropic') then
  50.     begin
  51.       glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, @MaxAni);
  52.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, MaxAni/2);
  53.     end;
  54.     glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  55.     glGenerateMipmap(GL_TEXTURE_2D);
  56.     // Mipmaps generieren
  57.     if tmpInitial.format.BytesPerPixel > 3 then
  58.       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tmpInitial^.w, tmpInitial^.h, GL_RGBA, GL_UNSIGNED_BYTE, tmpInitial^.pixels)
  59.     else
  60.       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, tmpInitial^.w, tmpInitial^.h, GL_RGB, GL_UNSIGNED_BYTE, tmpInitial^.pixels);
  61.     // Freigabe
  62.     SDL_FreeSurface(tmpInitial);
  63.     // Rückgabe
  64.     Result := Texture;
  65.   end;
  66. end;
  67.  
  68. // Textur aus Datei laden und mit definierten Index in Texturarray schreiben
  69. function LoadTexture(Filename : String; aId : Integer) : Boolean;
  70. begin
  71.   Result := False;
  72.   if FileExists(Filename) then
  73.   begin
  74.     SetLength(Tex, High(Tex)+2);
  75.     with Tex[High(Tex)] do
  76.     begin
  77.       Id     := Succ(aId);
  78.       Textur := CreateTexture(IMG_Load(PChar(Filename)));
  79.     end;
  80.     Result := True;
  81.   end;
  82. end;
  83.  
  84. // Farben vertauschen
  85. procedure SwapBGR(SDLSurface : PSDL_Surface);
  86. var x, y           : Integer;
  87.     p              : UInt32;
  88.     pR, pG, pB, pA : PUInt8;
  89.     r, g, b, a     : UInt8;
  90. begin
  91.   for y := 0 to Pred(SDLSurface.h) do
  92.     for x := 0 to Pred(SDLSurface.w) do
  93.     begin
  94.       p := SDL_GetPixel(SDLSurface, x, y);
  95.  
  96.       pR := @r;
  97.       pG := @g;
  98.       pB := @b;
  99.       pA := @a;
  100.  
  101.       SDL_GetRGBA(p, SDLSurface.format, pR, pG, pB, pA);
  102.       p := SDL_MapRGBA(SDLSurface.format, b, g, r, a);
  103.  
  104.       SDL_PutPixel(SDLSurface, x, y, p);
  105.     end;
  106. end;
  107.  
  108. // Textur binden
  109. procedure Bind(Id : Integer);
  110. var i : Integer;
  111. begin
  112.   for i := 0 to High(Tex) do
  113.     if Tex[i].Id = Id then
  114.     begin
  115.       glBindTexture(GL_TEXTURE_2D, Tex[i].Textur);
  116.       Break;
  117.     end;
  118. end;
  119.  
  120. end.


Nachtrag: Habe mich eben mal schnell an die SDL-Mouse-Events gesetzt um mal freie Sicht zu kriegen. Im Anhang sieht man wie Die Skybox "unten" aussieht, recht katastrophal irgendwie. Es ist irgendetwas verdreht. Außerdem kam mir die Idee, ich könnte folgende Codeabschnitte hier mal schnell posten, hoffe das macht es noch etwas leichter:
Code:
  1.  
  2. procedure LoadTextures;
  3. const SkyTexturesName : Array[0..5] of String = ('north.jpg', 'east.jpg', 'south.jpg', 'west.jpg', 'top.jpg', 'bottom.jpg');
  4. var i : Integer;
  5. begin
  6.   //Bilder für SkyBox laden
  7.   for i := 0 to 5 do
  8.     LoadTexture(SkyTexturesName[i], 20+i); // Startwert 20 ist rein nach belieben gewählt, aber funktionieren muss es trotzdem, denn 20 aufwärts ist garantiert frei.
  9. end;
  10.  
  11. procedure PaintSkyBox;
  12. const QuadPosition : Array[0..5] of Array[0..3] of Array[0..2] of Single =
  13.   ((( 2.005,  2.005, -1.995), ( 2.005, -2.005, -1.995), (-2.005, -2.005, -1.995), (-2.005,  2.005, -1.995)), //Nordseite
  14.    (( 1.995,  2.005,  2    ), ( 1.995, -2.005,  2    ), ( 1.995, -2.005, -2    ), ( 1.995,  2.005, -2    )), //Ostseite
  15.    ((-2.005,  2.005,  1.995), (-2.005, -2.005,  1.995), ( 2.005, -2.005,  1.995), ( 2.005,  2.005,  1.995)), //Südseite
  16.    ((-1.995,  2.005, -2    ), (-1.995, -2.005, -2    ), (-1.995, -2.005,  2    ), (-1.995,  2.005,  2    )), //Westseite
  17.    ((-2    ,  2    , -2    ), (-2    ,  2    ,  2    ), ( 2    ,  2    ,  2    ), ( 2    ,  2    , -2    )),
  18.    (( 2    , -2    , -2    ), ( 2    , -2    ,  2    ), (-2    , -2    ,  2    ), (-2    , -2    , -2    )));
  19.       TexturePos : Array[0..3] of Array[0..1] of Single = ((1,1), (1,0), (0, 0), (0, 1));                      
  20. var Side, Vertex : Integer;
  21. begin
  22.   for Side := 0 to 5 do
  23.   begin
  24.     //Textur aktivieren
  25.     Bind(19+Side); // Hier wie oben erläutert nicht 20 sondern 19 als Startwert, das ist der Designfehler meiner Textur-Unit, welcher noch beseitigt werden muss.
  26.     //!glBindTexture(GL_TEXTURE_2D, SkyBoxTexturen[Side]); -- Originalcode
  27.     glBegin(GL_QUADS);
  28.     //Vertieces und Tex Coords übergeben
  29.     for Vertex := 3 downto 0 do
  30.     begin
  31.       glTexCoord2fv(@TexturePos[Vertex][0]);
  32.       glVertex3fv(@QuadPosition[Side][Vertex][0])
  33.     end;
  34.     glEnd;
  35.   end;
  36. end;


Gruß,
Nils


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur gespiegelt
BeitragVerfasst: Di Apr 03, 2012 10:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
So wie ich das sehe, liegt der Fehler in der Textures.pas aus dem Tutorial. In der wird eine Bitmap geladen in dem einfach die Daten aus der Datei in den Speicher geladen werden. Bei einer Bitmap sind aber die unteren Zeilen des Bilds zuerst im Speicher (und die erste Zeile als letztes). Beim Laden des JPGs werden die Zeilen in einer Schleife vertauscht. Die Bilder werden also alle "falsch" geladen.

Ich gehe davon aus, dass die SDL Methode das "richtig" macht. Deswegen sind alle deine Texturen gespiegelt. Ich würde einfach die Texturkoordinaten der Skybox anpassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur gespiegelt
BeitragVerfasst: Di Apr 03, 2012 22:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Ah stimmt. Vielen Dank für die Hilfe!

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]