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

Aktuelle Zeit: Fr Jul 18, 2025 20:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Blending funktioniert nicht...
BeitragVerfasst: Fr Dez 08, 2006 21:00 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
Hallo Alle Mit einand.

Ich versuche gerade mir ein Sample zu Baun das so die Grundlagen von Blending Zeigt. Dazu habe ich mit verschiedenen Headern ( unter anderem SDL, DGLOPENGL, GL und OpenGL32.dll ) ein Fenster erstellt.

und dann folgendes in meine Render Function Eingetragen.

Code:
  1.  
  2.  
  3.   glenable(GL_BLEND);
  4.   glBlendFunc(gl_ONE, GL_ZERO);
  5.   glcolor3f(1, 0, 0);
  6.   glbegin(GL_TRIANGLES);
  7.   glvertex3f(0, 0, 0);
  8.   glvertex3f(1, 1, 0);
  9.   glvertex3f(0, 1, 0);
  10.   glend;
  11.   glBlendFunc(gl_ONE_MINUS_DST_ALPHA, GL_ONE);
  12.   glcolor3f(0, 1, 0);
  13.   glbegin(GL_TRIANGLES);
  14.   glvertex3f(1, 0, 0);
  15.   glvertex3f(1, 1, 0);
  16.   glvertex3f(0, 1, 0);
  17.   glend;
  18.  


Zu Sehen ist dann immer das Rote Dreieck, aber nie das Grüne. Eigentlich sollte aber das Grüne auch zu sehen sein. Zumindest der Teil der nicht unter dem Roten ist.

Alle Erstellten Samples laufen weder auf meinem Rechner, noch auf meinem Laptop.

Habe das ganze dann verschickt an jemand anders bei dem Liefs angeblich, aber gesehn hab ichs net.

Mein Rechner hat ne Gforce4 ti 4600. Die müste ja eigentlich schon OpenGL fähig sein, oder ?

Gibts da noch irgend einen trick ?

bzw mag mir das jemand in eine Exe Kompilieren und mir diese Schicken , so das ich Testen kann obs dann tut.

Ach bevor ich es Vergesse :

Wenn ich das ganze unter C++ Compiliere und dann auf meinem Rechner ausführe klappt es wunderbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 08, 2006 21:18 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
gl_ONE_MINUS_DST_ALPHA <- enspricht das in deinem Fall nicht 0?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 08, 2006 21:23 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
So habe euch mal das gesammte Project angehängt.

Bei einem Rechner mit einer ATI Radeon 9800 hatte man die beiden Dreiecke gesehn , nur eben bei meinem system net.


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 01:09 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Wenn du in der Blend-Funktion DST_ALPHA verwendest, so musst du auch sicherstellen das dein Framebuffer Alphawerte enthält. Dies gibst du im Pixelformat bekannt, also beispielsweise in Windows mit der Funktion ChoosePixelFormat. Wird aber vor allem auf älteren Karten wohl eher nicht in Hardware unterstützt, also wenn es sich vermeiden lässt würde ich das anders machen. Bei welchen Grafikkarten genau das funktioniert weiß ich nicht, aber wenn du es im Pixelformat angibst solltest du zumindest entsprechende Fehlermeldungen von den jeweiligen Funktionen erhalten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 07:35 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
AHA

das ist mal ne Aussage die schon mal nicht Schlecht ist.

Dann stellt sich mir natürlich gleich die Frage wie stelle ich das Pixelformat Richtig ein ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 08:52 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
Juhu, Ich habe es gefunden.

die Procedur CreateRenderingContext

ind DGLOPENGL.pas ist falsch

da feht der Eintrag

Code:
  1.     cAlphaBits := 8;


wenn ich den Eintrage dann läuft es wunderbar ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 11:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich würde mich nicht darauf verlassen, dass du dann immer einen Alphakanal im Framebuffer bekommst. Sobald du zum Beispiel im Windows auf 24 Bit Farbtiefe stellst könnte er auf einigen Systemen weg sein. Bzw ist das Pixelformat nur ein Vorschlag. Was die OpenGL/Windows dann anbietet bleibt denen überlassen. Also typisch bei 24 Bit Farbtiefe dann.

