2009-07-22 13 views
3

Ich versuche, einen einfachen Ray Tracer zu erstellen. Ich habe eine perspektivische Ansicht, die die Strahlen sichtbar zum Debuggen zeigt.OpenGL Alpha Mischen mit falscher Farbe

In meinem Beispiel screenshot unten habe ich eine einzelne weiße Kugel raytraced und eine grüne Kugel, die das Auge darstellt.

 
    glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_GREATER, 0.0f); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA,GL_SRC_ALPHA); 

können Sie: Ich habe folgendes gegeben

Rays sind als Linien gezeichnet mit

glLineWidth(10.0f)

Wenn ein Strahl die Kugel verfehlt Farbe

glColor4ub(100,100,100,100);

in meinem Initialisierungscode Im Screenshot sehen Sie, dass aus irgendeinem Grund die Strahlen, die zwischen dem perspektivischen Betrachtungspunkt und der Sphäre passieren, mit der Achsenlinie hinter dem Sph gemischt werden und nicht mit der Kugel selbst. Hier

ist ein Screenshot:

screenshot

Kann mir jemand erklären, was ich hier falsch mache?

Danke !!

+0

Ich bearbeitet, um Ihre Screenshot –

Antwort

7

Ist es eine Möglichkeit, diese Strahlen zu werfen, bevor Sie die Kugel zeichnen?

Dann, wenn Z-Puffer aktiviert ist, werden die Fragmente der Kugel einfach nicht gerendert, da diese Teile der Strahlen näher sind. Wenn Sie etwas halbtransparent zeichnen (durch Mischen), sollten Sie die Reihenfolge, in der Sie Dinge zeichnen, genau beobachten.

In der Tat denke ich, dass Sie Z-Puffer in keiner vernünftigen Weise zusammen mit Ray-Tracing-Prozess verwenden können. Sie müssen Z-Reihenfolge manuell verfolgen. Während wir dabei sind, ist OpenGL möglicherweise nicht die beste API zur Visualisierung von Ray-Tracing-Prozessen. (Es wird so möglicherweise viel langsamer als reine Software Ray-Tracer)

+0

Nun, ich werde ... nur die Reihenfolge der Zeichnung Code ist alles, was es dauerte; Ich hatte keine Ahnung, dass das so viel bewirken könnte !! Danke mein Herr! Sie sind ein Gentleman und ein Gelehrter. –

+0

Nur um meine Absicht für die Neugierigen zu klären. Die tatsächliche Raytracing-Funktion ist vollständig unabhängig von der OpenGL-Zeichnung.Ich habe gerade eine 3D-Perspektive geworfen, um mir beim Debuggen zu helfen, während ich meinen Raytracer funktioniere. Es zeigt nur die Strahlen und eine Kopie des Raytracing-Bildes, das auf einem Quad vor dem Raytracer-Augenpunkt strukturiert ist. –

+0

@puddlesofjoy: jede Chance, Sie könnten die Frage bearbeiten und das Ergebnis nach diesem Update hinzufügen? Es könnte für die Leute lehrreich sein zu sehen, wie das beabsichtigte Ergebnis aussah. Keine große Sache - nur ein Vorschlag. Froh, dass es geklappt hat! – Argalatyr

2
  1. Sie brauchen nicht die glAlphaFunc, deaktivieren Sie es.
  2. Lichtstrahlen sollten, indem man den Puffer gemischt werden. glBlendFunc(GL_ONE, GL_ONE) (für premultiplied alpha, die Sie gewählt haben
  3. Schreiben Tiefenpuffer ausschalten (nicht testen) beim Rendern der Strahlen: glDepthMask(GL_FALSE)
  4. die Strahlen Render . letzte
0

Alphatest nur zum Verwerfen Fragmente ist -. nicht für sie das Mischen prüfen the spec , indem Sie es, Sie OpenGL sagen, dass Sie es wollen die Pixel wegzuwerfen, statt sie zu zeichnen, so werden Sie nicht kann jeder transp Arent Mischen. Die gebräuchlichste Mischfunktion ist glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Sie können auch die OpenGL Transparency FAQ überprüfen.

Verwandte Themen