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

Aktuelle Zeit: Do Mär 28, 2024 11:50

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 13, 2013 09:12 
Offline
DGL Member

Registriert: So Feb 17, 2013 05:38
Beiträge: 8
Programmiersprache: Lazarus /Free Pascal
Hallo.


Nachdem ich viele Stunden erfolglos geblieben bin, ist es wohl soweit dass ich auch mal nach einem Lösungsvorschlag frage.
Danke schonmal für jeden der sich der Sache annimmt.


Was will ich erreichen?

Ein texturiertes Quad soll auf dem Bildschirm ausgegeben werden.
Allerdings soll die Textur eine Mischung aus 2 verschiedenen Texturen sein,
die abhängig von einem ALPHA-Wert interpoliert werden sollen (glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE),
der sich aus der Summe einer Alphatextur und der aktuell gesetzten Alphafarbe mittels glColor4f ergibt.


Was ist mein Problem?

Das scheint nicht zu gehen! Es wird nur eine Alphaquelle berücksichtigt (jeweils beide einzeln, aber nicht beide zusammen verrechnet).
Ich habe besten Gewissens den Code geschrieben, der aus meiner Sicht genau das machen sollte was ich beschrieben habe.

Woran liegt das?


Hier mein Codeschnipsel:


Konfiguration der Multitexturstufen:

Code:
  1.  
  2.   // Textur 1 setzen
  3.   glActiveTexture(GL_TEXTURE0);
  4.   glEnable(GL_TEXTURE_2D);
  5.   glBindTexture(GL_TEXTURE_2D, vTexID[3]);
  6.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  7.  
  8.  
  9.   // Alphatextur setzen
  10.   glActiveTexture(GL_TEXTURE1);
  11.   glEnable(GL_TEXTURE_2D);
  12.   glBindTexture(GL_TEXTURE_2D, vTexID[15]);
  13.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
  14.  
  15.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);
  16.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
  17.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR);
  18.   glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
  19.   glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
  20.  
  21.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
  22.  
  23.  
  24.   // Textur 2 setzen
  25.   glActiveTexture(GL_TEXTURE2);
  26.   glEnable(GL_TEXTURE_2D);
  27.   glBindTexture(GL_TEXTURE_2D, vTexID[2]);
  28.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
  29.  
  30.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
  31.  
  32.   glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
  33.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);
  34.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
  35.   glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE1); //<- ACHTUNG, diese Zeile meine ich weiter unten!
  36.   glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
  37.   glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
  38.   glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
  39.  


Darstellung des Quads:
Code:
  1.  
  2.   glBegin(GL_TRIANGLE_STRIP);
  3.  
  4.     glColor4f(0, 0, 0, 0);
  5.     glMultiTexCoord2fARB(GL_TEXTURE0, 0, 0);
  6.     glMultiTexCoord2fARB(GL_TEXTURE1, 0, 0);
  7.     glMultiTexCoord2fARB(GL_TEXTURE2, 0, 0);
  8.     glVertex3i(5, Clientheight-5, 0);
  9.  
  10.     glColor4f(0, 0, 0, 0);
  11.     glMultiTexCoord2fARB(GL_TEXTURE0, 0, 1);
  12.     glMultiTexCoord2fARB(GL_TEXTURE1, 0, 1);
  13.     glMultiTexCoord2fARB(GL_TEXTURE2, 0, 1);
  14.     glVertex3i(5, 5, 0);
  15.  
  16.     glColor4f(0, 0, 0, 1);
  17.     glMultiTexCoord2fARB(GL_TEXTURE0, 1, 0);
  18.     glMultiTexCoord2fARB(GL_TEXTURE1, 1, 0);
  19.     glMultiTexCoord2fARB(GL_TEXTURE2, 1, 0);
  20.     glVertex3i(Clientwidth-5, Clientheight-5, 0);
  21.   
  22.     glColor4f(0, 0, 0, 1);
  23.     glMultiTexCoord2fARB(GL_TEXTURE0, 1, 1);
  24.     glMultiTexCoord2fARB(GL_TEXTURE1, 1, 1);
  25.     glMultiTexCoord2fARB(GL_TEXTURE2, 1, 1);
  26.     glVertex3i(Clientwidth-5, 5, 0);
  27.  
  28.   glEnd;
  29.  



Dass größtenteils alles korrekt läuft zeigt mir die markierte Zeile..

Denn belasse ich diese bei: "glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE1);",
so werden beide Texturen korrekt abhängig der Alphawerte der Alphatextur geblendet.
Hier sollte er aber eigentlich das Ergebnis beider Alphawerte, die bei Textureinheit1 miteinander addiert werden nutzen.

