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

Aktuelle Zeit: Sa Jul 05, 2025 17:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Bild ist nicht sichtbar
BeitragVerfasst: Mo Sep 22, 2008 08:57 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Nun, ich lege über eine Kugel ein Bild.
Das Problem ist, das es durch meine Einstellungen nicht zu sehen ist.
Allerdings habe ich keine Ahnung welche Einstellung das sein könnte.
Ich probiere schon ne ganze Weile rum und hab mir auch noch mal die Wiki's zu den Funktionen durchgelesen, aber irgendwie will der Funke nicht rüberspringen warum das Bild nun nicht sichtbar ist.
Hier meine Einstellungen:

Code:
  1.    glEnable(GL_DEPTH_TEST);
  2.    glEnable(GL_Blend);
  3.    glEnable(GL_TEXTURE_COMPARE_MODE_ARB);
  4.    glEnable(GL_TEXTURE_COMPARE_FUNC_ARB);
  5.    glEnable(GL_Texture_2D);
  6.    glEnable(GL_COLOR_MATERIAL);
  7.    glEnable(GL_CULL_FACE);
  8.  
  9.    glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_CONSTANT_COLOR_EXT);
  10.  
  11.    glPolygonMode(GL_Back, GL_LINE);
  12.    glPolygonMode(GL_Front, GL_FILL);
  13.  
  14.    CreateSphere(0, -220, -220, 32, 32);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 09:40 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Probier mal als Blend Func (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 09:53 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Das hat nicht leider nicht geholfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 10:48 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Ich hab das Problem gefunden, aber auf sowas muss man auch erst einmal kommen, da bin ich schon fast dran verzweifelt da ich da schon etliche Stunden vor verbracht hab und einfach nicht weitergekommen bin, aber jetzt hab ich es.
Es lag nicht an den Einstellungen *lol... es lag am Bild! :shock:
Das Bild hatte zunächst eine Dimension von 128 x 128.
Dann habe ich das ganze mal durch-debugged und siehe da, beim Laden des Bildes gibt es Probleme...
Jetzt dachte ich mir, änder ich einfach mal die Größe des Bildes, was soll schon schiefgehen?
Jetzt habe ich das Bild auf 32 x 32 getrimmt und zack, alles Funktioniert...
Wie kann es sein das mein 128 x 128 Bild nicht akzeptiert wird?
Danke Flash, hat doch funktioniert... :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wenn etwas nicht funktioniert empfehle ich normal alles zu entfernen was nicht benötigt wird. Frei nach den Motto mit den vielen Köchen. ;) Um eine Textur darzustellen benötigst du normal nur ein Primitiv mit Texturekoordinaten, eine gebundene Textur und die Aktivierung des entsprechenden Targets. Das ist normal GL_TEXTURE_2D.

Im Übrigen muss GL_TEXTURE_COMPARE_MODE_ARB und GL_TEXTURE_COMPARE_FUNC_ARB als glTexParameter gesetzt werden. Das sind keine einfache Optionen die aktiviert oder deaktiviert werden. Die genau Bedeutung von ihnen findest du in der Spezifikation von GL_ARB_shadow. Diese Einstellungen wirken sich aber nur auf die gerade aktive Textur aus. Das müsste in etwa so gemacht werden (keine Garantie, dass es richtig ist).
Code:
  1. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
  2. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); // oder GL_GEQUAL

Aber das ist normal dazu da um einen Schatten zu rendern.

Du solltest auch überprüfen ob die benutzen Erweiterung auch von deiner OpenGL Implementation unterstützt wird. Also ob GL_ARB_shadow oder GL_VERSION_1_4 auf True stehen. (GL_ARB_shadow wurde in OpenGL 1.4 zum Kern hinzugefügt.) Sonst kann es passieren, dass du etwas benutzt was die Grafikkarte nicht kann und dann tut sich auch nichts. Wenn die Erweiterungen zwingend notwendig sind, dann genügt es sie ein Mal zu Begin der Anwendung zu überprüfen und im Falle des nicht vorhandenseins die Ausführung abzubrechen.

Das Aktivieren von ColorMaterial und PolygonModes würde ich persönlich weglassen. PolygonMode wirkt sich nicht aus, da Front sowieso fill ist und Back durch das Enable(CullFace) bereits elimeniert wurde.

