Cuối cùng tôi đã tìm ra một giải pháp - thực sự là một vài giải pháp khác nhau. Tôi đã không tìm ra nguyên nhân thực sự của tạo tác từ góc độ lập trình đồ họa - nhưng tôi đã tìm thấy một số giải pháp.
Như tôi đã nói trước đây trong câu hỏi của mình, có vẻ như tạo tác chỉ xảy ra trên các khối bóng được tính toán trước của hình học tĩnh thế giới (về cơ bản là hình học mà động cơ biết là sẽ không bao giờ di chuyển nên nó tính toán trước -Thời gian khối lượng bóng và những thứ khác với một lệnh được nhập trong bảng điều khiển được gọi là "dmap"). Tôi đã không tìm ra lý do tại sao nó chỉ nằm trên bóng của hình học thế giới tĩnh mà không phải trên bất kỳ mô hình ASE hoặc LWO nào.
Bây giờ, điều mà tôi nhận thấy là thực sự có rất nhiều tham số có thể được sử dụng với lệnh dmap - một trong những tham số này được gọi là "ShadowOpt" - phải đại diện cho mức tối ưu hóa bóng. Tham số này đặt ra một enum - dường như có một vài mức tối ưu hóa bóng khác nhau:
typedef enum {
SO_NONE, // 0 // NOTE: I haven't tried this one yet - should test this one.
SO_MERGE_SURFACES, // 1 // NOTE: this was the original default one - it causes some artifacts - the ones I have been trying to fix.
SO_CULL_OCCLUDED, // 2 // NOTE: this one works the best - takes a bit longer - but it has alot of unnecessary print statements that could probably be removed.
SO_CLIP_OCCLUDERS, // 3 // NOTE: I haven't tried this one yet - but it is not used anywhere.
SO_CLIP_SILS, // 4 // NOTE: I haven't tried this one yet - should test this one.
SO_SIL_OPTIMIZE // 5 // NOTE: this one doesn't seem to work well at all - and it takes an extrememly long amount of time - was probably an expirimental version.
} shadowOptLevel_t;
Tôi đã thành công với tùy chọn 2 - "SO_CULL_OCCLUDED". Nó sửa tất cả các tạo phẩm - mất nhiều thời gian hơn để chạy - nhưng tôi tin rằng phần lớn thời gian này được dành để in một lượng lớn thông tin lên bàn điều khiển - những bản in này có thể bị giảm hoặc bị loại bỏ.
Một trong những nơi đã cho tôi một số manh mối là nhận xét ở đây trong tr_stpsonshadow.cpp:
// if we are running from dmap, perform the (very) expensive shadow optimizations
// to remove internal sil edges and optimize the caps
if ( callOptimizer ) {
Bây giờ, vấn đề với việc chỉ thực hiện tối ưu hóa bóng "phụ" này trong "dmap" là nếu bất kỳ đèn nào trong số này được di chuyển (điều này luôn có thể tùy thuộc vào loại dự án bạn đang thực hiện) - thì nó sẽ mặc định trở lại Quá trình tạo khối lượng bóng thời gian thực "không được tối ưu hóa" (đối với ánh sáng được di chuyển) và các tạo tác sẽ xuất hiện lại cho ánh sáng đó. Vì vậy, cách duy nhất để đảm bảo rằng những cổ vật này sẽ không xuất hiện là luôn luôn chạy quá trình tối ưu hóa rất tốn kém cho các bóng thế giới tĩnh này. Thực tế nó rất đắt vì vậy đây sẽ là giải pháp cuối cùng tuyệt đối nếu bạn không thể tìm ra một giải pháp đồ họa phù hợp. (nếu bạn làm như vậy, hãy chắc chắn để đăng giải pháp của bạn ở đây.)
Tôi muốn giới thiệu cho bất kỳ ai tạo bản đồ lớn cho động cơ vanilla Doom 3 - và sử dụng hình học worldspawn - rằng họ tạo ra một cvar mà họ có thể thay đổi tùy theo nhu cầu của họ để tạo khối lượng bóng tối ưu hóa theo thời gian thực. Tôi đã gọi cvar r_useExpensiveShadowOptimizes của tôi - dường như là một oxymoron. Ví dụ:
// if we are running from dmap, perform the (very) expensive shadow optimizations
// to remove internal sil edges and optimize the caps
if ( callOptimizer || r_useExpensiveShadowOptimizations.GetBool() ) {
Tôi cũng khuyên bạn nên tùy thuộc vào độ lớn của bản đồ của bạn (và giả sử đèn sẽ không di chuyển), bạn nên tăng mức tối ưu hóa âm lượng bóng tĩnh với tham số "ShadowOpt" cho dmap.
Vì vậy, về cơ bản tất cả những thứ bạn cần để có một bản đồ lớn và không có các tạo tác bóng tối đều có sẵn cho bạn, bạn chỉ cần quyết định những thứ bạn sẽ cần sử dụng. Làm điều đó trong thời gian thực là vô cùng tốn kém và chỉ nên được thực hiện như là phương sách cuối cùng nếu bạn không thể tìm thấy một giải pháp đồ họa phù hợp. Làm điều đó trong DMAP có ý nghĩa hoàn hảo vì nó giải quyết vấn đề và chỉ mất thêm vài giây để bản đồ biên dịch.