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

Aktuelle Zeit: Fr Jul 18, 2025 20:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Masken und Tranzparenz
BeitragVerfasst: Di Nov 21, 2006 09:29 
Offline
DGL Member

Registriert: Di Nov 21, 2006 08:57
Beiträge: 7
Wohnort: Berlin
Hallo zusammen,

Also mein Problem ist eigentlich ganz einfach, aber etwas umständlich zu erklären:
Also, ich zeichne zuerst, sagen wir ein gelbes Rechteck als Hintergrund.
Dann zeichne ich eine Textur als Maske darüber: schwarzes Rechteck
mit weissem Kreis und gleichzeitig zb. folgende Textur: blaues Rechteck.
Der weisse Kreiss in der Maske soll diese Stelle im blauen Rechteck transparent
machen, so dass nun im blauen Rechteck ein gelber Kreis zu sehen ist.

Wie müssen nun die Faktoren in den beiden glBlendFunc-Aufrufen aussehen?
(zb. GL_ONE, GL_DST_COLOR...)




Bisher sieht mein Code so aus:

Code:
  1. ...
  2. glBegin(GL_POLYGON);               //Hintergrund
  3. glColor4f(0.6f,0.4f,0.0f,1.0f);
  4. glVertex3dv(&V121.x);
  5. glVertex3dv(&V122.x);
  6. glVertex3dv(&V123.x);
  7. glVertex3dv(&V124.x);
  8. glEnd();
  9.  
  10. glEnable(GL_TEXTURE_2D);
  11.  
  12. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  13.  
  14. glBindTexture(GL_TEXTURE_2D,m_iTextur[10]);  //Maske (weisses Rechteck, schwarzer Kreis)
  15. glBegin(GL_QUADS);
  16. glNormal3d(0.0, 0.0, 1.0);
  17. glTexCoord2d(0,0); glVertex3dv(&VTMaske1.x);
  18. glTexCoord2d(1,0); glVertex3dv(&VTMaske2.x);
  19. glTexCoord2d(1,1); glVertex3dv(&VTMaske3.x);
  20. glTexCoord2d(0,1); glVertex3dv(&VTMaske4.x);
  21. glEnd();
  22.  
  23.  
  24.  
  25. glTranslatef(-0.083f, 0.037f, 0.0f);
  26. glRotatef(-fKHwinkel,0.0f,0.0f,1.0f);
  27.  
  28. glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
  29.  
  30. glBindTexture(GL_TEXTURE_2D,m_iTextur[2]);    //blaues Rechteck
  31. glBegin(GL_QUADS);
  32. glNormal3d(0.0, 0.0, 1.0);
  33. glTexCoord2d(0,0); glVertex3dv(&Vblau_21.x);
  34. glTexCoord2d(1,0); glVertex3dv(&Vblau_22.x);
  35. glTexCoord2d(1,1); glVertex3dv(&Vblau_23.x);
  36. glTexCoord2d(0,1); glVertex3dv(&Vblau_24.x);
  37. glEnd();  ...
  38.  


Das Programm zeichnet so ein blaues Rechteck mit einem weissen Kreiss,
statt dem braunen Hintergrundkreis. Ich weiss, Ich müsste eigentlich schwarz
auf weiss legen um Tranzparenz zu erzielen, aber das geht in diesem Fall nicht.

Danke für's reinschauen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 09:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also das Beste wäre, wenn du die Texturen miteinander kombinieren würdest! Sollte das nicht gehen so wäre es wohl das zweitbeste, wenn du deine Maskentextur als Alphatextur benutzt und dann deine Fläche mittels Multitexturing zeichnest.

So wie du das machst ist das immer etwas schwirig, da die Farbe ja nicht nur die Textur deiner Maskentextur wiederspigeln kann sondern ja auch etwas vollkommen anderes sein könnte.

Das Beste wäre aber sowieso wenn du uns erst einmal erklärst was GENAU du damit vorhast bzw damit erreichen möchtest. Aber der Idealste Fall ist in jedem Fall der, dass du das alles nur in einer Textur hast.

Interessant ist auch die Frage was du alles an Texturen bekommen kannst? Also dein Blaues Rechteck. Ist das nur eine einfarbiges Blau oder können das auch richtige Texturen werden. Eine einzelne Farbe könnte man auch mit glColor realisieren.

So viele Fragen. Und das obwohl du doch was wissen willst. :twisted:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 13:06 
Offline
DGL Member

Registriert: Di Nov 21, 2006 08:57
Beiträge: 7
Wohnort: Berlin
Also ich möchte ein Fluginstrument "Künstlicher Horizont" programmieren.

Ich versuch jetzt mal drei Attachment/img's einzubauen.

Darauf sieht man, wenns geklappt hat, dass einerseits die Zahlenskala
von der runden Skala verdeckt wird, andererseits scheint
der blaue und braune Abschnitt sowie der weisseTrennstrich immer durch.


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 14:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ah. Okay. Da kommen wir der Sache doch näher. Also zerlegen wir erst einmal das Bild in seine Bestandteile.