GL_ONE_MINUS_DST_ALPHA: Weist im übrigen auf einen Alphakanal im Framebuffer. Da dieser auf den meisten Systemen nicht existiert bzw auch vom Treiber konsequent verweigert werden kann würde diese Konstante wirklich nur dann benutzen wenn du weißt, dass du dein Framebuffer einen Alphakanal hat und du ihn wirklich wirklich benötigst. Typischerweise ist die BlendFunc von Flash die übliche.

PS: Du solltest in jedem Falle auf OpenGL Fehler prüfen. Das geht mit glError, denn dein Code enthält in jedem Fall Fehler. Und sobald Fehler auftreten wird irgendetwas nicht ausgeführt. Was zum Verlust von Bildinhalten führen kann. ;)

PPS: Argh. Entweder bin ich zu langsam oder ich schreibe zu viel. Na ja. Da ich denke es würde dir trotzdem ein bisschen helfen, poste ich es trotzdem. Auch wenn dein Problem bereits gelöst zu sein scheint.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 11:28 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Jepp, hat trotzdem geholfen. :)

Edit: Es kann sein, das ich hier des öfteren noch Fragen stellen werde die sicherlich für viele hier leicht zu beantworten sind, ich bin nämlich ein ziehmlicher langsamlerner und -kapierer... wenn mir das Wissen nicht von einer anderen Person vermittelt wird, z.B. von einem Lehrer... also, bis zur nächsten Frage :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Cre@or hat geschrieben:
Es kann sein, das ich hier des öfteren noch Fragen stellen werde die sicherlich für viele hier leicht zu beantworten sind, ich bin nämlich ein ziehmlicher langsamlerner und -kapierer... wenn mir das Wissen nicht von einer anderen Person vermittelt wird, z.B. von einem Lehrer... also, bis zur nächsten Frage :wink:

Das Problem hast nicht nur du. Bis ich richtig verstanden hatte wie glBlendFunc arbeitet sind ca 1,5-2 Jahre vergangen. Und das obwohl ich überwiegend nur mit Texturen und 2D arbeite. Aber es gibt einfach Konstrukte mit denen tut sich der ein oder andere etwas schwerer wärend andere damit gar keine Probleme haben. Aber genau dafür gibt es ja das Forum. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 12:47 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Danke für diese Aufbauende Nachricht. 8)
Vielleicht will ich zu schnell zu viele Fortschritte.

mfg Cre@or


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 13:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was war das jetzt mit den 32x32er Bild? Woran lags jetzt wirklich?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 13:50 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Was meinst du damit:

Zitat:
Was war das jetzt mit den 32x32er Bild? Woran lags jetzt wirklich?


Auf einmal ging es. Mit dem 128 x 128 Bild ging es nicht. Da ist er im Programm folgende Zeilen immer übersprungen:

Code:
  1.    if (tex.iType = 2) then
  2.    begin
  3.  
  4.     glGenTextures(1, @TexID);
  5.     glBindTexture(GL_TEXTURE_2D, TexID);
  6.  
  7.     ID := TexID;
  8.  
  9.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  10.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  11.  
  12.       if (tex.bpp = 3) then
  13.  
  14.           glFormat := GL_BGR
  15.  
  16.       else
  17.  
  18.           glFormat := GL_BGRA;
  19.  
  20.     glTexImage2D(GL_TEXTURE_2D, 0, tex.bpp, tex.w, tex.h, 0, glFormat, GL_UNSIGNED_BYTE, tex.data);
  21.  
  22.     FreeMem(tex.data);
  23.  
  24.    end;


Als ich das Bild geändert hab in 32 x 32 ging es.
Frag nicht warum, ich hab keine Ahnung.
tex.iType war immer <> 2... aber warum... wie gesagt... ich hab keine Ahnung...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was benutzt du denn zum Laden der Datei? Und kann es sein, dass es sich bei der Bildatei um ein TGA Datei handelte? Wenn ja dann vermute ich mal, dass der iType auf 10 stand. Auch möglich wären 3 oder 11. Aber ich tippe auf 10. Denn 10 sind komprimierte RGB(A) TGAs. Und dein Code akzeptiert ja nur Typ 2 (das sind unkomprimierte RGB(A) TGAs). Ich denke wenn du das 128x128 noch mal so abgespeichert hättest wie du das 32x32 abgespeichert hast, dann wäre es auch gegangen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 15:26 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Hier mal der komplette Code meiner Anwendung kopiert aus dem DGL-Wiki...

