2013-07-06 13 views
5

Trong nỗ lực cải thiện hiệu năng hiển thị của đối tượng rất lớn (và nạp ram GPU), sau một số phép toán ánh sáng hợp lý, tôi phát hiện ra mình có khả năng nén dữ liệu đỉnh từ các đỉnh 16 byte xuống 4 byte đỉnh (vì dữ liệu có thể được coi như một bản đồ chiều cao được chuyển đổi - impliying x và y location từ id đỉnh), nơi tôi có thể đóng gói Z thành 30 bit, để lại 2 bit cho một chỉ số pallet màu. Đó là ý tưởng. Câu hỏi của tôi không phải là với bao bì phối hợp, nó có bao bì màu.Tại thời điểm nào hiệu quả hơn khi sử dụng kết cấu cho bảng màu thay vì sau đó là câu lệnh chuyển đổ bóng?

Pallet màu sẽ được chọn bằng mã C++ tải mô hình. Vì nó cũng tải đổ bóng, tôi đang cố gắng để viết mã tra cứu màu sắc như một tuyên bố chuyển đổi, ví dụ:

int colourIndex = (compressedVertex & Mask) >> bitOffset; 
switch (colourIndex) 
{ 
case 0: return vec4(....); 
case 1: return vec4(....); 
case 2: return vec4(....); 
case 3: return vec4(....); 
} 

Trong trường hợp mô hình có nhiều màu sắc sau đó 4, tôi bit hy sinh cảm thấy thoải mái về chiều cao chính xác để phù hợp với nhiều bit của pallet màu trong (lên đến một điểm anyway). Các phép đo của tôi cho thấy rằng việc sử dụng câu lệnh chuyển đổi để gắn một pallet 4 màu không chậm hơn sau đó ràng buộc một kết cấu 1D 1 pixel và sử dụng một mẫu để đọc từ nó.

Tôi đã thu nhỏ đến 32 màu này cho đến nay và có vẻ như ít nhất là nhanh bằng cách sử dụng kết cấu.

Khi nào một đường thẳng trên cát dừng sử dụng công tắc và bắt đầu sử dụng kết cấu cho bảng tra cứu? Nếu nó giúp các ứng dụng tôi đang phát triển cho có một yêu cầu tối thiểu đã được thực thi của OpenGl 3.3. Khi dữ liệu trên thẻ, nó sẽ không bao giờ bị thay đổi. Tôi có thể xoay nó lên tới 256 câu lệnh không? 1024? 32768? Đâu là giới hạn?

(Phản hồi trước emptive: Có) Tôi có thể tiếp tục thử nghiệm và chọn giá trị phù hợp với tôi trên thẻ đơn, hiện đại dùng thử và lỗi và một số nội suy; thực hành tốt nhất và liệu có ai khác đã thử điều gì đó tương tự và biết nó hoạt động trong tự nhiên không?)

+0

Không có phương pháp hay nhất về điều này. Mặc dù tôi sẽ đề nghị tránh một tuyên bố chuyển đổi rõ ràng khi một mảng liên tục đơn giản sẽ làm. Ngay cả một mảng liên tục 32-màu có lẽ sẽ ổn. –

+2

Nếu trình biên dịch không thay đổi câu lệnh chuyển đổi của bạn thành một mảng tĩnh, thì hiệu năng sẽ rất xấu đối với câu lệnh chuyển đổi và không hoạt động trên các thẻ cũ hơn (Nó sẽ hoàn nguyên về mô phỏng). SIMD có nghĩa là hàng nghìn điểm dữ liệu được tính bằng cùng một lệnh.Nếu bất kỳ một trong những điểm này dẫn đến một đường dẫn thực hiện trì hoãn thì toàn bộ đường ống cần được xả sạch. Có (hiếm) trường hợp khi một tuyên bố chuyển đổi có thể được biện minh: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter17.html –

+0

Trong khi tuyên bố chuyển đổi sẽ dẫn đến việc thực hiện khác nhau (xấu), điều này vẫn có thể bù đắp chi phí thực hiện đọc kết cấu (truy cập bộ nhớ, chậm). Các GPU hiện đại có thể tính toán nhanh hơn nhiều so với việc chúng có thể đọc bộ nhớ vì vậy một câu lệnh switch/if-else có thể nhanh hơn. Như một gợi ý, bạn có thể đặt bảng tra cứu của bạn vào một bộ đệm đồng nhất và sau đó chỉ mục vào đó. Bảng sau đó sẽ được tải vào bộ đệm không đổi (gần như nhanh như các thanh ghi), tránh truy cập kết cấu và phân kỳ của công tắc. – user2746401

Trả lời

1

Tôi tránh phân nhánh càng nhiều càng tốt trong trình đổ bóng. Lời khuyên của tôi là sử dụng texture để thực hiện tra cứu.

Bạn hỏi:

Tôi có thể quây nó lên đến 256 trường hợp báo cáo? 1024? 32768? Đâu là giới hạn?

và bạn nói:

tôi đã có quy mô này lên đến 32 màu sắc cho đến nay, và có vẻ như ít nhất càng nhanh càng tốt bằng cách sử dụng kết cấu.

OpenGL phát triển mạnh khi tra cứu kết cấu. Nó được thiết kế để làm điều đó. Nó không được thiết kế cho một tuyên bố trường hợp chuyển đổi khổng lồ. Và như những người bình luận nói nó sẽ không hoạt động tốt trên bảng. Một kết cấu 64x64 pixel có thể cung cấp cho bạn 4096 tra cứu và về lâu dài, theo ý kiến ​​của tôi, nó sẽ nhanh hơn một số lượng lớn các tra cứu.

Các vấn đề liên quan