2016-12-04 41 views
5

Tôi đang xem video giới thiệu của Apple về Metal and MetalKit.Tại sao có hai dấu ngoặc vuông [trong các hàm đỉnh C++?

Mã mẫu cho trình đổ bóng có các dấu ngoặc kép như [[buffer(0)]] đối số. Tại sao có hai dấu ngoặc? Nó có nghĩa là bất cứ điều gì hoặc là nó chỉ để chỉ ra rằng có từ khóa "đệm" sau đây? Không có cấu trúc như vậy trong tiêu chuẩn C++, là có?

vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]], 
           constant Uniforms &uniforms [[buffer(1)]], 
           uint vid [[vertex_id]]) 

Ngoài ra, dự án thú vị 1 hoặc 2 tuần là phần giới thiệu về GP-GPU là gì? Một cái gì đó quản lý cho một người mới với kỹ năng toán học tốt nhưng không có kỹ năng nghệ thuật.

+3

Vâng, đây là cú pháp chuẩn. http://en.cppreference.com/w/cpp/language/attributes – jtbandes

+1

Ngoài ra, cắm không biết xấu hổ cho một sân chơi mà tôi đã viết có thể hữu ích nếu bạn chỉ học cách sử dụng Metal: https://github.com/ jtbandes/Metalbrot.playground – jtbandes

+0

Ồ, vì vậy nó là một _attribute_ mà chỉ nói nơi để tìm biến đỉnh. Đánh thức Brain. Tôi đã quá treo lên trên đôi [. Tuy nhiên, bất kỳ ý tưởng tại sao họ chọn hai [thay vì chỉ một? – user965972

Trả lời

5

Chúng được gọi là thuộc tính và cú pháp và hành vi của chúng được xác định trong phần 7.6.1 của tiêu chuẩn C++, Cú pháp thuộc tính và ngữ nghĩa. Họ trông như thế này trong ngữ pháp:

attribute-specifier: 
    [ [ attribute-list ] ] 
    alignment-specifier 

Ngôn ngữ kim loại che định nghĩa nhiều thuộc tính cho phép bạn kết hợp ngữ nghĩa khác nhau với các biến, struct/class thành viên, và đối số chức năng (bao gồm cam kết ràng buộc bảng tham số như trong câu hỏi của bạn) .

Các Metal Shading Language Specification trì hoãn để chuẩn C++ về vấn đề này, vì vậy tiêu chuẩn C++ thực sự là tài liệu tham khảo để tham khảo ý kiến:

Các ngôn ngữ lập trình kim loại được dựa trên C++ 14 Đặc điểm kỹ thuật (aka, ISO/IEC JTC1/SC22/WG21 N4431 Đặc điểm Ngôn ngữ) với các phần mở rộng và hạn chế cụ thể. Vui lòng tham khảo C++ 14 Đặc điểm kỹ thuật để biết mô tả chi tiết về ngữ pháp ngôn ngữ.

+0

Cũng sẽ thêm rằng đối số '[[buffer (0)]]' được tạo ra bởi bộ mã hóa lệnh render. Nó thiết lập một bảng đối số các tài nguyên để gửi tới các trình đổ bóng: https://developer.apple.com/library/prerelease/content/documentation/Miscellaneous/Conceptual/MetalProgrammingHướng dẫn/Render-Ctx/Render-Ctx.html # // apple_ref/doc/uid/TP40014221-CH7-SW10 Vì vậy, nó có thể thiết lập bộ đệm, họa tiết, và samplerStates được tham chiếu bởi subscript vì nó đang làm với 'buffer [0]' và 'buffer [1]'. –

+0

Thuộc tính tham số xác định tài nguyên "vị trí" của đối tượng bộ đệm tương ứng như được đặt trên bộ mã hóa lệnh hiển thị tại thời điểm lệnh vẽ hoặc lệnh tính toán hiện tại. – warrenm

3

Với điều này [[x]] bạn khai báo att mà đang nhận được thông qua giữa shaders ans CPU

Tôi xin trích dẫn:

Các [[...]] cú pháp được sử dụng để khai báo các thuộc tính như tài nguyên địa điểm, đầu vào shader và biến tích hợp trong đó được truyền lại và ra giữa shaders và CPU

+0

Trích dẫn từ đâu? Xin hãy chỉ ra cụ thể. – Melebius

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