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

Aktuelle Zeit: Mi Jul 09, 2025 06:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tutorial 7:Texture-Blending
BeitragVerfasst: Mi Mai 06, 2009 20:36 
Offline
DGL Member

Registriert: Mi Mai 06, 2009 15:57
Beiträge: 13
Ich grüsse euch.

Ich bin noch ein absoluter Frischling, was die OpenGL-Programmierung angeht (in Kombination mit C++ in meinem Fall) - mein dritter Tag heute.
Ich habe die Einsteiger-Tutorials bis Lektion 7 durchgearbeitet und konnte soweit alles gut nachvollziehen, doch muss ich sagen, dass mir das Blending ein wenig zu schaffen macht.

In Lektion 7 im Abschnitt "Die Welt unter einer Maske" werden zwei übereinander liegende QUADS jeweils mit eine Textur versehen, wobei die schwarz-weisse als Maske dienen soll.
Nun steht dort, dass mit glBlendFunc(GL_ONE,GL_DST_COLOR) der Effekt bewirkt wird, dass durch die schwarzen Flächen der Maske die darunter liegende Textur (also die bereits in den Framebuffer gezeichnete) hindurch sichtbar sein soll.
Müsste es aber nicht eigentlich glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_COLOR) heissen, da in diesem Fall die Helligkeit der drunterliegenden Textur an besagten Stellen irrelevant ist?

Möchte man es genau andersrum haben (untere Textur sichtbar an weissen Stellen der Maske) macht man ja im Endeffekt das gleiche: glBlendFunc(GL_ZERO,GL_SRC_COLOR).

Entscheidend sind in beiden Fällen doch nicht die destination-Daten, sondern lediglich die source-Daten.

Zwei weitere Sachen, die ich leider nicht ganz verstanden habe beim Durcharbeiten der Tutorials.
1.) Wo genau aktiviere ich glEnable(GL_BLEND)? Bereits in der ini, zu Anfang der display-Fkt, direkt vor dem Zeichnen der zweiten Textur und vor dem Aufruf der glBlendFunc?
2.) Zweites Problem das ich habe ist folgendes: Ich lade 2 (oder mehr BMPs, erstelle daraus Texturen etc. etc.). Nun setzte ich textur1 als die aktive mit glBindTexture(GL_TEXTURE_2D, _textureId1), gebe an wie die Filterung sein soll glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) etc. und kann sie verwenden.
Wenn ich jetzt die nächste Textur mit gBindTexture(...) verwenden möchte, muss ich jedesmal auch wieder die glTexParamteri aufrufen, ansonst wird sie garnicht angezeigt. Ist dies also obligatorisch?

Wäre über eine kurze Hilfe sehr Dankbar. Ihr habt übrigens ein super Projekt hier mit spitzen Tutorials. Es macht einen Heiden-Spass sie durchzuarbeiten und zu experimentieren.

Gruss,
inter2k3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 08, 2009 02:36 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Zu den Einstellungen für glBlendFunc kann ich jetzt nichts sagen, ich seh da auch nicht so richtig durch und hab mir deshalb ein Testprogramm geschrieben, auf das ich grad nicht zugreifen kann.

Zu 1. seiner anderen Fragen kann ich aber relativ sicher sagen, dass Blending so sparsam wie möglich verwendet werden sollte. Also wenn es nicht gebraucht wird, deaktiveren. Weil dabei 2 Farbwerte kombiniert werden, anstatt das der Vorhergehenden einfach nur überschrieben wird, dauert es länger und frisst deshalb Performance.

Zur 2ten Frage kann ich auch nicht so viel sagen. Eigentlich müsste es auch ohne glTexParameter gehen, weil es da Voreinstellungen gibt. Möglicherweise liegt es auch an den MipMaps.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 08, 2009 06:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Zu der zweiten Frage:

IMHO muss man nach dem Laden einer Textur EINMAL so etwas aufrufen. Das genügt und dürfte nicht zu viel Performance fressen. Ich hoffe ja nicht, dass du die Texturen in jedem Frame neu lädst, didn't you?
Bei mir (SDL, ich probiere es mal in Pascal zu schreiben) sieht die Ladefunktion (vereinfacht) so aus:
Code:
  1. function loadtexturefromfile(PChar name) : GLuint;
  2. var bild : pSDL_Surface;
  3.     texnr : GLuint;
  4. begin  
  5.   bild := IMG_Load(name);
  6.   if (bild=nil)
  7.     exit;
  8.   glGenTextures(1, ^texnr);
  9.   glBindTexture(GL_TEXTURE_2D, texnr);
  10.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  11.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  12.   glTexImage2D(GL_TEXTURE_2D, 0, 3, bild.w, bild.h,0, GL_RGB, GL_UNSIGNED_BYTE, bild.pixels);
  13.   SDL_FreeSurface(bild);
  14.   result:=texnr;
  15. end;

Wahrscheinlich funktioniert das so nicht 100%, weil ich ewig lange kein Pascal mehr gemacht habe, aber das Prinzip sollte erkenntbar sein.

LG Ziz

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


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 » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.010s | 17 Queries | GZIP : On ]