Warum macht er das aber nicht?

Ändere ich diese so ab: "glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PRIMARY_COLOR);",
So werden beide Texturen korrekt abhängig der Alphawerte gegeben durch glColor4f geblendet.


Vielen Dank für jede kommende Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 13, 2013 14:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
ist das GL_TEXTURE ohne Zahl dahinter Absicht, in der Zeile direkt über der Markierten?

grüße

_________________
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  
BeitragVerfasst: Do Jun 13, 2013 18:05 
Offline
DGL Member

Registriert: So Feb 17, 2013 05:38
Beiträge: 8
Programmiersprache: Lazarus /Free Pascal
Lord Horazont hat geschrieben:
ist das GL_TEXTURE ohne Zahl dahinter Absicht, in der Zeile direkt über der Markierten?

grüße

Hallo Lord Horazont.

Schön zu sehen dass sich der Erste meldet. Vielen Dank dafür und lieben Gruß zurück!



Ja, ich bin den Code sehr genau durchgegangen bevor ich ihn gepostet habe, um unnötige Fehler zu vermeiden.
Bevor sich aber Fehler eingeschlichen haben, die auf Missverständnisse meinerseits beruhen, möchte ich das von dir Angesprochene erklären:

Textureinheit0 beinhaltet die erste Textur die geblendet werden soll. Deshalb wird sie in der letzten Textureinheit als Quelle der RGB-Daten angegeben mit GL_TEXTURE0.
Da die letzte Textureinheit2, die zweite Textur die geblendet werden soll enthält, gebe ich mit GL_TEXTURE, ohne Zahl dahinter, die aktuell gesetzte Textureinheit als Quelle an,
nämlich die eigene. Es ist also das Selbe, als hätte ich dort GL_TEXTURE2 angegeben.

Den weiter unten ausgeführten Testergebnissen nach deutet nichts darauf hin, dass dort der Fehler steckt.


Für jeden weiteren Denkansatz bin ich sehr denkbar!


Sicherheitshalber möchte ich euch noch genauer erklären was ich vorhabe:

Durch das Blending mit der Alphatextur als Alpha-Quelle, habe ich als Ergebnis schöne Strukturen.
Also Stellen, an denen man mehr von der ersten Textur sieht, und Stellen wo man mehr von der 2. Textur sieht.

Durch das Blending der gesetzten glClolor4f-Werte, habe ich als Ergebnis keine Strukturen, sondern ein
linieares Blending, bei dem an der linken Seite nur eine Textur zu sehen ist, an der rechten nur die andere,
und dazwischen halt ein flüssiger Übergang stattfindet.

Beide Effekte möchte ich aber nun miteinander kombinieren.
Ich verstehe einfach nicht warum der oben geposteter Code nicht zum erwarteten Ergebnis führt.
Ich kann tun und machen was ich will, es wird nur ein Effekt sichtbar.

Warum wird in Textureinheit1, in der eine Alpha-Textur geladen wird (die mit den Strukturen), nicht wie erwartet
dessen Alphawerte mit den gesetzten glColor4f-Alphawerten addiert?




Peusdocode:

aktiviere Textureinheit0, lade Textur 1.
aktiviere Textureinheit1, lade Alphatextur und verrechne dessen Alphawerte mit den gesetzten glColor4f-Alphawerten.
aktiviere Textureinheit2, lade Textur 2 und interpoliere (blende) die Texturen der Textureinheit0 und Textureinheit2 abhängig der Alphawerte des Ergebnisses aus Textureinheit1.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 13, 2013 19:16 
Offline
DGL Member

Registriert: So Feb 17, 2013 05:38
Beiträge: 8
Programmiersprache: Lazarus /Free Pascal
Hallo nochmal.

Ich habe diesmal alles belassen wie gepostet und habe nur an Textureinheit1 rumgespielt (mit der Alphatextur).
Dabei bin ich zu einem für mich enttäuschendem Ergebnis gekommen und bitte darum, dass es von jemanden bestätigt wird oder besser noch hoffentlich widerlegt ;)

Das was ich in Textureinheit1 versuche ist anscheinend garnicht möglich. Ich kann GL_PRIMARY_COLOR nur beim direkten Zeichnen verwenden,
nicht aber innerhalb einer Textureinheit als Quelle für eine Berechnung angeben. Die Berechnung würde die geladene Textur nicht beeinflussen.