Code:
  1. TGATexture('C:\Glas.tga', ID);


und weiter...

Code:
  1. procedure TForm1.TGATexture(const filename: string; var TexID: longword);
  2.  
  3.  var
  4.  
  5.    tex : TTGAFile;
  6.  
  7.    glFormat : longword;
  8.  
  9. begin
  10.  
  11.  tex := LoadTGA(filename);
  12.  
  13.    if (tex.iType = 2) then
  14.    begin
  15.  
  16.     glGenTextures(1, @TexID);
  17.     glBindTexture(GL_TEXTURE_2D, TexID);
  18.  
  19.     ID := TexID;
  20.  
  21.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  22.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  23.  
  24.       if (tex.bpp = 3) then
  25.  
  26.           glFormat := GL_BGR
  27.  
  28.       else
  29.  
  30.           glFormat := GL_BGRA;
  31.  
  32.     glTexImage2D(GL_TEXTURE_2D, 0, tex.bpp, tex.w, tex.h, 0, glFormat, GL_UNSIGNED_BYTE, tex.data);
  33.  
  34.     FreeMem(tex.data);
  35.  
  36.    end;
  37.  
  38. end;


und weiter...

Code:
  1. function LoadTGA(const filename: string): TTGAFile;
  2.  
  3.  var
  4.  
  5.    f : file;
  6.  
  7.    bytes : longword;
  8.  
  9. begin
  10.  
  11.  assign(f, filename);
  12.  reset(f, 1);
  13.  
  14.  seek(f, 2);
  15.  blockread(f, result.iType, 1);
  16.  
  17.  seek(f, 12);
  18.  blockread(f, result.w, 5);
  19.  result.bpp := result.bpp div 8;
  20.  
  21.  bytes := result.w * result.h * result.bpp;
  22.  getmem(result.data, bytes);
  23.  seek(f, 18);
  24.  blockread(f, result.data^, bytes);
  25.  
  26.  close(f);
  27.  
  28. end;


Wie man meiner ersten Pascal-Zeile entnehmen kann hole ich mir eine TGA-Datei in den Speicher.
Ich kann es mir auch nicht erklären... ich hab die TGA nur mit IrfanView ein bissel bearbeitet und dann abgespeichert.
Und das 32 x 32 hab ich ja auch mit IrfanView bearbeitet und abgespeichert, und da funktionert es.
Wie gesagt, ich weiss den Grund einfach nicht wieso das TGA-Format verändert vorgelegen ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das kann ich dir sagen. IrfanView speichert TGAs unkomprimiert ab. Es kann aber komprimierte TGAs lesen. Aber nach dem Speichern sind sie unkomprimiert. Komprimiert und Unkomprimiert haben unterschiedliche Typen. Unkomprimiert = 2 und komprimiert = 10. Deswegen konntest du es anschließend laden. Die Größe des Bildes spielt dabei keine Rolle.

PS: Mit IrfanView wäre ich vorsichtig. Solltest du irgendwann mal ein PNG oder TGA haben was einen Alphakanal enthält ist der nach dem Speicher verschwunden! Und du hast keine Möglichkeit dort wieder ran zu kommen. Da solltest du in jedem Fall ein richtiges Grafikprogramm wie GIMP etc benutzen.

PPS: Du solltest den Loader so umstellen, dass bei TGAs wo der Type ungleich 2 ist eine Exception ausgelöst wird. Das ersparrt dir spätere Verwirrungen, wenn nichts passiert. Wie das jetzt war. Und das Data solltest du in jedem Fall frei geben. Egal ob du das Bild erstellt hast oder nicht. Denn wenn du es nicht erstellt hast, dann liegen die Daten weiterhin im Speicher rum.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2008 15:53 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Alles klar.

mfg Cre@or

Edit: Ich hab aber beide TGA's mit IrfanView erstellt. Und wenn Irfan alle TGA's Unkomprimiert abspeichert, dann hätte ich doch auch das 1. Bild (128 x 128) Laden hätte können [verwirrt am Kopf kratz].


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.015s | 15 Queries | GZIP : On ]