2016-11-03 90 views
4

球にマップしたいアースのテクスチャがあります。 それは単位球であり、モデル自体にはテクスチャ座標がないので、私が考えることができる最も簡単なのは、各頂点の球座標を計算し、それらをテクスチャ座標として使用することです。OpenGL:球面上のテクスチャを球面座標を使ってマッピングする

textureCoordinatesVarying = vec2(atan(modelPositionVarying.y, modelPositionVarying.x)/(2*M_PI)+.5, acos(modelPositionVarying.z/sqrt(length(modelPositionVarying.xyz)))/M_PI); 

フラグメントシェーダでこれを行うときは、(補間された)頂点位置からテクスチャ座標を計算するので、これは問題なく動作します。

しかし、私が頂点シェーダでこれを行うと、モデル自体にテクスチャ座標がある場合でもやりますが、下の画像に示すように結果が得られます。頂点は点として表示され、0.5より小さいテクスチャ座標(u)は赤で、他のすべては青です。テクスチャ(U)は、2つの隣接する赤/青の頂点の座標が値(ほぼ)1.0と0.0を有するよう

Texture mapping onto a sphere

はそうに見えます。可変的に補間されるので、0.0〜1.0の間の値が得られます。値は1.0か0.0のどちらかでなければならないが、間には何もないので、これは当然間違っている。

上記のエフェクトを表示せずに球座標をテクスチャ座標として扱う方法はありますか? (可能な場合は、モデルを変更せずに)

答えて

4

これは一般的な問題です。 2つのテクスチャ座標トポロジ間の継ぎ目は、テクスチャ座標を1.0から0.0にシームレスに折り返す必要があり、メッシュはこれを適切に処理する必要があります。これを行うには、メッシュは継ぎ目に沿ってすべての頂点を複製する必要があります。頂点の1つに0.0のテクスチャ座標があり、右から来る頂点に接続されます(あなたの例では)。もう一方は1.0のテクスチャ座標を持ち、左から来る頂点に接続されます(あなたの例では)。

これはメッシュの問題であり、メッシュ自体で解決することをお勧めします。同じ位置には2つの異なるテクスチャ座標が必要なので、問題の位置を複製する必要があります。

また、補間された頂点法線からテクスチャ座標を生成するフラグメントシェーダを使用することもできます。言うまでもなく、これは、方向から対の角度への変換(そして[0、1]テクスチャ座標範囲への変換)を必要とするので、計算上高価です。

関連する問題