Lấy mẫu kết cấu direct3D rất chậm


9

Vì vậy, tôi đang viết một trò chơi nhỏ bằng Direct3D 9 và tôi đang sử dụng đa điểm cho địa hình. Tất cả những gì tôi đang làm là lấy mẫu 3 kết cấu và bản đồ pha trộn và lấy màu tổng thể từ ba kết cấu dựa trên các kênh màu từ bản đồ pha trộn. Dù sao, tôi đang bị giảm tốc độ khung hình lớn khi tôi lấy mẫu hơn 1 kết cấu, tôi sẽ chuyển từ 120+ khung hình / giây xuống dưới 50.

Đây là mã HLSL chịu trách nhiệm cho việc làm chậm:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

Tôi đang làm sai à? Nếu bất cứ ai có bất kỳ thông tin hoặc lời khuyên về lấy mẫu kết cấu hoặc bất cứ điều gì, đó sẽ là tốt đẹp.

Cảm ơn.


Bạn có phần cứng gì? Bốn mẫu kết cấu không phải là một vấn đề trên bất kỳ phần cứng mới.
Axel Gneiting

Tôi có một chiếc Radeon X1950, vâng, nó đã vài năm tuổi, nếu không muốn nói là nhiều hơn. Tôi đoán nó có thể không phải là phần cứng tốt nhất. Bạn nghĩ sao ?
dotminic

Câu trả lời:


9

Nếu bạn muốn tăng tốc mọi thứ, bạn có thể sử dụng một thứ gọi là tập bản đồ kết cấu.

Wikipedia - Bản đồ kết cấu là một hình ảnh lớn, hoặc "tập bản đồ" chứa nhiều hình ảnh phụ nhỏ hơn, mỗi hình ảnh là một kết cấu cho một phần của vật thể 3D. Các kết cấu phụ có thể được hiển thị bằng cách sửa đổi tọa độ kết cấu của uvmap của đối tượng trên tập bản đồ, về cơ bản cho nó biết phần nào của hình ảnh mà kết cấu của nó nằm trong. Trong một ứng dụng thường sử dụng nhiều họa tiết nhỏ, nó thường hiệu quả hơn lưu trữ các kết cấu trong một tập bản đồ kết cấu được coi là một đơn vị bởi phần cứng đồ họa.

Sẽ hiệu quả hơn khi GPU lấy mẫu một kết cấu lớn 4 lần so với 4 hình ảnh được lấy mẫu một lần mỗi lần. Dưới đây là một ví dụ về bản đồ kết cấu địa hình.

văn bản thay thế


1
Cảm ơn vì lời khuyên, tôi đã triển khai trình tạo bóng của mình bằng cách sử dụng tập bản đồ kết cấu, hiện tại tôi "chỉ" nhận được 109 khung hình / giây, nhưng đó là một cải tiến gọn gàng từ 55 khung hình / giây tôi đang nhận được. Cảm ơn!
dotminic

1
+1 cho câu trả lời hay. Tôi có thể hỏi bạn đã lấy hình ảnh atlas đó ở đâu không? Nó là độc quyền hay miễn phí cho bất kỳ việc sử dụng?
Cameron

4

Một điều khác cần xem xét là định dạng kết cấu. Đây có phải là một kết cấu 32bpp thô? Nếu vậy, hãy cân nhắc sử dụng kết cấu DXT1 đã nén, là 4 bit / pixel (chiếm 1/8 dung lượng) hoặc DXT5 nếu bạn cần kênh alpha, ở mức 8 bit / pixel.

Việc giảm kích thước của dữ liệu kết cấu sẽ dẫn đến giảm yêu cầu băng thông bộ nhớ kết cấu và cải thiện hiệu năng bộ đệm kết cấu.

Ngoài ra, hãy kiểm tra xem bạn đã không thiết lập bộ lọc bất đẳng hướng chất lượng tối đa - có thể thêm một chút chi phí hợp lý.


Thx cho lời khuyên, tôi sẽ thử lại lần sau.
dotminic

3

Hoạ tiết của bạn có mipmaps?

Nếu không có mipmapping, việc lấy mẫu kết cấu có thể đặc biệt tốn kém (vô số lỗi bộ nhớ cache)


Yep các kết cấu có mipmap, tôi đã xuất chúng dưới dạng * .dds từ công cụ kết cấu DirectX. Nhưng làm thế nào để họ sử dụng kết cấu trong các trò chơi thương mại nơi có vô số họa tiết có độ phân giải cao ở khắp mọi nơi? Tôi chỉ lấy mẫu 1 tập bản đồ và nhận được tốc độ khung hình 109 khung hình / giây trong khi hiển thị địa hình, tất cả trên gpu.
dotminic
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.