Half-Life 2 BSP Lightmaps

10

Saya sedang menulis penampil BSP untuk proyek universitas. Sejauh ini saya memiliki geometri utama yang dimuat dengan benar, dan PVS berfungsi.

Sekarang saya mencoba menerapkan lightmaps, tetapi sepertinya saya tidak bisa mendapatkan koordinat tekstur untuk lightmaps yang dihitung dengan benar.

Menurut di sini: 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.
}

Array pertama mengapung pada dasarnya adalah dua vektor yang mewakili bagaimana tekstur diorientasikan dan diskalakan ketika diberikan pada geometri dunia. Dua vektor, s dan t, adalah pemetaan arah kiri-ke-kanan dan bawah-ke-atas dalam ruang koordinat piksel tekstur, ke dunia. Setiap vektor memiliki komponen x, y, dan z, ditambah offset yang merupakan "pergeseran" tekstur ke arah itu relatif terhadap dunia. Panjang vektor mewakili penskalaan tekstur di setiap arah.

Koordinat 2D (u, v) piksel tekstur (atau texel) dipetakan ke koordinat dunia (x, y, z) dari suatu titik pada wajah dengan:

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

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

(mis. Produk titik vektor dengan titik ditambah offset di arah itu. Dimana tvA, B adalah teksturVecs [A] [B].

Selanjutnya, setelah menghitung (u, v), untuk mengubahnya menjadi koordinat tekstur yang akan Anda kirim ke kartu grafis Anda, bagilah u dan v masing-masing dengan lebar dan tinggi tekstur.

Jadi saya melakukan perhitungan sebagai berikut. Ambil titik produk dari titik dan vektor lightmap (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) tambahkan offset (lightmapVecs [0] [3]), kurangi menit, dan bagi hasil dengan lebar / tinggi.

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

Namun akhirnya terlihat seperti ini: lightmaps

Berikut ini perhitungan sampel untuk coord tekstur 't' untuk satu titik.

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

Jadi produk titik adalah -1408

(-1408 + 0 - 9) / 14

t = -101.21

Ini sepertinya jauh.

terryhau
sumber
Jika Anda dapat memposting tautan gambar di komentar, seseorang dapat mengeditnya untuk Anda.
Bebek Komunis
Terima kasih. Saya mendapat beberapa suara sehingga saya dapat memposting gambar sekarang. :)
terryhau
Mengapa Anda membaginya dengan 14? Apakah ukuran lightmap Anda benar-benar "14"? Kebanyakan lightmaps adalah kekuatan 2 ...
PatrickB

Jawaban:

0

Saya akhirnya menemukan, saya salah membaca data. Semua kode di atas sudah benar.

terryhau
sumber
0

Anda harus menormalkan vektor sebelum menghitung produk titik.

Fabian
sumber