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

Aktuelle Zeit: Fr Jul 18, 2025 08:17

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fragen zum 7. Tutorial
BeitragVerfasst: Do Jun 05, 2008 13:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,

ich hab heute das 7. Tutorial durchgearbeitet und jetzt hab ich n paar Fragen:

1.Problem:
Bis zu " Die Welt unter einer Maske" lief alles ganz gut, aber dann bin ich nich weiter gekommen...
ich wollte das erreichen:
Bild
aber stattdessen hab ich einen schwarzen Bildsschirm! So hab ich das gemacht:
Code:
  1. glBindTexture(GL_TEXTURE_2D, TexID[1]); //Stein Textur
  2.   glBegin(GL_QUADS);
  3.     glTexCoord2f(0,0); glVertex3f(-1, 1, 0);
  4.     glTexCoord2f(0,1); glVertex3f(-1,-1, 0);
  5.     glTexCoord2f(1,1); glVertex3f( 1,-1, 0);
  6.     glTexCoord2f(1,0); glVertex3f( 1, 1, 0);
  7.   glEnd;
  8.  
  9.   glBindTexture(GL_TEXTURE_2D, TexID[3]); //DGL Textur
  10.   glBegin(GL_QUADS);
  11.     glTexCoord2f(0,0); glVertex3f(-1, 1, 0.001);
  12.     glTexCoord2f(0,1); glVertex3f(-1,-1, 0.001);
  13.     glTexCoord2f(1,1); glVertex3f( 1,-1, 0.001);
  14.     glTexCoord2f(1,0); glVertex3f( 1, 1, 0.001);
  15.   glEnd;
  16.  
  17.   glBlendFunc(GL_ZERO,GL_SRC_COLOR);


2. Problem:
Irgendwie gehen die Textur-Units bei mir nich, ich hab den Code 1 zu 1 aus dem Tutorial übernommen
aber am ende hab ich n schwarzen Bildschirm. Kann es sein das meine Graka das nich unterstutzt, hab
ne GeForce 7800 GTX?!

3. Problem:
BildBild
Bild 1 wie's aussehen soll, und Bild 2 wie's bei mir aussieht. Hab den Quelltext auch wieder 1 zu 1 aus
dem Tutorial übernommen, aber ich glaube das Problem löst sich gleichzeitig mit Problem 1, oder??
Im Tutorial steh ja glBlendFunc(GL_ONE,GL_ONE) müsste es aber nich glBlendFunc(GL_ZERO,GL_SRC_COLOR)
heißen um den gewünschten Effekt zu erzielen?

umgangssprachlich:
glBlendFunc(GL_ONE,GL_ONE) = nimm beide zu gleichen teilen
glBlendFunc(GL_ZERO,GL_SRC_COLOR) = nimm von der neuen Textur nix und von der Textur im Buffer
die Teile die auf der neuen Textur weiß sind, oder irre ich mich???

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 05, 2008 14:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du solltest unterscheiden zwischen MultiPass und MultiTexturing. MultiPass ist, wenn du jeweils eine Textur bindest und diese mit einem Quad zeichnest (2 Texturen = 2 gezeichnete Quads). Dabei wird das Ergebniss im Framebuffer zusammengerechnet. MultiTexturing ist, wenn du 2 Texturen an unterschiedliche TMUs bindest und diese mit nur einem Quad zeichnest.

2: Ich bin mir ziemlich sicher, dass deine Geforce das kann. Aktuelle Grafikkarten können fast alle bist zu 16 Texturen gleichzeitig. ABER das nur wenn mit Shadern arbeitet. Über die Fixed Function (das was du gerade machst) sind es weniger. Ich meine NVidia hat dort Standard 4 Texturen und ATI/AMD 8. Aber selbst 4 sind mehr als ausreichend für dein Problem.

