Frage

Ich versuche, viele Kreise auf einer Kugel mit Shadern zu ziehen. Der Grund alogrith ist wie folgt:

  1. berechnen den Abstand von dem Fragment (unter Verwendung es Texturkoordinaten ist) auf den Standort der den Mittelpunkt des Kreises (den Mittelpunkt des Kreises ist auch in Texturkoordinaten angegeben)
  2. berechnet den Winkel von der fragent zum Zentrum des Kreises.
  3. basierend auf dem Winkel, greift auf eine Textur (die in ihm 360 Pixel und der rote Kanal spezifiziert einen Radiusabstand) und Abrufen den Radius für den gegebenen Winkel
  4. , wenn der Abstand von dem Fragmente zum Mittelpunkt des Kreises ist kleiner als der Radius abgerufen dann die Farbe des Fragments ist rot, ansonsten blau.

ich zeichnen möchte ... sagen 60 rote Kreise auf einem blauen Kugel. Ich habe y-Shader für einen Kreis zu arbeiten, aber wie 60 zu tun? Hier ist, was ich bisher versucht ....

  1. ich in einem Daten Textur übergeben, die den Radius für einen bestimmten Winkel gibt, aber ich bemerke Artefakte einschleichen Ich glaube, das auf lineare Interpolation durch, wenn ich versuche, Informationen aus der Daten Textur abgerufen werden:.

    float returnV = texture2D(angles, vec2(x, y)).r; 
    

    wobei Winkel sind die Datenstruktur (Sampler2D), dass der Radius für einen bestimmten Winkel enthält und x = Winkel / 360,0 (Winkel 0 bis 360 ist), und y = 0 bis 60 (y ist die Kreiszahl)

  2. Ich habe versucht, in einer Uniform Schwimmer Radien passing [360], aber ich kann nicht Radien mit dynamischer Indizierung zuzugreifen. Ich habe sogar versucht, dieses Chaos ...

    getArrayValue(int index) {
      if (index == 0) {
        return radii[0];
      }
      else if (index == 1) {
        return radii[1];
      }
    

    und so weiter ...

Wenn ich eine Textur und legen Sie alle Kreise auf dieser Textur und dann mehr Textur der blaue Kugel mit dem erstellen die Kreise enthalten, es funktioniert, aber wie man erwarten würde, ich habe wirklich schlecht Aliasing. Ich mag die Idee von proceduraly die Kreise zu erzeugen basierend auf der Position des Fragments und des Kreises, weil praktisch kein Aliasing. Aber ich muss ich tun, ehr als ein?

Thx !!!

~ Bolt

War es hilfreich?

Lösung

ich habe einen Shader, den Kreis auf dem Gelände macht. Er bewegt sich durch die Maus bewegt. vielleicht haben Sie eine Inspiration bekommen?

Dies ist ein Fragment Programm. es ist nicht das Hauptprogramm, aber Sie können es zu Ihrem Programm hinzufügen. try this ...

für jetzt können Sie einige einheitliche Parameter in hard geben.

uniform float showCircle;
uniform float radius;
uniform vec4 mousePosition;

varying vec3 vertexCoord;

void calculateTerrainCircle(inout vec4 pixelColor)
{
 if(showCircle == 1)
 {  
    float xDist = vertexCoord.x - mousePosition.x;
    float yDist = vertexCoord.y - mousePosition.y;

    float dist = xDist * xDist + yDist * yDist;
    float radius2 = radius * radius;

    if (dist < radius2 * 1.44f && dist > radius2 * 0.64f)
    {
        vec4 temp = pixelColor;

        float diff;
        if (dist < radius2)
            diff = (radius2 - dist) / (0.36f * radius2);
        else
            diff = (dist - radius2) / (0.44f * radius2);

        pixelColor = vec4(1, 0, 0, 1.0) * (1 - diff) + pixelColor * diff;   

        pixelColor = mix(pixelColor, temp, diff);
    }               
}   
}

und Vertex-Shader Sie hinzufügen:

varying vec3 vertexCoord;

void main()
{
    gl_Position = ftransform();

    vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
    vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
}

Andere Tipps

ufukgun , wenn Sie multuiply eine Matrix, die durch ihre Inverse Sie erhalten die Identität.
Sie;

vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);

ist also äquivalent zu

vertexCoord = vec3(gl_Vertex);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top