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

Aktuelle Zeit: So Jul 13, 2025 21:09

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme bei der Teamfarbe
BeitragVerfasst: Mo Mai 25, 2009 22:58 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
Hi,

ich bin noch recht unbedarft was OpneGL angeht, also habt rücksicht mit mir.
Mithilfe der Tutorials versuche ich gerade einen dieser vielen Weltraumshooter nachzubauen.
(Wo man selber so nen kleines Raumschiff durch Felsbrocken durchsteuert.)
Das ganze ist in 2D.
Nun will ich, dass man sich die Farbe seines Raumschiffes aussuchen kann.
Dazu dachte ich mir, es könnte vielleicht gehen, wenn ich zu Beginn das Raumschiff auf eine Textur zeichne.
Dabei ist die Grundtextur schwarz und ich färbe das Raumschiff mittels GL_BLEND ein.
Diese so erstellte Textur verwende ich dann immer wieder.
So wie ich das versuche klappt es allerdings nicht.
Es wird immer die komplette neue Textur rot (rot ist meine Test-Teamfarbe)

Code:
  1.  
  2. var pTexData: Pointer;  //natürlich global, sodass ich den Speicher gegen ende freigeben kann
  3.      NewTex : glUInt;  //die fertige Raumschifftextur(-ID)
  4.     GrundTex: glUINT //die schwarz-weiß Textur
  5.  
  6.  
  7. begin
  8.   GetMem(pTexData, 256*256*3);
  9.   glGenTextures(1, @NewTex);
  10.   glBindTexture(GL_TEXTURE_2D, NewTex);  
  11.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  12.   glClearColor(1.0,0.0,0.0,0);  //oder welche Farbe auch immer
  13.                                            //Hintergrundgedanke: alles rot und dann die schwarze RahmenTextur darüber
  14.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  15.   glViewport(0, 0, 1, 1);
  16.   glEnable(GL_BLEND);
  17.   glBlendFunc(GL_one,GL_one);
  18.   glBindTexture(GL_TEXTURE_2D, GrundTex);  //wurde natürlich vorher schon geladen
  19.   glBegin(GL_QUADS);
  20.     glTexCoord2f(0,0); glVertex3f(0, 0, 0);
  21.     glTexCoord2f(1,0); glVertex3f(1, 0, 0);
  22.     glTexCoord2f(1,1); glVertex3f(1, 1, 0);
  23.     glTexCoord2f(0,1); glVertex3f(0, 1, 0);
  24.   glEnd;
  25.   glDisable(GL_Blend);
  26.   glBindTexture(GL_TEXTURE_2D, NewTex);
  27.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 256, 256, 0);
  28. end;


Falls wer eine Lösung weis, wäre ich sehr dankbar dafür.

Mfg.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 25, 2009 23:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Eigentlich muss man nach glViewport noch glOrtho() aufrufen. glViewport setzt ja nur das Betrachtungsfenster.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 01:44 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also gllOrtho wäre sicherlich nicht schlecht. Wobei man aufpassen muss, da bei OpenGl der Ursprung unten links ist und nicht wie bei Windows oben links, muss die Höhe negativ sein wenn man denn den Urpsrung oben links haben will.

Als nächstes solltest du den Viewport mal auf eine andere Größe stellen. So wie das jetzt ist, ist deine Zeichenfläche nur 1 Pixel groß. Das soll, denke ich mal, nicht so sein.

Dann solltest du, damit Blending so funktioniert wie du es willst, die Blendfunktion ändern.
So wie du es jetzt benutzt, werden die Farbwerte einfach addiert. Weil der Viewport noch falsch engestellt ist siehst du davon noch nichts (glClear geht auch über den Viewport hinaus).
Ich nehme mal an deine Raumschiff-Textur ist in Graustufen, wobei das Weiße eingefärbt werden soll. Was dafür jetzt die richtigen Parameter für glBlendFunc sind, kann ich jetzt auch nicht sagen. Allerdings würde es vielleicht auch reichen, wenn du die Farbe beim Zeichnen des Raumschiffs ändern würdest. Die weißen stellen der Textur sind dann z.B. rot, weil die Farbe der Textur mit der Farbe die mit glColor eingestellt wurde, multipliziert wird.