1: OpenGL zeichnet die Flächen so wie sie aufgerufen werden. Damit deine BlendFunc als wirken kann musst du sie vor dem Quad setzen, auf welches sie angewendet werden soll. Außerdem solltest du GL_BLEND mit glEnable aktivieren. Wenn es nicht mehr benötigt wird dann wieder mit glDisbale deaktivieren. Mit anderen Worten. glBlendFunc muss vor dem zweiten Quads stehen.

3: Ich weiß leider nicht genau wie die Texturen aussehen. Aber wenn die Schrift bereits auf der Wandtextur ist und das Licht der Lichtkegel aus dem Tutorial, dann benötigst du eigentlich gar kein Blending mehr. Vorrausgesetzt, dass du die Texturen mit MultiTexturing zeichnest! Denn durch das GL_MODULATE wird festgelegt, dass die erste Textur mit der Zweiten multipliziert werden soll bevor das Quad gezeichnet wird.

Ein Blending von GL_ONE, GL_ONE auf einem schwarzen Hintergrund sorgt nur dafür, dass beide Werte addiert werden. Und 0+Irgendwas ergibt immer Irgendwas. Also die Textur, die gezeichnet werden soll. Wenn du einen helleren Hintergrund hast wird alles heller bzw kann bei farbigem Hintergrund auch verfälscht werden.

Wenn du sie im Multipass Verfahren zeichnest (2 Quads) dann muss geblendet werden. Also wie die "Maske" nur das der Übergang in der Textur weicher ist. Aber für solche Fälle solltest du wohl eher MultiTexturing den Vorzug geben. Weil die Grafikkarte so etwas in einem Rutsch macht und keine 2 Durchgänge benötigt.


Zitat:
glBlendFunc(GL_ONE,GL_ONE) = nimm beide zu gleichen teilen

Ja. Aber das Ergebniss ist nicht normalisiert. Also es wird nicht Csrc*0.5 + Cdest*0.5 gerechnet sondern Csrc+Cdest. Wenn also ein Teil davon weiß ist, dann ist das Ergebniss davon auch immer weiß. 50% Grau + 50% Grau ergeben auch weiß.

Zitat:
glBlendFunc(GL_ZERO,GL_SRC_COLOR) = nimm von der neuen Textur nix und von der Textur im Buffer

Auch da hab ich eine Anmerkung. Prinzipiell stimmt das. Die Zielfarbe entpricht der Farbe aus dem Framebuffer. Aber die Intensität der Zielfarbwerte richtet sich nach dem Wert in der gebundenen Textur. Also Csrc * 0 + Cdest * Csrc. Befindet sich also in der Textur komplett Weiß, dann wird der Wert im Framebuffer mit 1 multipliziert. Es verändert sich nichts. Ist der Wert in der Textur aber Schwarz, dann wird alles mit 0 multipliziert. Kommt also auch schwarz raus. Natürlich funktioniert das auch anteilig also mit 50% Grau = 0.5 = alles wird um die Hälfte dunkler.
Bzw auch für jeden Kanal (RGB) getrennt. Hast du also eine Rote Textur ist das wie ein RotFilter. Es kommt nur noch der Rotanteil der Textur durch alles anderen wird 0 gesetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 05, 2008 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Anmerkung zu den Blendfunktionen: Siehe am besten auch mal glBlendFunc - Sinnvolle Kombinationen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 06, 2008 15:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Gut, danke für die Tipps. Problem 2 und 3 gelöst, aber 1 hab ich immer noch nich richtig hin bekommen.
Im Tutorial ist doch bei dem Beispiel von MultiPass die Rede, oder? weil damit gehts nich, aber wenn ich
das ganze mit Multitexturing veruche gehts auf einma! oO
Irgendwie steig ich noch nich ganz dahinter! Kann man glBlendFunc auch bei Multitexturing anwenden
und wenn ja wo muss ich das aufrufen?

MfG Bergmann


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 06, 2008 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Stichwort Statemachine! siehe 3. Absatz im Abschnitt "Was macht aber nun der obige Code?"