1. Horizont. Dieser besteht immer aus einem braunen Grund und einem blauen Horizont mit weißer Trennlinie.
2. Innere Skala des künstlichen Horizont die durch runde Skala verdeckt wird.
3. Darüber das kleine weiße Dreieck mit der Rotationsskala und der Ansicht des Flugzeuges.

Schon mal vorab. Mit Shadern etc ist das bestimmt auch alles anders möglich allerdings kenne ich damit nicht aus. Und ohne Shadern würde ich das in etwa so machen.

1 und 2 hängen direkt zusammen. Den künstlichen Horizont + Trennlinie würde ich als eine Grafik nehmen. Die Skala würde ich als 2te Grafik benutzen. Für beide würde ich die Texturmatrix verändern. Das ist am einfachsten um am genausten.

1. Dafür würde ich als Wrapmodus bei den Texturen CLAMP_TO_EDGE benutzen. Dadurch, dass die Textur am Rand immer weiter Blau, Braun oder Weiß ist muss die Textur dann auch nicht so sonderlich groß sein. Die Breite könnte auch 1 sein. Oder eine 1D Textur. So würde sich die Textur breiter ziehen als sie eigentlich wäre. Das würde das Handling vereinfachen.

2. Eine Textur recht schmal aber recht hoch. Je nachdem wie groß deine Spanne sein muss musst du die kompletten 360° abbilden oder nicht. Ich würde aber in jedem Fall darauf achten, dass 0° genau in der Mitte liegen. Macht wiederrum das Handling einfacher. Das Aublenden gestalten wir durch eine zusätzliche Textur die per Multitexturing mit in die Skala verrechnet wird. Um die Sache zu vereinfachen benutzen wird dort eine Textur die lediglich einen Alphakanl beinhaltet. Das ist wiederrum das einfachste.

3. Dafür kannst du eine normale Textur benutzen die einfach nur drübergeblendet wird.

Da das vielleicht alles ein bisschen unverständlich ist hier mal ein bisschen Code. Ich hoffe es ist kein Problem für dich, dass der Code in Delphi ist?
1:
Code:
  1.   //todo: Horizont binden und aktivieren
  2.  
  3.   glMatrixMode(GL_TEXTURE); // Texturmatrix
  4.   glLoadIdentity; // Zurücksetzen
  5.   glTranslatef(0.5, 0.5, 0); // Mittelpunkt verschieben
  6.  
  7.   glTranslatef(0, Verschiebung, 0); // Die Nase des Flugzeuges
  8.   glRotatef(Neigung, 0, 0, 1); // Die Neigung des Flugzeuges
  9.   glTranslatef(-0.5, -0.5, 0); // Mittelpunkt wieder zurück verschieben
  10.  
  11.   glMatrixMode(GL_MODELVIEW); // Modelview
  12.  
  13.   //todo: Quad zeichnen und Texturkoordinaten ganz normal quadfüllend setzen


2:
Code:
  1.   // Erste Textureinheit aktivieren
  2.   glActiveTexture(GL_TEXTURE0);
  3.   //todo: Skalentextur binden und aktivieren
  4.  
  5.   glMatrixMode(GL_TEXTURE); // Texturmatrix
  6.   glLoadIdentity; // Zurücksetzen
  7.   glTranslatef(0.5, 0.5, 0); // Mittelpunkt verschieben
  8.  
  9.   glTranslatef(0, Verschiebung, 0); // Die Nase des Flugzeuges
  10.   glRotatef(Neigung, 0, 0, 1); // Die Neigung des Flugzeuges
  11.   glTranslatef(-0.5, -0.5, 0); // Mittelpunkt wieder zurück verschieben
  12.  
  13.   glMatrixMode(GL_MODELVIEW);
  14.  
  15.   glActiveTexture(GL_TEXTURE1);
  16.   //todo: Alphamaske des zur verfügungstehenden Platzes binden und aktivieren
  17.  
  18.   //todo: Quad zeichnen und Texturkoordinaten bei der Maske ganz normal quadfüllend setzen
  19.   // Bei der Skala solltest du das Seitenverhältniss beachten.
  20.  
  21.   glActiveTexture(GL_TEXTURE1);
  22.   //todo: Textur entbinden und TMU deaktivieren
  23.  


Bei 2tens musst du darauf achten, dass auch wirklich multitexturing unterstützt wird. Und das setzen der Koordinaten muss mittels glMultiTexCoord2f(GL_TEXTURE0, S, T); geschehen.

Eine reine Alphatextur kannst du ähnlich einer RGB(A) Textur erstellen nur darfst du entsprechend nur einen Kanal in der Datei haben und darfst beim erstellen auch nur GL_ALPHA angaben. Sonst brauchst du auf nichts achten.

PS: Ich hoffe das war jetzt nicht zu kompliziert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 14:48 
Offline
DGL Member

Registriert: Di Nov 21, 2006 08:57
Beiträge: 7
Wohnort: Berlin
Danke, das versuch ich jetzt mal in Ruhe!


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


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]