opengl-blending?
-
hallo alle zusammen!
ich bin ein totaler newbe auf dem gebiet opengl(nur dass das einmal klar ist
) also ich möchte ein paar blaue (2D)linien zeichnenglBegin(GL_LINES); glColor4f(0.0f,0.0f,1.0f,1.0f); glVertex2f(-1.0f,-1.0f); glVertex2f(1.0f,1.0f); glEnd();und danach ein paar grüne linien
glBegin(GL_LINES); glColor4f(0.0f,1.0f,0.0f,1.0f); glVertex2f(1.0f,-1.0f); glVertex2f(-1.0f,1.0f); glEnd();soweit ist alles klar. ich möchte jedoch dass sich die farben am schnittpunkt nicht überlagern sondern dass die erste farbe (blau) übernommen wird und zwar zu 100%. also kurz gesagt die grünen linien sollen nur auf schwarzem hintergrund gezeichnet werden..... funktioniert das mit blending oder geht dass überhaupt? thx markus
-
am schnittpunkt nicht überlagern sondern dass die erste farbe (blau) übernommen wird und zwar zu 100%.
also wenn man den tiefen puffer nicht an macht und nur 2D benutzt dann ist die letzte line über den anderen ( im allgemeinen überdeckt das letzte was man zeichnet immer das was schon gezeichnet wurde )
also kurz gesagt die grünen linien sollen nur auf schwarzem hintergrund gezeichnet werden.....
willst du jetzt einfach nur linien zeichen oder hast irgentwas vor ?
-
nein, ich habe nichts mehr vor, nur linien, keine texturen oder sonstiges ....
-
damit man sich unter dem problem was vorstellen kann, probier ich mal dass ich beschreib, was das programm machen soll:
ich habe ein array indem verschiedene punkte stehen. diese punkte sollen am bildschirm gezeichnet werden und dann langsam verschwinden (nachleuchten) und das array kann sich während der laufzeit verändern. also das ganze soll der bildschirm eines oszilloskops werden, falls das jemand kennt. also ein strahl läuft von links nach rechts und zeichnet dabei einen punkt, dieser punkt wird langsam dunkler und im hintergrund soll noch eine skala zu sehen sein ...
-
also ein strahl läuft von links nach rechts und zeichnet dabei einen punkt, dieser punkt wird langsam dunkler und im hintergrund soll noch eine skala zu sehen sein
Und der "Strahl" überschneidet die skala ?
-
genau so ist es

-
wenn du erst die skala zeichnest und dann erst den "Strahl" überdeckt er die skala
-
an das hab ich selbst auch schon gedacht, aber die nachleuchtdauer und die geschwindigkeit mit der der strahl über den schirm läuft sollen einstellbar sein. deshalb habe ich es so gemacht dass ich den buffer nie lösche. wenn ich jetzt den strahl dunkler mache (lege ein rechteck mit dem alpha wert 0.1 alle paar ms über das ganze bild) wird auch die skala dunkler, wenn ich sie nachzeichne, überzeichne ich gleichzeigig auch mein signal ....
-
(lege ein rechteck mit dem alpha wert 0.1 alle paar ms über das ganze bild)
warum das ?
-
naja ich zeichne einfach den punkt wie er über den bildschirm läuft, also die ganze zeit. wenn er z.b. ein sinus-signal beschreibt zeichne ich jedes mal einen sinus. wenn sich jetzt die werte im array ändern zeichne ich ein anderes signal, welche signale das sind, weiß ich vor dem programmstart nicht ... damit die signale langsam verschwinden lege ich das rechteck darüber und dadurch dass ich den buffer nie lösche sieht es so aus als würde das signal langsam dunkler werden ....
-
ich glaube is ist das beste, wenn ich einfach mal den wichtigsten teil meines programmes kopiere. das ganze findet in der prozedur des win32- programmes statt. den timer1 verwende ich zum zeichnen der kurve, den timer2 zum verdunkeln des bildes.
case WM_TIMER: hDC = GetDC(hWnd); wglMakeCurrent(hDC,hRC); glLoadIdentity(); if ((long)wParam == ID_TIMER1) { KillTimer(hWnd,ID_TIMER1); div = ((float)bufLen)/(tb*1000.0); td = GetTickCount()-startTime; num = (long)((float)td*div); if (num < 64) { glDrawGrid(); glBegin (GL_LINE_STRIP); glColor4f (0.0f, 0.0f,1.0f,1.0f); for (cnt = last; cnt <= num; cnt ++) { x = ((float)cnt/((float)(bufLen-1)))*2.0-1.0; y = buffer[cnt]; if (x > 1.0f){x = 1.0f;} if (x < -1.0f){x = -1.0f;} if (y > 1.0f){y = 1.0f;} if (y < -1.0f){y = -1.0f;} glVertex2f (x,y); } last = num; glEnd (); } else { glDrawGrid(); glBegin (GL_LINE_STRIP); glColor4f (0.0f, 0.0f,1.0f,1.0f); for (cnt = last; cnt < bufLen; cnt ++) { x = ((float)cnt/63.0)*2.0-1.0; y = buffer[cnt]; if (x > 1.0f){x = 1.0f;} if (x < -1.0f){x = -1.0f;} if (y > 1.0f){y = 1.0f;} if (y < -1.0f){y = -1.0f;} glVertex2f (x,y); } last = 0; glEnd (); tb = timeBase*(float)divisions; reTime = (long)(tb/((float)bufLen)); startTime = GetTickCount(); } SetTimer(hWnd,ID_TIMER1,reTime,NULL); } if ((long)wParam == ID_TIMER2) { KillTimer(hWnd,ID_TIMER2); glBegin(GL_QUADS); glColor4f(0.0f,0.0f,0.0f,lightMult); glVertex2f(-1.0f,-1.0f); glVertex2f(1.0f,-1.0f); glVertex2f(1.0f,1.0f); glVertex2f(1.0f,-1.0f); glEnd(); SetTimer(hWnd,ID_TIMER2,lightTime,NULL); } glFlush(); break;