Wie würde ich Nebel einrichten, um den Koordinaten eines Spielers zu folgen?


7

Ich frage mich, ob es möglich ist, einen Nebel an den Koordinaten eines Spielers einzurichten (wo Nebel um den Spieler herum ist, um ihn zu einer dritten Person zu machen). Der Hauptgrund, warum ich dies frage, ist, dass ich meinen Spieler mehr in der oberen rechten Ecke von habe der Bildschirm

Hier ist ein Code, der Ihnen eine Anleitung geben kann, was ich tue:

glEnable(GL_FOG) GLfloat FogColor[] = {0.8,0.8,0.8,1.0};
glFogfv(GL_FOG_COLOR,FogColor);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogf(GL_FOG_START,30);
glFogf(GL_FOG_END,);
glHint(GL_FOG_HINT,GL_NICEST);

und ich möchte, dass der Nebel einem Spieler mit einer Position wie in folgt folgt

posX,posY,posZ

Wenn jemand dies in einen Beispielcode umwandeln kann, wäre das sehr hilfreich, danke

Wenn dies nicht möglich ist, wie würde ich dann den Nebel so einstellen, dass er sich um eine bestimmte Position der Kamera befindet, z. B. in der oberen rechten Ecke der Kamera anstelle der Mitte?

Hier ist ein Bild des Spielbildschirms, damit Sie sehen können, wovon ich spreche:

Geben Sie hier die Bildbeschreibung ein

Antworten:


1

Ich denke, dies wäre am einfachsten mit Shadern zu erreichen. Wenn Sie noch nicht in der Lage sind, Shader zu verwenden, würde ich empfehlen, sie trotzdem herauszufinden, da sie für viele solche Dinge sehr nützlich sind. Unter der Annahme, dass Sie sie verwenden können, finden Sie hier einen Scheitelpunkt- und Fragment-Shader, der einen grauen Radiusnebel um die Position Ihres Charakters erzeugt (mit einfacher Texturierung).

Vertex Shader (fog.vert):

uniform vec3 playerPos;
uniform sampler2D colorMap;

varying vec3 vertexToPlayer;

void main(void)
{
    vec3 vertexPos = vec3(gl_Vertex[0], gl_Vertex[1], gl_Vertex[2]);

    vertexToPlayer = playerPos - vertexPos;

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Fragment Shader (fog.frag):

uniform vec3 playerPos;
uniform sampler2D colorMap;

varying vec3 vertexToPlayer;

void main(void)
{
    const float radius = 1024.0;

    float dist = length(vertexToPlayer);
    float attenuation = clamp((radius - dist) / radius, 0.0, 1.0);

    vec4 diffuseTexel = texture2D(colorMap, gl_TexCoord[0].st);
    vec4 diffuseTerm  = diffuseTexel * attenuation + (.8 * (1.0-attenuation));
    diffuseTerm.a = diffuseTexel.a; /* preserve alpha */

    gl_FragColor = diffuseTerm;
}

Übergeben Sie dann irgendwo in Ihrem Code Ihre Werte für die Spielerposition mit:

GLint playerPos = glGetUniformLocation(prog, "playerPos");
glUniform3f(playerPos, xPos, yPos, zPos);

Hoffe das ist hilfreich!


+1. Dies ist der beste Weg, dies zu tun. Shader herrschen! (Aaund sie sind alles, was Sie in der Zukunft hoffen können, und auf mobilen Geräten ...)
Macke

0

Verwenden Sie Nebelkoordinaten. http://www.opengl.org/registry/doc/fog_coord.txt

Normalerweise wird der Nebelwert unter Verwendung eines Abstandsfaktors vom Auge zum Pixel 'c' berechnet. Tatsächlich ist die Nebeldichte eine Funktion der Entfernung.

f = exp (-d * c) - GL_EXP2
f = exp (- (d * c) ^ 2) - GL_EXP
f = (ec) / (es) - GL_LINEAR

Mit Nebelkoordinaten können Sie den 'c'-Wert der Gleichung festlegen und Werte direkt dafür angeben. Wenn Sie das Beschlagen so einstellen möchten, dass 0 -> kein Nebel, 1.0 -> der meiste Nebel, dann gehen Sie wie folgt vor:

glFogi (GL_FOG_MODE, GL_LINEAR);
glFogf (GL_FOG_START, 0.0f);
glFogf (GL_FOG_END, 1.0f);

// Dies aktiviert tatsächlich den "Nebelkoordinaten" -Modus
glFogi (FOG_COORDINATE_SOURCE_EXT, FOG_COORDINATE_EXT);

Verwenden Sie dann beim Rendern Ihrer Person glFogCoordfEXT ()

// Nebel anzeigen (ein Wert zwischen 0.0 - 1.0f)
glFogCoordfEXT (1.0f);

renderPerson ();

//Kein Nebel
glFogCoordfEXT (0.0f);

Bearbeiten: Eine erweiterungslose Alternative besteht darin, den Nebel beim Rendern zu deaktivieren und dann beim Rendern Ihres Charakters den Nebel mit den entsprechenden Start- / Endabständen zu aktivieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.