Wenn du etwas ausgibst, sei es mittels glVertex oder VBO oder sonstwie wird das mit den aktuell eingestellten Werten durchgeführt. z.B. Farbe oder Texturunit. Und eben auch Blending und Multitexturing. Sicherlich kann man Blending und Multitexturing gleichzeitig aktivieren, ob es sinnvoll ist und ob der gewünschte Effekt dabei entsteht weiss ich nicht.

Wenn was bei rumkommt, poste doch einen Screenshot :)

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 07, 2008 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Ich hab's nochma ausprobiert: wenn ich glBlendFunc beim Multitexturing benutz,
dann passiert zwar was, aber das is irgendwie nich das was es versprochen hat.
Meistens is das Bild bloß dunkler geworden, anstatt den versprochenen Effekt zu
liefern.
Und dann hab ich nochma n bisl beim Multipass rumprobiert: egal wo ich glBlendFunc
benutze, es kommt immer das gleiche raus. Und das 1. Problem hab ich immer noch
nich gelöst: immer noch schwarzer Bildschirm -.- !

Mfg Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 07, 2008 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du da immernoch glBlendFunc(GL_ZERO, GL_SRC_COLOR) nimmst, wundert mich das überhaupt nicht.
Denn damit sagst du, er soll von den neuen Fragmenten garnichts nehmen und die bereits vorhandenen mit der Farbe der neuen Fragmente multiplizieren. Das bedeutet, schwarz bleibt in jedem Falle schwarz.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 08, 2008 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
So stand's aber im Tutorial?! Und wenn ich glBlendFunc(GL_ONE_MINUS_SRC_COLOR,GL_SRC_COLOR)
nehm, dann kommt das dem Bild im Tutorial schon ziemlich nahe, aber es ist nich das gleiche.
BildBild
Und ne bessere Kombination der Werte find ich nich!

glBlendFunc(GL_ZERO, GL_SRC_COLOR):
Zitat:
Denn damit sagst du, er soll von den neuen Fragmenten garnichts nehmen und die bereits vorhandenen
mit der Farbe der neuen Fragmente multiplizieren. Das bedeutet, schwarz bleibt in jedem Falle schwarz.

Also heißt das, dass er das neue Fragment erst schwarz macht und dann multipliziert? Ich dachte immer das neue
Fragment bleibt so wie es ist im Speicher und mann kann die Farben dann benutzen. Und es wird dann bloß beim
zusammenbasteln nicht berücksichtigt?!

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 08, 2008 13:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, er macht es nicht erst Schwarz. Aber vielleicht solltest du für den Hintergrund, die Felsmauer, das Blending umstellen bzw. Deaktivieren. So wie das bei dir aussieht, wirkt die glBlendFunc, die schwarz schwarz sein lässt auch für den Hintergrund.

Das problem ist, dass er, wenn du ihm als zweiten Parameter GL_SRC_COLOR übergibst, die bereits vorhandene Farbe mit der Farbe der neuen Fragmente multipliziert. Deshalb bleibt schwarz schwarz, weil er nicht addiert.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 08, 2008 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
AHHH, jetzt gehts ^^

* Blending aus
* Quad mit Stein Textur zeichnen
* Blending an
* glBlendFunc(GL_ZERO,GL_SRC_COLOR)
* Quad mit DLG-Textutr zeichnen

naja, aller anfang ist schwer, muss erstma klar kommen wo was
hin muss und was passiert wenn's nich an der richtigen stelle is^^
DANKE AN ALLE FÜR DIE HILFE!

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 08, 2008 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wobei ich aber auch gestehen muss, dass das vermutlich nicht wirklich transparent ist. Sondern nur schwarz. Eben durch das GL_ZERO. Das kannst du testen in dem bei glClearColor eine andere Farbe einstellst. Das sollte immer schwarz bleiben.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]