2016-12-04 13 views
5

Oglądam wstępne wideo od Apple o Metal i MetalKit.Dlaczego są dwa nawiasy [w funkcjach C++ vertex?

Przykładowy kod dla modułów cieniujących ma te podwójne nawiasy, na przykład [[buffer(0)]]. Dlaczego są dwa nawiasy? Czy to oznacza cokolwiek, czy też jest po prostu wskazaniem, że istnieje słowo kluczowe "bufor"? Nie ma takiej konstrukcji w standardzie C++, czy istnieje?

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

Co by było dobrym 1 lub 2-tygodniowym zabawnym projektem jako wprowadzenie do GP-GPU? Coś łatwego w obsłudze dla nowicjuszy z dobrymi umiejętnościami matematycznymi, ale bez umiejętności artystycznych.

+3

Tak, jest to standardowa składnia. http://pl.cppreference.com/w/cpp/language/attributes – jtbandes

+1

Ponadto, bezwstydna wtyczka do placu zabaw, który napisałem, co może być pomocne, jeśli dopiero się uczyć, jak korzystać z metalu: https://github.com/ jtbandes/Metalbrot.playground – jtbandes

+0

Och, więc jest to atrybut, który mówi tylko, gdzie znaleźć zmienną vertices. Obudź się. Byłem zbyt zawieszony na podwójnym [. Mimo to, każdy pomysł, dlaczego wybrać dwa [zamiast jednego? – user965972

Odpowiedz

5

te nazywane są atrybutów, a ich składnia i zachowanie są zdefiniowane w sekcji 7.6.1 standardu C++, Składnia atrybutu i semantyka. Wyglądają jak to w gramatyce:

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

język cieniowania Metal definiuje wiele cech, które pozwalają powiązać różne semantykę ze zmiennymi, struct/class członków i argumentów funkcji (w tym powiązań stołowych argumentem jak w pytaniu) .

The Metal Shading Language Specification odracza do ++ standard C na ten temat, więc standard C++ naprawdę jest odniesienie do konsultacji:

Język programowania Metal bazuje na C++ 14 Specyfikacji (aka, ISO/IEC JTC1/SC22/WG21 N4431 Specyfikacja języka) z określonymi rozszerzeniami i ograniczeniami. Aby uzyskać szczegółowy opis gramatyki języka, należy zapoznać się ze specyfikacją C++ 14 .

+0

Dodał również, że wspomniany argument '[[buffer (0)]] jest tworzony przez koder poleceń renderowania. Ustawia tabelę argumentów dla zasobów do wysłania do modułów cieniujących: https://developer.apple.com/library/prerelease/content/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Render-Ctx/Render-Ctx.html # // apple_ref/doc/uid/TP40014221-CH7-SW10 Dzięki temu można skonfigurować bufory, tekstury, i samplerStates, do którego ma się odnosić indeks dolny, jak to robi z 'buffer [0]' i 'buffer [1]'. –

+0

Atrybut parametru identyfikuje "szczelinę" zasobu odpowiedniego obiektu buforowego ustawionego w kodzie komend renderowania w czasie bieżącego wywołania komendy draw lub polecenia compute. – warrenm

3

Dzięki tej kontaktów [[x]] wyrażają są coraz upłynął pomiędzy programów operujących ans CPU

cytuję:

Sieć [[...]] składnia służy do deklarowania atrybutów, takich jak źródło lokalizacje, wejścia shader oraz wbudowane zmienne, które są przekazywane z powrotem iz powrotem pomiędzy shaderów i CPU

+0

Skąd pochodzi cytat? Proszę sprecyzuj. – Melebius

Powiązane problemy