Ich weiß ja nicht was du sonst noch mit der Textur anstellen möchtest. Eventuell ist es auch sinnvoll nicht die Gesamte Textur einzufärben, dann wäre es nicht so gut das mit glColor zu machen. Ansonsten reicht das aber aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 09:00 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
Also ich habe jetzt glviewport geändert und glortho druntergesetzt.
Code:
  1.   glViewport(0, 0, ClientWidth, ClientHeight);
  2.   glortho(0,3.5,0,2,0,128);


Die Parameter krieg ich allerdings nicht hin:
Am besten sah
Code:
  1. glBlendFunc(GL_src_color ,GL_zero);
aus.

Aber das ist natürlich auch falsch.
So sah es aus:Bild
Wobei 1) die Ausgabe meines Projektes ist,
2) Die Rohdatei vom Raumschiff (bzw, aus einfachheit erstmal ein Oval)
3) Das wie ich es haben will.

Und dann noch die Frage: Dieser rote Rand war immer da - wie kriege ich den Weg?
Wie kriege ich es hin, dass wenn alles wie bei 3) aussieht, weis als Alphakanal genommen wird, also durchsichtig?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 09:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Als aller erstes solltest du das Alphakanal Problem lösen.
Das machst du indem du ein Bildformat mit Alphakanal benutzt. Üblicherweise PNG. TGA geht auch.
Dort malst du deine Raumschiff mittels eines vernünftigen Malprogramms direkt mit Alphakanal.
Als Blendfunktion nimmst du dann die aus dem Tutorial. Außerdem aktivierst du noch den Alphatest.

Das Thema hatten wir in diesem Thread auch schonmal versucht zu besprechen.

Ich denke, dass es so am einfachsten gehen könnte:

Rendere dein Objekt einmal ohne Texturen aber in Teamfarbe. Dabei sorgst du dafür, dass nicht in den Tiefenpuffer gezeichnet wird. Danach renderst du das Objekt direkt noch einmal mit Texturen (inkl. Tiefenpuffer - also ganz normal) und blendest diesen Durchgang über den Vorhergehenden Drüber. Dabei enthält deine Textur an den Stellen wo die Teamfarbe durchschauen soll, durchsichtige Bereiche. Als Blendfunktion einfach wieder die standard Transparanz Funktion aus dem Tutorial wählen.

Das ganze sollte sogar bei 3D Objekten funktionieren. Und wenn bei dem "Nur mit Farbe zeichnen" auch das Licht mit aktiviert ist, dann sollte das recht fluffig aussehen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Wäre es nicht einfacher vor dem Zeichnen
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
und nach dem Zeichnen
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
zu machen?
Dann wird die Textur addiert und nicht multipliziert und das müsste doch genauso Aussehen, oder?

Nur, was mich persönlich bei dieser Methode ist, dass die texturierten Bereiche, ich weiß nicht warum, vom Licht nicht beeinflusst werden, sondern nur die Farbigen. Ist das bei deiner Methode anders?

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  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 12:07 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm... an Decals habe ich gar nicht gedacht.

Aber wenn du sagst "Addiert", dann würde alles ins weiße gehen.
Was du vermutlich meinst ist "ersetzt". Das würde dann wohl hinkommen. Mit der Beleuchtung kenne ich mich diesbezüglich aber nicht aus.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 12:56 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
Hi, ich habe nun einiges herumprobiert.
Zizs Methode:
Alles rot hinterlegt
glTexEnvi
meine Textur gezeichnet
glTexEnvi

danach hatte ich nur die Bildtextur (also das schwarze Oval)