Ergo würde es in meinem Projekt aufwendiger werden, aus meinen berechneten Alphawerten mittels glColor4f erstmal eine zweite Alphatextur über eines FrameBufferObjects zu generieren,
und diese in einer weiteren Textureinheit zu laden und erst dort beide Alphatexturen miteinander zu verrechnen.


Ist das so richtig? Gibt es vielleicht noch eine andere Möglichkeit peformanter zum Ergebnis ohne Shader zu kommen?
Das Problem ist ja, dass die aufwendigere Lösung unnötig Alphawerte in eine Textur schreiben muss, nur um sie wieder auszulesen,
anstatt wie von mir gewünscht direkt mit den von mir berechneten Alphawerten umzugehen :/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 13, 2013 19:37 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Was spricht denn gegen Shader?

_________________
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  
BeitragVerfasst: Do Jun 13, 2013 19:52 
Offline
DGL Member

Registriert: So Feb 17, 2013 05:38
Beiträge: 8
Programmiersprache: Lazarus /Free Pascal
damadmax hat geschrieben:
Was spricht denn gegen Shader?


Ich bin ein Neuling und lerne OpenGL von anfang an.
Gleichzeitig wende ich das Erlernte direkt in meinem Projekt in Form eines 3D-Spieles an.
Dadurch schreibe ich natürlich auch öfters meinen Code um, um die besseren Techniken zu nutzen.

Dieses Spiel sollte möglichst noch auf sehr alter Hardware flüssig und problemlos laufen.
Mittlerweile setze ich schon OpenGL1.5 vorraus. Wollte eigentlich erstmal nicht darüber gehen.
Z.b. lief mein Spiel früher noch auf einem alten Notebook gut. Leider unterstütze ich es mittlerweile nicht mehr,
weil es keine FrameBufferObjects kennt :/ Soweit bin ich noch gegangen.

Mir fehlen ohnehin noch viele Basics.. da will ich mich nicht mit sowas komplexen überfordern..
Immer schön der Reihe nach :) OpenGL1.5 bietet immernoch Funktionen die ich noch nicht kenne.


Solltest du aber eine Shaderlösung parat haben, wäre es nett wenn du diese mal präsentierst.
Bin neugierig wie sowas dann aussehen müsste um zu erreichen wonach ich strebe.

Und ja, irgendwann SEHR VIEL SPÄTER, werde ich mich auch mit der Shadersprache befassen ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 13, 2013 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ehrlich gesagt, habe ich mich nie mit den glTexEnv Geschichten auseinandergesetzt.
Und ich bin froh, dass ich meine Zeit nicht damit verschwendet habe.

Shader zu laden und zu binden wird ja alles fein im Wiki beschrieben.
Wenn du willst kann ich dir den Shader zu deinem Problem zusammenschrauben.

Ich will dich hier jetzt nicht überreden. Wollte nur zum Ausdruck bringen, dass du dir evtl einiges an Arbeit sparen kannst.
So weit ich weiss, sind die Combiner eh deprecated.

_________________
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  
BeitragVerfasst: Mo Okt 05, 2015 16:18 
Offline
DGL Member

Registriert: So Feb 17, 2013 05:38
Beiträge: 8
Programmiersprache: Lazarus /Free Pascal
Lustigerweise bin ich grade dahinter gekommen, warum es damals nicht klappen wollte, wie von mir gewünscht.
Für den Fall dass jemand ebenfalls noch mit Texture Combinern arbeitet (vielleicht ein altes Projekt?) und ähnliches Problem hat, wollte ich es mal mitteilen ;)

Meine spätere Vermutung, warum es nicht klappt, war doch falsch. Es ist durchaus möglich und im Grunde habe ich auch alles richtig gemacht.
Bis auf eines Missverständnisses:

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE1); //<- ACHTUNG, diese Zeile meine ich weiter unten!

In der damals gekennzeichneten Zeile, habe ich GL_TEXTURE1 gewählt. Was ich nicht wusste ist, dass es nicht dieselbe Quelle ist, als hätte ich GL_PREVIOUS geschrieben.
Ich dachte dass GL_PREVIOUS lediglich eine Textureinheit vorher meint. Da ich grade Textureinheit2 aktiviert hatte, müsste es also GL_TEXTURE1 sein.
Doch tatsächlich wurde mit GL_TEXTURE1 lediglich die in dieser Textureinheit geladene Alphamap genommen, während erst durch GL_PREVIOUS das Ergebnis des Combiners dieser Textureinheit verwendet wurde.
Sowie allgemein das Ergebnis aller Textureinheiten bisher.


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


Wer ist online?

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