2011-01-02 13 views
1

Hier ist der Deal, ich möchte ein Partikelsystem basierend auf Texturen und ich habe eine Cloud-Textur. Ich mappe die Textur auf 10 verschiedene Polygone mit gleicher Größe und Textur. Wenn ich sie übereinander mische, steigt ein Problem und Pixel, die in 5 Polygonen sind, werden zu weiß! Ich will das nicht. Was ich will, ist etwas wie Akkumulationspuffer Wirkung. Ich möchte einen Effekt wie folgt machen:Mischen mehrerer Texturen zu einem Partikelsystem

sagen Rx, Bx, Gx werden jede Pixelfarbe, wenn nur 1 Polygon ist in Seite und Pixel ist drin. Jetzt haben wir n Polygone von gleicher Größe und Textur.

Rtotal = R1/n + R2/n + ... + Rn/n gleiche gilt für gtotal und Btotal

Was kann ich solche Ergebnisse von Alpha-Blending zu erhalten tun.

BTW hier ist die Initialisierung.

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glEnable(GL_DEPTH_TEST) ; 
glDepthFunc(GL_ALWAYS); 

glEnable(GL_NORMALIZE); 
glColor4f(.5,.5, .5,.2); 
glBlendFunc (GL_SRC_ALPHA, GL_DST_ALPHA); 
+0

Sie haben Ihr Ziel OpenGL Version zu erzählen. – Kos

+1

Sie können eine Lösung mit zwei Durchgängen mit Shadern durchführen, wobei Sie die Anzahl der Partikel in jedem Fragment im ersten Durchgang zählen. Dann kannst du die Aufteilung so machen, wie du es beschrieben hast. – Plow

+0

Klingt wie eine coole Antwort: D aber ist schwer für mich, weil ich Shader neu bin. –

Antwort

1

Es ist schwierig, das Ergebnis genau zu machen, wie Sie es haben wollen, wie Sie für jedes Pixel wissen bräuchten, wie viele Fragmente dort waren.

Wenn es ausreicht, dass die Partikel in Ordnung aussehen, sollte es ausreichen, den Füllmodus zu ändern.

sie weiß häufen, weil Sie wahrscheinlich additive Alpha-Blending verwenden:

result = source_color*source_alpha + destination_color 

oder einfache additive Mischung:

result = source_color + destination_color 

(wo Quelle "die Farbe eines gegebenen Fragments" und Ziel ist "was war schon im Framebuffer an diesem Ort").

Beide zerfallen zu Weiß mit vielen "Schichten". Aber Sie können "True" Alpha Blending verwenden:

die nicht zu weiß zerfallen.

In OpenGL entspricht dies:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Das ist nicht genau das, was Sie da das Ergebnis wollten auftragsabhängig sein wird, aber es sollte für ein Partikelsystem 100% ausreichend sein. Ich hoffe, das hilft.

(auch nicht vergessen, die feste Geometrie vor den Teilchen zu machen und deaktivieren z-schreibt dann.)

+0

Wenn ich das tue, was du sagst, werden Polygone nicht miteinander vermischt! Vielleicht sollte ich den Code posten. Bitte sagen Sie mir, ob Sie Zeit haben, es zu überfliegen. –

+0

Auch ich habe die letzten Zeilen nicht bekommen. Können Sie bitte mehr erklären –

+0

Erinnern Sie sich daran, glEnable (GL_BLEND) zu tun?Sie können auch die relevanten Teile des Codes posten, und vielleicht ein Rahmenprotokoll von GLintercept, wenn Sie möchten. – Kos