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.
Ich bin neugierig, ob Sie Desktop OpenGL oder OpenGL ES verwenden. –
@NicolBolas Ich habe das in den Beitrag eingefügt. Hat das Sinn gemacht? –
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