Half-Life 2 BSPライトマップ


10

私は大学のプロジェクトのBSPビューアを書いています。これまでのところ、メインジオメトリが適切に読み込まれ、PVSが機能しています。

現在、ライトマップを適用しようとしていますが、ライトマップのテクスチャ座標を適切に計算できないようです。

ここによると:http : //developer.valvesoftware.com/wiki/The_Source_Engine_BSP_File_Format

struct texinfo_t
{
    float textureVecs[2][4];  // [s/t][xyz offset]
    float lightmapVecs[2][4]; // [s/t][xyz offset] - length is in units of texels/area
    int flags;                // miptex flags overrides
    int texdata;               // Pointer to texture name, size, etc.
}

フロートの最初の配列は、本質的に、ワールドジオメトリにレンダリングされたときにテクスチャがどのように方向付けられ、スケーリングされるかを表す2つのベクトルです。2つのベクトルsとtは、テクスチャピクセル座標空間での左から右および下から上方向のワールドへのマッピングです。各ベクトルには、x、y、およびzコンポーネントと、ワールドに対するその方向のテクスチャの「シフト」であるオフセットが含まれます。ベクトルの長さは、各方向のテクスチャのスケーリングを表します。

テクスチャピクセル(またはテクセル)の2D座標(u、v)は、次のようにして、面上の点の世界座標(x、y、z)にマップされます。

u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3

v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3

(つまり、頂点にその方向のオフセットを加えたベクトルの内積。tvA、BはtextureVecs [A] [B]です。

さらに、(u、v)を計算した後、それらをグラフィックスカードに送信するテクスチャ座標に変換するには、uとvをそれぞれテクスチャの幅と高さで割ります。

なので、次のように計算しています。頂点とライトマップベクトルのドット積(lightmapVecs [0] [0]、lightmapVecs 0、lightmapVecs [0] [2])にオフセット(lightmapVecs [0] [3])を加算し、最小値を減算して除算します幅/高さによる結果。

float s = Vector3f.dot(v, new Vector3f(lightmapVecs[0][0], lightmapVecs[0][1], lightmapVecs[0][2])) + lightmapVecs[0][3] - f.LightmapTextureMinsInLuxels[0];
float t = Vector3f.dot(v, new Vector3f(lightmapVecs[1][0], lightmapVecs[1][1], lightmapVecs[1][2])) + lightmapVecs[1][3] - f.LightmapTextureMinsInLuxels[1];
s /= (f.LightmapTextureSizeInLuxels[0] + 1);
t /= (f.LightmapTextureSizeInLuxels[1] + 1);

ただし、次のようになります。 ライトマップ

これは、1つの頂点のテクスチャ座標「t」の計算例です。

vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14

したがって、ドット積は-1408です。

(-1408 + 0 - 9) / 14

t = -101.21

これはかなりずれているようです。


コメントに画像リンクを投稿できる場合は、誰かがあなたのために編集することができます。
共産主義者アヒル

ありがとう。私はいくつかの賛成票を獲得したので、今すぐ写真を投稿できます。:)
terryhau

なぜ14で割っているのですか?ライトマップのサイズは本当に「14」ですか?ほとんどのライトマップは2の累乗です...
PatrickB

回答:


0

私は最終的に理解しました、私は間違ってデータを読んでいました。上記のコードはすべて正しいです。


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