プレーヤーの座標を追跡するためにフォグをどのように設定しますか?


7

プレイヤーの座標にフォグを設定することが可能かどうか(プレイヤーの周りにフォグがあり、それをよりサードパーソンにすることができるか)疑問に思う主な理由は、プレイヤーの右上隅に向かっているためです。スクリーン

ここに私があなたに何をしているのかのガイドを与えることができるいくつかのコードがあります:

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);

そして私は霧が言ったような位置でプレイヤーを追跡したいです

posX,posY,posZ

誰かがこれを非常に役立ついくつかのサンプルコードに変えることができるなら、ありがとう

これが不可能な場合は、カメラの特定の位置の周囲に霧を設定するにはどうすればよいですか。たとえば、中央ではなく、カメラの右上隅に表示します。

これがゲーム画面の写真なので、私が話していることを確認できます。

ここに画像の説明を入力してください

回答:


1

これはシェーダーを使用すると最も簡単に達成できると思います。まだシェーダーを使用する能力がない場合は、このような多くのことに非常に役立つため、シェーダーを考え出すことをお勧めします。あなたがそれらを使用できるという仮定の下で動作します、これはキャラクターの位置の周りに灰色の半径フォグを作成する頂点とフラグメントのシェーダーです(単純なテクスチャリングで)。

頂点シェーダー(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);

これがお役に立てば幸いです!


+1。これはそれを行うための最良の方法です。シェーダーが支配する!(ああ、それらはあなたが将来、そしてモバイルデバイスで期待できるすべてのものです...)
Macke

0

フォグ座標を使用します。http://www.opengl.org/registry/doc/fog_coord.txt

通常、フォグ値は、目からピクセル「c」までの距離係数を使用して計算されます。実際には、霧の密度は距離の関数です。

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

フォグ座標により、方程式の「c」値を設定し、これに直接値を指定できます。0->霧なし、1.0->ほとんどの霧になるように霧を設定したい場合は、次のようにします。

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

//これは実際に「フォグ座標」モードを有効にします
glFogi(FOG_COORDINATE_SOURCE_EXT、FOG_COORDINATE_EXT);

次に、人物をレンダリングするときに、glFogCoordfEXT()を使用します

//フォグを表示(0.0〜1.0fの値)
glFogCoordfEXT(1.0f);

renderPerson();

//霧なし
glFogCoordfEXT(0.0f);

編集:拡張子のない代替手段は、すべてをレンダリングするときにフォグを無効にし、キャラクターをレンダリングするときに適切な開始/終了距離でフォグを有効にすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.