Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.08.2010, 18:39

Blending mit OpenGL - warum sieht man nichts bei Rot und Grün?

Hallo,

hab eine Klasse zum Plotten von Funktionen von R nach R. Warum klappt das mit dem Blending bei Rot-Grün nicht, bei den anderen (Grün-Blau, Blau-Rot)Mischungen aber schon? (siehe Dateianhang)

Danke


Georg
»georg« hat folgendes Bild angehängt:
  • blending.png

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

31.08.2010, 18:58

Verwendest du einen Depth Buffer? Zeig mal wie du das Blending genau machst und in welcher Reihenfolge deine Plots gezeichnet werden.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

31.08.2010, 19:28

Funktioniert doch... Schau genau hin! :)
@D13_Dreinig

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

31.08.2010, 21:52

Es funktioniert, allerdings ist die Veränderung minimal, darum fällt es kaum auf. (Zoom mal bis auf die einzelnen Pixel heran, dann wirst du es erkennen.)
WIP Website: kevinheese.de

5

01.09.2010, 15:02

@dot: Ich verwende keinen Depth Buffer, hatte es jetzt allerdings auch mit Depth-Testing und -Buffer probiert (siehe Anhang: Quellcode / Rechenweg)

@David_pb & KeksX: Ich kann nichts erkennen (siehe Anhang: Plot) - bin ich Rot-Grün-Blind?

@KeksX: Laut Rechenweg (siehe Anhang) sollte die Veränderung aber nicht minimal sein.

Quellcode: http://rapidshare.com/files/416442704/quellcode.cpp (übersichtlich eingerückt mit Visual Studio)
oder:


C-/C++-Quelltext

1
2
3
4
5
#include <cassert>#include <cmath>#include <iostream>#include <vector>#include <Windows.h>
#include <glut.h>
using namespace std;class plot{static boolinstanziiert;static floatschritt,links,rechts,hoeheHalbierende,oben,unten;static vector<float(*)(float)> funktionen;static void setNaechsteFarbe(bool reset = false){static int index = 0;if(reset) index = 0;const float farben[][4] ={{1.f, 0.f, 0.f, .5f},{0.f, 1.f, 0.f, .5f},{0.f, 0.f, 1.f, .5f},};glColor4fv(farben[index]);index = (index + 1) % 3;}static void zeichneHalbierende(){glLineWidth(1.f);glColor3f(1.f, 1.f, 1.f);glBegin(GL_LINES);glVertex3f(links,hoeheHalbierende, 0.f);glVertex3f(rechts,hoeheHalbierende, 0.f);glEnd();}static void zeichneRahmen(){glLineWidth(8.f);glColor3f(.15f, .15f, .15f);glBegin(GL_LINE_STRIP);glVertex3f(links,unten,0.f);glVertex3f(rechts,unten,0.f);glVertex3f(rechts,oben,0.f);glVertex3f(links,oben,0.f);glVertex3f(links,unten,0.f);glEnd();}static void init(){glClearColor(0.f, 0.f, 0.f, 0.f);//glEnable(GL_DEPTH_TEST); brauch ich nichtglEnable(GL_LINE_SMOOTH);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Standard-BlendFunc}static void reshapeFunc(int breite, int hoehe){if(hoehe == 0) hoehe = 1;if(hoehe < breite){glViewport((breite - hoehe) / 2, 0, hoehe, hoehe);}else{glViewport(0, (hoehe - breite) / 2, breite, breite);}glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(links, rechts, unten, oben, 1., -1.);glMatrixMode(GL_MODELVIEW);}static void displayFunc(){glClear(GL_COLOR_BUFFER_BIT);//|//GL_DEPTH_BUFFER_BIT); // brauch ich nichtzeichneHalbierende();glLineWidth(4.f);for(vector<float(*)(float)>::const_iterator it = funktionen.begin(); it != funktionen.end(); it++){if(it == funktionen.begin()) setNaechsteFarbe(true);glBegin(GL_LINE_STRIP);for(float i = links; i < rechts + 2 * schritt; i += schritt){glVertex3f(i, (*it)(i), 0.f);}glEnd();setNaechsteFarbe();}zeichneRahmen();glutSwapBuffers();}static void keyboardFunc(unsigned char taste, int, int){if(taste == 27)exit(0);}static unsigned int __stdcall threadFunktion(void*){glutMainLoop();}public:plot(){assert(!instanziiert);instanziiert = true;schritt= .005f;links= 0.f;rechts= 10.f;hoeheHalbierende= 0.f;oben= hoeheHalbierende + (links - rechts) / 2;unten= hoeheHalbierende - (links - rechts) / 2;
funktionen.push_back(sin);funktionen.push_back(cos);funktionen.push_back(tan);
int argc = 1;char* argumente = "";glutInit(&argc, &argumente);glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA);glutCreateWindow("");glutReshapeFunc(reshapeFunc);glutDisplayFunc(displayFunc);glutKeyboardFunc(keyboardFunc);init();// TODO: neuen Thread erzeugenglutMainLoop();}};bool plot::instanziiert= false;float plot::schritt= 0.f;float plot::links= 0.f;float plot::rechts= 0.f;float plot::hoeheHalbierende= 0.f;float plot::oben= 0.f;float plot::unten= 0.f;vector<float(*)(float)> plot::funktionen= vector<float(*)(float)>();int main(){plot();}
»georg« hat folgende Bilder angehängt:
  • plot.png
  • rechenweg.png

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

01.09.2010, 16:40

Nein, das Grün überdeckt das Rot nicht komplett. Setz mal die Linewidth auf 20, da fällts mehr auf.

Edit: Ich hab an der betreffenden Stelle im Farbpuffer den Wert (35, 212, 0, 255). Rotanteil ist also auf jeden Fall vorhanden! ;)
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (01.09.2010, 17:08)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

01.09.2010, 17:24

Es stimmt was David_pb sagt, das Blending funktioniert vollkommen korrekt. Wenn du dir mal die Farbwerte der Pixel an den entsprechenden Stellen anschaust wirst du das auch feststellen. Ich denke das Problem ist hier dass unser Auge Grün als heller wahrnimmt als Rot und Blau und der schwache Rotton bei der Grün/Rot Überlappung daher etwas untergeht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

01.09.2010, 17:33

Es stimmt was David_pb sagt, das Blending funktioniert vollkommen korrekt. Wenn du dir mal die Farbwerte der Pixel an den entsprechenden Stellen anschaust wirst du das auch feststellen. Ich denke das Problem ist hier dass unser Auge Grün als heller wahrnimmt als Rot und Blau und der schwache Rotton bei der Grün/Rot Überlappung daher etwas untergeht.


Genau so ist es:

Quellcode

1
2
3
4
BR -> 39
BG -> 53
GR -> 136
GB -> 57

(FARBE1FARBE2 -> Luminanz)

Grün-Rot hat mit Abstand die höchste wahrgenommene Helligkeit. Da sticht das Grün so richtig raus. Wenn du den Alphawert für Grün etwas runter setzt (z.B. so um 0.3) dann bekommst du ganz annehmbare Werte.
Die Abweichung von deiner Rechnung kommt übrigens durch die Linienglättung, wenn du die aus machst hast du immer genau die erwarteten (1.0, 0.5, 0.25, ...) Werte.
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (01.09.2010, 17:39)


9

01.09.2010, 20:41

Stimmt! Danke für die kompetenten Antworten!!!

Werbeanzeige