Evtl solltest du für später auch überlegen wie du das Realisieren könntest ohne einen Alphakanl im Framebuffer zu benötigen bzw ohne aus dem Framebuffer zu lesen. Das ist nämlich mitunter auch nicht das Schnellste.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 13:41 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Es ist nicht so sehr das Problem dass ChoosePixelFormat nur einen Vorschlag macht:

Zitat:
If the function succeeds, the return value is a pixel format index (one-based) that is the closest match to the given pixel format descriptor.


Da kannst du dann mit DescribePixelFormat abfragen ob da eh wirklich ein Alphawert im Framebuffer drinnen ist. Das größere Problem ist, dass es nicht mehr ganz so leicht ist zu überprüfen ob das dann auch in Hardware-Modus läuft oder von Software emuliert wird.

Im Zweifelsfalls kannst du mit der Extension WGL ARB pixel format auch die HW-Unterstützung sicherstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 14:00 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 18:26
Beiträge: 17
Wohnort: Halle, Sachsen-Anhalt
Mir würde spontan zu
glBlendFunc(gl_ONE_MINUS_DST_ALPHA, GL_ONE);
noch etwas anderes einfallen. Du rechnest ja im Prinzip (1-dst_alpha)*src_color + 1*dst_color.
Erstens ergibt dies gegebenenfalls einen Wert GRÖßER als 1, was unterschiedliche Ergebnisse bei unterschiedlichen Grafikkarten bringen könnte (interne Rechengenauigkeit).
Zweitens gibst du keinen Alpha Wert explizit an, also ist sowohl beim ersten Dreieck als auch beim zweiten der Alphawert 1:
(1-1)*src_color + 1*dst_color = dst_color
Damit dürfte NUR das Dreieck in der zuletzt angeführten Farbe angezeigt werden.
Wenn du additives Blending probieren willst, so muss du glBlendFunc(GL_ONE, GL_ONE) angeben, bei gewichtetem Blending
glBlendFunc(gl_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA)
Einfach mal rumprobieren, Blending geht eigentlich immer, auch ohne Alpha bits anzugeben (also Alpha bits = 0, selbst in reiner Software Emulation).

_________________
"Wer nicht arbeitet, kann auch nichts falsch machen"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 14:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Lyr: Nicht ganz. Du kannst abfragen ob das ganze in Software läuft wenn nach einem DescribePixelFormat in dem Feld dwFlags das Flag PFD_GENERIC_FORMAT gesetzt ist.

Corpsman: Aber mal ne ganz andere Frage. Was genau hast du damit vor? Evtl ist es ja so, dass du das Problem viel zu kompliziert siehst und es noch so 1-2 andere bessere Möglichkeiten gibt. So richtig habe ich nicht verstanden was du damit bezwecken möchtest.

PS: Die Blendfunc glBlendFunc(GL_ONE, GL_ZERO); ist genau das Gleiche wie ein deaktiviertes Blending.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 10, 2006 11:24 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
Hallo, thx erst mal für die Nette Diskusion.

Dieses Sample das ich da gerade baue hat eigentlich, überhaupt keinen Sinn.

Ich habe ne Vorlesung an der Uni in der wurden Compositing operatoren besprochen.

Und der Prof hat gesagt das wird so gemacht.

Da gibts z.b. einen der heist B over A und wird dann mit :

Code:
  1.         glBlendFunc(GL_ONE, GL_ZERO);
  2.         glColor4f(red_alpha * 1.0, 0.0, 0.0, red_alpha);
  3.         drawRedTriangle();
  4.         // glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA); OR
  5.         glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  6.         glColor4f(0.0, green_alpha * 1.0, 0.0, green_alpha);
  7.         drawGreenTriangle();

Implementiert.


Von diesen Compositing Teilen gibt es ebend 12 verschiedene. Und damit die Gehn habe ich den Alpha Kanal gebraucht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 10, 2006 14:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Okay. So etwas ähnliches habe ich mir schon gedacht. Da ist es dann recht egal. Nur bei Anwendungen die auf so vielen Systemen wie möglich funktionieren sollen kann man nur vom Gebrauch des Framebufferalphakanals abraten. Da dieser nicht immer zwingend gegeben sein muss.

PS: Wo dieser aber vorhanden sein muss sind zum Beispiel PixelBuffer oder Framebuffer Objects. Diese kann man dann wiederrum als Textur verwenden. Das aber nur mal am Rande.


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.018s | 16 Queries | GZIP : On ]