Bạn có thể sử dụng trình đổ bóng hình học để nhập dữ liệu vào một đoạn của đường và xuất một hình tam giác (một dải tam giác làm bằng hai hình tam giác) sao cho chiều rộng của tứ là không đổi trong không gian màn hình và khớp với mong muốn độ dày đường. Nó hoạt động hoàn hảo tốt (vì đã thực hiện nó trong một động cơ 3D CAD).
Nếu trình đổ bóng hình học không phải là một tùy chọn, giải pháp thay thế có thể là sử dụng trình đổ bóng đỉnh, nhưng nó sẽ yêu cầu một số công việc của VB của bạn. Hãy nhớ rằng VS phải có kiến thức về phân đoạn trong toàn bộ nó, vì vậy bạn sẽ lưu trữ p và p + 1 cho mỗi phần tử VB của bạn, cộng với chi phí sao chép các chỉ số/đỉnh (tùy thuộc vào cấu trúc liên kết được sử dụng và nếu bạn hiển thị dòng của bạn dưới dạng nguyên thủy được lập chỉ mục hay không).
Nếu hiệu suất không phải là một vấn đề, việc mở rộng trên CPU có thể là cách để đi.
EDIT:
Về mẫu dash: bạn có thể sử dụng một Shader geometry quá để thi đua glLineStipple
hành vi. Nếu bạn có cấu trúc liên kết GL_LINES
, tức là nói các dòng riêng biệt, mẫu sẽ khởi động lại ở mỗi đoạn đường mới. Vì vậy, bạn chỉ cần tính toán trong trình đổ bóng hình học bắt đầu ngang không gian màn hình (hoặc bắt đầu theo chiều dọc, tùy theo hướng) của đoạn đường của bạn và chuyển thông tin bổ sung này cho trình đổ bóng pixel. Sau đó, trình đổ bóng pixel sẽ chịu trách nhiệm loại bỏ các đoạn theo các yếu tố yếu tố và mẫu (DirectX 10/11 Integer và bitwise instructions giúp dễ dàng).
Một lần nữa điều này hoạt động tốt và bạn có thể kết hợp nó với các dòng chiều rộng mô phỏng (với kỹ thuật đầu tiên được đề cập ở trên).
Bây giờ, nếu bạn có GL_LINE_STRIP
cấu trúc liên kết, mẫu sẽ khởi động lại ở mỗi nguyên thủy mới (vì vậy đối với mỗi cuộc gọi vẽ mới). Tình hình trở nên phức tạp hơn một chút vì bạn cần phải có kiến thức về số lượng điểm ảnh đã được hiển thị trước đó và điều này cho mỗi đoạn đường.
Bạn có thể đạt được điều đó bằng cách hiển thị dải đường của bạn trong một VB tạm thời bằng chức năng phát trực tiếp DirectX 10 (mỗi phần tử của VB này tương ứng với chiều dài không gian màn hình của mỗi phân đoạn). Sau đó, bạn phải làm một tiền tố song song Sum (aka Scan) của VB này (để tích lũy từng giá trị độ dài đoạn đường).
Cuối cùng, bạn vẽ dải đường của mình như cho GL_LINES
nhưng sử dụng thông tin thêm Quét VB này trong PS.
Đây là một giải pháp thú vị. Bạn đã đạt được để có được kết quả tương tự hơn với một cuộc gọi glLineWidth (trên cơ sở mỗi pixel)? – Stringer
Tôi đã không kiểm tra nó trên mỗi pixel, nhưng đối với các dòng không được bảo vệ, chống răng cưa thì các kết quả phải tương tự nhau. Sử dụng texture (để mô phỏng các dạng stipple của OpenGL), chắc chắn sẽ đưa bạn vào thế giới đau đớn, với nội suy phi tuyến của tọa độ kết cấu (mà NVidia Quadros xử lý đáng ngạc nhiên xấu, thậm chí so với phần Geforce chủ yếu giống hệt nhau). Trình đổ bóng cần phải thực hiện rất nhiều công việc bổ sung để có được các quyền texcoords. – Pepor
Bạn có thể tự mình thử, chỉ cần sử dụng một số loại "chiều dài dòng trong pixel màn hình" cho tọa độ kết cấu và vẽ các đường thẳng với kết cấu có mẫu hình trên đó. Bạn sẽ ngạc nhiên như thế nào không đồng đều mô hình. Ít nhất là tôi. ;-) – Pepor