Có thể (và làm thế nào) các shader có thể vẽ các pixel màn hình vượt ra ngoài các pixel bị chiếm bởi lưới bóng mờ?


8

Tôi có một số kinh nghiệm lập trình hình học và tính toán shader - nhưng không bao giờ tự phiêu lưu trong việc thực sự chơi với các shader mảnh. Hiện tại, tôi đang cố gắng để hiểu rõ hơn về cách họ làm việc và tiềm năng của họ. Một trong những điều tôi đã đọc ở nhiều nơi là một đoạn (tức là pixel màn hình) không thể vượt ra ngoài chính nó trong shader mảnh. Điều đó có nghĩa là, một đoạn nhất định được lặp đi lặp lại chỉ có thể ảnh hưởng đến chính nó.

Do đó, và vì mục đích học tập, tôi muốn biết liệu những điều sau đây có khả thi hay không (và nếu có, làm thế nào, trong các dòng chung, nó có thể đạt được không). Giả sử chúng ta có, vì đơn giản, một lưới điểm chỉ gồm hai đỉnh (nằm trong không gian Thế giới 3D). Chúng ta có thể lập trình một shader theo cách sao cho mỗi hai đỉnh này sẽ được vẽ trên màn hình ở vị trí WorldToViewport chính xác của chúng, nhưng cũng có một vòng tròn xung quanh mỗi bán kính = R cũng được vẽ trong các pixel xung quanh ngay cả khi chúng mở rộng ngoài lưới ban đầu mà shader được gắn vào? Giống như trong hình bên dưới (trong đó hình vuông màu đỏ ở giữa tâm của các vòng tròn biểu thị các đỉnh được vẽ trên màn hình):

nhập mô tả hình ảnh ở đây

Nếu điều đó là có thể, một shader cũng có thể được lập trình theo cách mà các vòng tròn vượt ra ngoài các đỉnh ảnh hưởng đến màu sắc (RGBA) của nhau không? Giống như trong hình dưới đây:

nhập mô tả hình ảnh ở đây

Như tôi đã nói, nếu đây là những điều có thể, tôi rất thích nghe một chút về cách đạt được một điều như vậy - về mặt khái niệm hoặc thực tế. Nó được thực hiện trong shader mảnh, hoặc phải được tính toán trước ở các shader đỉnh hoặc hình học? Làm thế nào để tính toán và vượt qua "các mảnh bổ sung" vượt ra ngoài các mảnh bị chiếm bởi thân lưới?


Một shader hình học có thể thêm nhiều nguyên thủy hơn so với tìm thấy trong lưới ban đầu. Điều này làm điều đó cho bạn?
Andreas

Câu trả lời:


6

Khi bạn sử dụng khử băng thông đường hoặc khử răng cưa đường hoặc băng thông điểm hoặc điểm chính, OpenGL tạo cho bạn một hình chữ nhật nhỏ thay vì đường hoặc điểm, với tọa độ kết cấu. Ngày nay, bạn thậm chí có thể tự lập trình điều này bằng cách sử dụng các shader hình học ngay cả các tàu.

Một cách tiếp cận hoàn toàn khác là sử dụng bóng mờ, sử dụng một đường chuyền hình học chỉ để lưu trữ thông tin trong bộ đệm RGBAZ, sau đó vượt qua lần thứ hai so với bạn chạy trên tất cả các pixel của màn hình để thực hiện một số quy trình. (để hành động trên tất cả các pixel, chỉ cần vẽ một hình chữ nhật toàn màn hình). Ngày nay, bạn thậm chí có thể thực hiện lần đầu tiên dưới dạng một hoặc một số "kết xuất thành kết cấu", sau đó MIPmap các kết cấu này, để vượt qua cuối cùng có thể dễ dàng truy cập vào các giá trị cục bộ ít hơn.


Cảm ơn! Tôi đã làm những gì bạn đã nói lúc đầu, sử dụng các shader hình học để tạo hình học xung quanh các điểm và do đó cho phép vẽ các pixel xung quanh điểm. Nó hoạt động, tất nhiên, nhưng nó là một giải pháp cồng kềnh hơn. Tôi đặc biệt quan tâm đến những gì cuối cùng của những gì bạn đã nói: nếu tôi hiểu bạn một cách chính xác, những gì bạn đề cập là người ta có thể hiển thị toàn bộ cảnh và sau đó sử dụng trình tạo bóng màn hình nhắm vào khu vực quan tâm và sau đó vượt qua kết xuất khung hình để làm việc với bao nhiêu pixel người ta muốn xung quanh các điểm ở trung tâm?
AndrewSteer

Bạn có thể kết xuất đường chuyền đầu tiên trong một kết cấu. Sau đó, ở lượt thứ hai trên toàn màn hình, ở mỗi pixel bạn có thể kiểm tra nội dung kết cấu trong một đĩa xung quanh pixel và làm những gì bạn muốn (ví dụ: màu theo pixel được lấp đầy gần nhất hoặc chỉ sơn màu trắng nếu khoảng cách nằm dưới ngưỡng nào đó) . Tất nhiên, chỉ để vẽ đĩa, đây không phải là cách hiệu quả nhất ;-)
Fabrice NEYRET

Chắc chắn, tôi chỉ đưa ra ví dụ đơn giản mà tôi có thể nghĩ ra. Nhưng vâng, tôi nghĩ những gì bạn nói phù hợp với những gì tôi đã nghĩ, tức là kết xuất thành một kết cấu trong một lượt và sau đó chúng ta có thông tin, trong các lượt khác, thay đổi pixel liên quan đến những gì nằm trong các pixel xung quanh . Cảm ơn nhiều.
AndrewSteer

3

Một cách tốt để bạn có thể sắp xếp cho một hình tròn (hoặc hình dạng khác) được vẽ cho mỗi đỉnh trong một lưới là sử dụng phương pháp hình học . Đây là một tính năng GPU cho phép vẽ nhiều bản sao (bản sao) của lưới cùng một lúc, với các đỉnh / chỉ số của lưới được cung cấp bởi một bộ đệm và bộ đệm đỉnh khác có thể cung cấp thêm dữ liệu theo từng trường hợp. Trình tạo bóng đỉnh có thể được sử dụng để kết hợp dữ liệu từ cả hai bộ đệm theo bất kỳ cách nào bạn chọn.

Để cụ thể, trong trường hợp của bạn, bạn có thể tạo một lưới biểu thị một vòng tròn bán kính mong muốn, với các đỉnh của nó được chỉ định trực tiếp trong tọa độ không gian màn hình và tập trung ở điểm gốc. Sau đó, bạn sẽ sử dụng instaging để làm cho GPU hiển thị một bản sao mới của lưới vòng tròn cho mỗi đỉnh của lưới điểm ban đầu của bạn. Trong trình tạo bóng đỉnh, bạn sẽ tính toán vị trí không gian màn hình của điểm (sử dụng các phép biến đổi hình chiếu thế giới như bình thường), sau đó dịch lưới hình tròn thành tâm ở vị trí đó.

Đối với phần thứ hai của câu hỏi của bạn, về cách làm cho các vòng tròn ảnh hưởng đến màu sắc của nhau: cụ thể phụ thuộc vào những gì bạn muốn làm, cụ thể. Pha trộn phần cứng có thể được sử dụng để xử lý các trường hợp đơn giản, chẳng hạn như thêm hoặc nhân màu hoặc trộn alpha. Nếu bạn muốn một cái gì đó phức tạp hơn thế, thì có thể thực hiện nó bằng thuật toán nhiều đường chuyền hoặc pha trộn lập trình (trên GPU mới nhất).

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.