Ich bin aber andersweilig weitergekommen.
Mein Bild ist ein .tga mit Alpha.
Reservieren tue ich nun 256*256*4 Byte und rufe
Code:
  1. glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData);

das so auf.
glCopyTexImage2D habe ich btw auch auf rgba angepasst.

GLViewport und GLOrtho hab ich besser eingestellt, sodass sie nun passen( kein roter eckrand mehr):
Code:
  1.   glViewport(0, 0,890, 520);
  2.   glortho(0,3.5,0,2,0,128); //die Ecken von dem Quad sind bei 0 und 1

Aber wie kommen diese Zahlen zustande? Bei glViewport sind es nichtmal mehr die dimensionen meiner Form.
Sieht mir irgendwie so zufällig aus.

Das Oval korrekt zu färben habe ich auch hingekriegt.
Allerdings werden die Transparenten bereiche dann alle gleichfarbig wie das Oval :-( - und sind nicht mehr transparent.
Code:
  1.  
  2.   GetMem(pTexData, 256*256*4);
  3.   glGenTextures(1, @NewTex);
  4.   glBindTexture(GL_TEXTURE_2D, NewTex);
  5.   glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData);
  6.   glClearColor(1.0,0.0,0.0,0);  //oder welche Farbe auch immer                                       //Hintergrundgedanke: alles rot und dann die schwarze RahmenTextur darüber
  7.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  8.   glViewport(0, 0,890, 520);
  9.   glortho(0,3.5,0,2,0,128);
  10.   glEnable(GL_BLEND);
  11.   glBlendFunc(GL_src_color ,GL_one);
  12.   glBindTexture(GL_TEXTURE_2D, GrundTex);  //wurde natürlich vorher schon geladen
  13.   glBegin(GL_QUADS);
  14.     glTexCoord2f(0,0); glVertex3f(0, 0, 0);
  15.     glTexCoord2f(1,0); glVertex3f(1, 0, 0);
  16.     glTexCoord2f(1,1); glVertex3f(1, 1, 0);
  17.     glTexCoord2f(0,1); glVertex3f(0, 1, 0);
  18.   glEnd;
  19.   glDisable(GL_Blend);
  20.   glBindTexture(GL_TEXTURE_2D, NewTex);
  21.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 256, 256, 0);
  22.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 13:17 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, das Problem ist das der Alphakanal rausgehauen wird, was aber sogesehn normal ist. Abhilfe schaffen da FBOs.

Normalerweise stellt man den Viewport, wenn man in eine Textur zeichnen möchte auf die Größe der Textur. Dann würden auch bei glOrtho die Zahlen "3.5" und "3" zu "1". Und die kommen so zu stande:

890/256 = 3.48 also rund 3.5
520/256 = 2.03 also rund 2

Wenn der Viewport die richtige Größe hat, ist ja leicht erkennbar warum dann bei glOrtho Einsen rein müssen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 13:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Ja, genau das meine ich. :lol:

_________________
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  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 14:02 
Offline
DGL Member

Registriert: Mo Mai 25, 2009 21:29
Beiträge: 30
Oh Perfekt, vielen Dank.

Ich hab mir jetzt das FBO-Tut hier durchgelesen und es so versucht - und siehe da es klappt.
Das Viewport/Ortho-Problem ist auch klar.

Allerdings:
Zitat:
Hm, das Problem ist das der Alphakanal rausgehauen wird, was aber sogesehn normal ist. Abhilfe schaffen da FBOs.

Wieso ist das normal? Ich habe doch extra Speicher für reserviert und ja auch GL_RGBA übergeben.
Und wieso funktioniert es mit einem FBO?
Ist doch (so wie ich das sehe) das gleiche, nur dass ein FBO viele solcher Texturen speichern kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 26, 2009 17:48 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du Lossys glBitmap Texturloader nimmst, sollte das mit dem Alphakanal kein Problem sein.

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


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


Wer ist online?

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