Half-Life 2 Lightmaps


10

Tôi đang viết một trình xem BSP cho một dự án đại học. Cho đến nay tôi đã tải hình học chính và PVS hoạt động.

Bây giờ tôi đang cố gắng áp dụng các lightmap, nhưng dường như tôi không thể có được tọa độ kết cấu cho các lightmap được tính toán chính xác.

Theo tại đây: 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.
}

Mảng đầu tiên của phao là về cơ bản hai vectơ đại diện cho cách kết cấu được định hướng và thu nhỏ khi được hiển thị trên hình học thế giới. Hai vectơ, s và t, là ánh xạ của các hướng từ trái sang phải và từ trên xuống trong không gian tọa độ pixel kết cấu, trên thế giới. Mỗi vectơ có thành phần x, y và z, cộng với phần bù là "sự dịch chuyển" của kết cấu theo hướng đó so với thế giới. Độ dài của các vectơ biểu thị tỷ lệ của kết cấu theo từng hướng.

Các tọa độ 2D (u, v) của pixel kết cấu (hoặc texel) được ánh xạ tới tọa độ thế giới (x, y, z) của một điểm trên một mặt bằng:

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

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

(tức là tích của các vectơ có đỉnh cộng với phần bù theo hướng đó. Trong đó tvA, B là textureVecs [A] [B].

Hơn nữa, sau khi tính toán (u, v), để chuyển đổi chúng thành tọa độ kết cấu mà bạn sẽ gửi cho card đồ họa của mình, chia u và v cho chiều rộng và chiều cao của kết cấu tương ứng.

Vì vậy, tôi đang làm tính toán như sau. Lấy sản phẩm chấm của đỉnh và vectơ ánh sáng (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) thêm phần bù (lightmapVecs [0] [3]), trừ các phút và chia kết quả theo chiều rộng / chiều cao.

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

Tuy nhiên, nó trông giống như thế này: ánh sáng

Đây là một tính toán mẫu cho tọa độ kết cấu 't' cho một đỉnh.

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

Vậy sản phẩm chấm là -1408

(-1408 + 0 - 9) / 14

t = -101.21

Điều này dường như tắt.


Nếu bạn có thể đăng một liên kết hình ảnh trong các bình luận, ai đó có thể chỉnh sửa nó cho bạn.
Vịt Cộng sản

Cảm ơn. Tôi đã nhận được một vài lượt bình chọn để tôi có thể đăng ảnh bây giờ. :)
terryhau

Tại sao bạn chia cho 14? Kích thước của lightmap của bạn có thực sự là "14" không? Hầu hết các lightmap là sức mạnh của 2 ...
PatrickB

Câu trả lời:


0

Cuối cùng tôi đã tìm ra, tôi đã đọc dữ liệu sai. Tất cả các mã trên là chính xác.


0

Bạn nên chuẩn hóa các vectơ trước khi tính toán sản phẩm chấm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.