Ist es möglich mit OpenGL-point-sprites zu simulieren billboard-sprites?
Ich versuche zu set-point-sprites in OpenGL um die Größe zu ändern mit der Entfernung nur als billboarded sprite würde, aber ich kann Sie nicht die Werte in GL_POINT_DISTANCE_ATTENUATION_ARB
etwas nützliches zu tun. Gibt es eine Korrelation der Werte an, die eine übereinstimmung mit einer gegebenen Projektion? Ist, was ich versuche zu tun, auch möglich?
Render-code:
glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)wglGetProcAddress("glPointParameterfARB");
glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)wglGetProcAddress("glPointParameterfvARB");
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluPerspective(100.0, 800.0/600.0, 0.1, 10.0);
float quadratic[] = { 5.0f, 0.1f, 10.0f };
glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic );
float maxSize = 0.0f;
glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize );
if( maxSize > 100.0f ) maxSize = 100.0f;
glPointSize( maxSize );
glPointParameterfARB( GL_POINT_FADE_THRESHOLD_SIZE_ARB, 0.1f );
glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 0.1f );
glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize );
glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );
glEnable( GL_POINT_SPRITE_ARB );
glScalef(0.75,1,1);
glTranslatef(0.00,0.0,-1.0);
glScalef(0.5,0.5,0.5);
glRotatef(counter*0.1+0.5,1.0,1.0,0.0);
glBegin( GL_POINTS );
for( int i = 0; i < 100; ++i )
{
glColor4f( i%10*0.1, i/10*0.1, 0.5, 1.0f );
glVertex3f( i%10*0.2-1.0,i/10*0.2-1.0,
((i%10-5)*(i%10-5)+(i/10-5)*(i/10-5))*0.01 );
}
glEnd();
glDisable( GL_POINT_SPRITE_ARB );
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier, wie ich meine Armen Mannes Ansatz zur Skalierung der Schriftgröße in Punkt:
Vertex-shader:
Können Sie tun, was Sie wollen, in den fragment-shader, aber Sie haben, um zu berechnen, Farbe, Beleuchtung und Texturierung selbst.
GLSL beiseite, tun, was Sie wollen, ist ziemlich einfach mit Abstand die Dämpfung. Zu sehen, wie sich die projizierte Größe der Dinge nimmt quadratisch mit dem Abstand in der Perspektive Projektionen, müssen Sie nur verwenden Sie die quadratische Faktor.
Wenn Sie möchten, verwenden Sie den Punkt Größe, die Sie manuell einstellen, bei einem Abstand von, sagen wir, 150 Einheiten aus dem Auge, nur mit 1/(150^2) wie der quadratische Faktor (und null für die Konstante und lineare Faktoren-wenn alles, was, die Sie verwenden möchten, können Sie einige kleine Nummer wie 0,01 für den Konstanten Faktor nur um mögliche Divisionen durch null).
In meiner Erfahrung, die Punktgröße, die Dämpfung ist nicht der Mühe Wert. Sie sind viel besser schreiben eine sehr einfache GLSL vertex shader, setzt die Schriftgröße in Punkt manuell nach ein paar Berechnungen, die Sie durchführen auf eigene Faust. Es dauerte etwa einen halben Tag zu lernen von Grund auf alle GLSL, die ich brauchte, um dies geschehen zu lassen.
Den GLSL-code kann so einfach sein wie diese paar Zeilen:
Wo
psize
ist der Punkt, den parameter "Größe" der Benutzer wählt.Nur noch einen Blick in pmviewer.sourceforge.net der code wird mithilfe von point-sprites und jeder Punkt hat eine eigene Farbe und Größe zu simulieren volume rendering:
Der vertex-shader ist:
vertexShader
pixelShader
Nur zum versenden von Partikeln auf der gpu:
Dann machen Sie: