Trong Direct3D 12 ray tracing, shader table không phải một danh sách shader chung chung: nó là vùng record mà lệnh dispatch dùng để tìm chương trình xử lý và phần dữ liệu liên quan trong các giai đoạn ray tracing. Hit record đặc biệt gắn với nhóm hình học được giao cắt, nhưng mối liên hệ không có nghĩa mỗi instance luôn có một record riêng hoặc mọi engine sắp xếp bảng giống nhau. Muốn đọc một sơ đồ DXR chính xác, cần tách quy tắc của API khỏi quy ước tổ chức nội bộ của ứng dụng.
Điểm chính
- Tài liệu Direct3D 12 ray tracing mô tả các shader table và cách dispatch dùng record để xác định shader tương ứng. [1]
- Hit group chỉ định nhóm shader giao cắt; hit record có thể mang dữ liệu cục bộ được shader truy cập theo cấu trúc mà ứng dụng định nghĩa.
- Instance trong cấu trúc gia tốc góp phần xác định hình học và ánh xạ hit group, nhưng không nên suy ra một quan hệ một-một đơn giản giữa instance và record.
- Khi phân tích, lần theo shader identifier, kích thước/stride record, vùng dữ liệu cục bộ và bảng được truyền cho dispatch.
- Tài liệu API không xác nhận bố trí bảng của một engine cụ thể hay cấu hình của KLIVE.
Shader table đứng ở đâu trong DXR
DXR chia công việc ray tracing thành các bước: ứng dụng xây dựng cấu trúc gia tốc, phát tia bằng một lệnh dispatch, rồi hệ thống chọn shader phù hợp khi tia gặp hoặc không gặp hình học. Shader table là đầu vào quan trọng của giai đoạn dispatch. Thay vì ứng dụng tự gọi một hàm shader cho mỗi giao cắt, bảng chứa các record để pipeline tra cứu khi cần thực thi shader.
Cần phân biệt bảng với cấu trúc gia tốc. Cấu trúc gia tốc mô tả hình học và hỗ trợ tìm giao cắt; bảng shader mô tả chương trình xử lý cùng dữ liệu gắn với các trường hợp thực thi. Hai thành phần được phối hợp trong cùng pipeline nhưng đảm nhiệm việc khác nhau. Nếu nhầm chúng, việc đọc trace hay sơ đồ bộ nhớ sẽ dẫn đến kết luận sai về nơi lưu hình học và nơi lưu tham chiếu shader. [1]
Với người tối ưu ứng dụng, điểm thực tế là hỏi dispatch nhận những bảng nào và vùng nào đang được tham chiếu, chứ không chỉ đếm số shader trong dự án. Một bảng có thể chứa nhiều record cho những trường hợp khác nhau; ngược lại, số lượng shader trong mã nguồn không tự cho biết kích thước hay cách sắp xếp record khi chạy.
Một record gồm những ý nghĩa nào
Có thể hình dung record như một đơn vị tra cứu gồm định danh shader và phần dữ liệu cục bộ tùy chọn. Định danh chỉ tới shader hoặc nhóm shader thích hợp; phần dữ liệu còn lại do ứng dụng bố trí để shader nhận tham số riêng cho tình huống đó. Đây là cách tư duy hữu ích, nhưng không nên biến hình dung này thành một cấu trúc C++ cố định áp dụng cho mọi dự án: căn chỉnh, stride và cách đóng gói tuân theo yêu cầu API cùng mã ứng dụng.
Trong nhóm hit, record liên hệ với hit group để điều phối các shader xử lý giao cắt. Hit group có thể gồm shader giao cắt, shader gần nhất hoặc shader bất kỳ tùy kiểu hình học và logic. Khi tia gặp hình học, pipeline xác định ngữ cảnh hit và chọn record phù hợp theo các chỉ số cùng ánh xạ đã thiết lập. Vì vậy, thuật ngữ “hit record” nói tới vị trí dùng trong bảng và ngữ cảnh xử lý, không nhất thiết là một bản sao đầy đủ mọi dữ liệu của đối tượng.
Dữ liệu cục bộ có thể giúp một shader dùng tham số khác nhau giữa các record, chẳng hạn chỉ số vật liệu hoặc dữ liệu ứng dụng cần thiết. Nhưng ý nghĩa của các byte đó không tự được DXR suy diễn; shader và mã CPU phải thống nhất định dạng. Khi sửa cấu trúc dữ liệu ở một phía mà không sửa phía kia, lỗi có thể xuất hiện như đọc sai vật liệu hoặc kết quả không ổn định, dù shader identifier vẫn hợp lệ.
Record, hit group và instance liên hệ ra sao
Instance là một thực thể trong cấu trúc gia tốc cấp cao, gắn với hình học ở cấu trúc cấp thấp và thông tin instance. Việc truy vấn có thể đưa đến hình học cụ thể; cấu hình instance cùng ánh xạ trong ứng dụng giúp xác định nhóm hit liên quan. Sau đó, cách dispatch lựa chọn record trong bảng dựa trên các chỉ số thích hợp. Do có nhiều lớp ánh xạ, không nên rút gọn thành câu “mỗi instance có đúng một hit record”. Một instance có thể chia sẻ hình học, và cách tổ chức bảng có thể phục vụ nhiều đối tượng hoặc nhiều kiểu xử lý.
Tài liệu Microsoft trình bày khung API và các thành phần ray tracing, nhưng lựa chọn về phân nhóm record, cách đánh chỉ số, dữ liệu vật liệu hay tái sử dụng shader là quyết định thiết kế ứng dụng. Một engine có thể tổ chức bảng theo loại hình học, nhóm vật liệu hoặc chiến lược khác; muốn biết chính xác phải đọc mã, công cụ phân tích hoặc tài liệu của engine đó. [1]
Nếu khảo sát một cảnh có nhiều instance, hãy lập sơ đồ theo luồng: instance và geometry → hit group được dùng → chỉ số/record được chọn → dữ liệu cục bộ mà shader đọc. Sơ đồ này có ích hơn việc chỉ nhìn tên bảng, vì tên gọi trong mã có thể là quy ước nội bộ và không thể hiện đầy đủ quan hệ với API.
Cách kiểm tra khi kết quả ray tracing bất thường
Bắt đầu bằng xác nhận dispatch nhận đúng vùng shader table, kích thước bảng và stride phù hợp. Đối chiếu địa chỉ bắt đầu với vùng dữ liệu đã cấp phát, kiểm tra căn chỉnh theo yêu cầu API và bảo đảm record không vượt ra ngoài phạm vi bộ nhớ. Tiếp theo, xác minh shader identifier được ghi vào record đúng với loại shader dự kiến; nếu dùng dữ liệu cục bộ, so sánh cách CPU đóng gói với cách shader đọc từng trường.
Sau đó theo từng giai đoạn: tia có được phát với tham số đúng không, cấu trúc gia tốc có chứa hình học mong đợi không, instance có mask/transform phù hợp không, và hit group có được ánh xạ đúng không. Khi chỉ một đối tượng cho kết quả sai, hãy so record của nó với một đối tượng hoạt động tốt thay vì thay đổi đồng thời nhiều phần. Có thể dùng validation layer và công cụ đồ họa tương thích để tìm lỗi API, nhưng thông báo của công cụ cần được hiểu trong bối cảnh phiên bản SDK và driver.
Cuối cùng, tái hiện lỗi với cảnh tối giản và ghi lại thiết bị, phiên bản runtime, shader, cấu trúc dữ liệu cùng bước dispatch. Nếu thay đổi bảng làm lỗi biến mất, đó là manh mối cần kiểm tra thêm chứ chưa tự chứng minh nguyên nhân gốc. Bài viết giải thích mô hình DXR chung; không suy ra rằng một dịch vụ phát video hay KLIVE dùng ray tracing hoặc có cấu trúc bảng cụ thể nào.
Với độc giả đang theo dõi các nội dung thể thao trực tiếp, KLIVE – trận đấu bóng đá mới nhất là trang đích theo thông tin phân bổ của bài viết; liên kết này không hàm ý DXR được dùng trong dịch vụ.
Nguồn tham khảo
Câu hỏi thường gặp
Shader table có phải là nơi lưu toàn bộ shader bytecode không?
Không nên hiểu như vậy. Record cung cấp định danh shader và có thể kèm dữ liệu cục bộ; mô hình nạp và quản lý shader còn phụ thuộc pipeline và ứng dụng.
Hit group có đồng nghĩa với hit record không?
Không. Hit group là nhóm shader xử lý tình huống giao cắt, còn hit record là mục trong bảng dispatch dùng để chọn shader và dữ liệu liên quan.
Mỗi instance có bắt buộc một record riêng không?
Không thể kết luận như vậy. Quan hệ phụ thuộc cấu trúc gia tốc, ánh xạ chỉ số và cách ứng dụng tổ chức bảng.
Lỗi hit record nên kiểm tra phần nào trước?
Đối chiếu shader identifier, stride/căn chỉnh, dữ liệu cục bộ, chỉ số dispatch và ánh xạ hit group; đồng thời xác minh cấu trúc gia tốc.