2016-05-21 11 views
0

Ich zeichne die Partikel in meinem Spiel als eine Kapsel (Zwei GL_POINTS, zwei GL_TRIANGLES). Alles ist schön dosiert, so dass ich zuerst die Dreiecke zeichne, dann die Punkte Sekunde (zwei Remis insgesamt).Probleme mit einfachen Partikeln mischen

Mein Problem ist, dass Sie in OpenGLs GL_POINTS selbst runden müssen, und ich habe es so im Fragment-Shader gemacht.

precision highp float; 

varying float outColor; 

vec3 hsv2rgb(vec3 c) 
{ 
    vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0); 
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); 
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); 
} 

void main() 
{ 
    vec2 circCoord = 2.0 * gl_PointCoord - 1.0; 
    gl_FragColor = vec4(hsv2rgb(vec3(outColor/360.0, 1.0, 1.0)) , step(dot(circCoord, circCoord), 1.0)); 
} 

Das Problem ist Ich muss auch Tiefensortierung tun, da ein Teilchen in zwei separaten Zieh gezogen wird ruft manchmal die z-Position ohne Tiefenpufferung nicht korrekt ist, da sie in zwei Zieh Anrufe gezogen werden.

Jetzt, da ich den Tiefenpuffer habe, und die abgerundeten Punkte vermischen sie sich nicht gut, und anstatt abgerundete Partikel haben sie einen schwarzen Bereich um sie herum. Irgendwelche Ideen?

einige zusätzliche Hinweise: Ich ios OpenGL ES (Ziegel basiert latenten Rendering glaube ich)

Jedes Teilchen zunächst als zwei Punkte definiert ist, die aktuelle Lage und die Lage in den letzten Frame war zu tun. Diese beiden Punkte werden später mit GL_POINTS gezeichnet. Dann wird der rechteckige Teil mit zwei Dreiecken gebildet, die durch Finden eines Vektors senkrecht zu dem Vektor der zwei Punkte bestimmt werden.

Auch die Partikel sind bereits in der Reihenfolge von vorne nach hinten sortiert. Technisch ist ihre z-Position beliebig, ich brauche sie nur, um intakt zu sein.

+0

Ich bin neugierig, ob Sie Desktop OpenGL oder OpenGL ES verwenden. –

+0

@NicolBolas Ich habe das in den Beitrag eingefügt. Hat das Sinn gemacht? –

+0

Ich würde mit der Verwendung von Tiefentestbedingungen beginnen, die auch gleiche Z-Koordinaten akzeptieren, aber das Z-Kämpfen nicht vollständig auflösen wird. Dann würde ich den zweiten Draw Call eliminieren und alles im Single-Pass rendern. Dafür musst du deinen Shader ändern. Wenn du nahe am Dreieck bist, rende stattdessen deinen Punkt. Ohne zu wissen, was Sie zu tun versuchen, ist dies nur eine Vermutung. Fügen Sie einige Beispielbilder hinzu. Wenn Sie die zweite Zeichnung nicht loswerden können, dann rendern Sie die Punkte mit einem gewissen Versatz in der Z-Achse des Kameraraums (tun Sie das innerhalb des Vertex-Shaders), aber das funktioniert nicht, wenn Ihre Dreiecke sich überschneiden – Spektre

Antwort

1

Auch die Partikel sind bereits in der Reihenfolge von vorne nach hinten sortiert. Technisch ist ihre z-Position beliebig, ich brauche sie nur, um intakt zu sein.

Ich vermute, das ist dein Problem.

Punkte sind quadratisch. Sie können die Überblendung so verändern, dass sie rund erscheint, aber die Geometrie (und damit der Tiefenwert) ist immer noch quadratisch. Dinge hinter dem Punkt sind Z-fehlgeschlagen durch die Ecken, die außerhalb der farbigen runden Region sind. Das einzige Problem, das behoben werden kann, ohne den Algorithmus vollständig zu ändern, ist entweder ein Dreiecksgitter anstelle eines Punkts (also die tatsächliche Geometrie ist rund) oder discard Fragmente im Fragment-Shader für Punktpixel außerhalb des runden Bereichs du willst es behalten.

Beachten Sie, dass discard in Shadern verwendet, kann relativ teuer sein, so überprüfen Sie die Leistung dieses Ansatzes ...

+0

Ich habe etwas darüber geforscht. Stellt sich heraus, Apple-Geräte verwenden eine andere Rendering-Pipeline, die das Problem an erster Stelle verursacht. Ich habe es ausprobiert, mit Hilfe von Dot-Produkten der Fragment-Position zu arbeiten, und das hat überraschend mit einer tolerierbaren Latenzzeit funktioniert! Es ist möglich, dass, wenn ich dies auf Android portiere, die Situation anders sein wird. –