これはシェーダーを使用すると最も簡単に達成できると思います。まだシェーダーを使用する能力がない場合は、このような多くのことに非常に役立つため、シェーダーを考え出すことをお勧めします。あなたがそれらを使用できるという仮定の下で動作します、これはキャラクターの位置の周りに灰色の半径フォグを作成する頂点とフラグメントのシェーダーです(単純なテクスチャリングで)。
頂点シェーダー(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;
}
フラグメントシェーダー(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;
}
次に、コードのどこかで、プレーヤーの位置の値を次のように渡します。
GLint playerPos = glGetUniformLocation(prog, "playerPos");
glUniform3f(playerPos, xPos, yPos, zPos);
これがお役に立てば幸いです!