2016-12-04 2 views
5

Je regarde la vidéo d'introduction d'Apple à propos de Metal et MetalKit.Pourquoi y a-t-il deux crochets [dans les fonctions de vertex C++?

L'exemple de code pour les shaders a ces doubles crochets comme [[buffer(0)]] arguments. Pourquoi y a-t-il deux crochets? Cela signifie-t-il quelque chose ou est-ce juste pour indiquer qu'il y a un mot-clé "tampon" qui suit? Il n'y a pas une telle construction en C++ standard, n'est-ce pas?

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

Aussi ce qui serait un bon projet amusant de 1 ou 2 semaines comme introduction dans GP-GPU? Quelque chose de gérable pour un novice avec de bonnes compétences en mathématiques mais pas de compétences artistiques.

+3

Oui, il s'agit d'une syntaxe standard. http://en.cppreference.com/w/cpp/language/attributes – jtbandes

+1

Aussi, plug éhonté pour un terrain de jeu que j'ai écrit qui pourrait être utile si vous apprenez juste à utiliser le métal: https://github.com/ jtbandes/Metalbrot.playground – jtbandes

+0

Oh, donc c'est un _attribute_ qui dit juste où trouver la variable vertex. Réveillez-vous le cerveau. J'étais trop accroché au double [. Pourtant, aucune idée pourquoi ils en choisissent deux [au lieu d'un seul? – user965972

Répondre

5

Ceux-ci sont appelés attributs , et leur syntaxe et leur comportement sont définis dans la section 7.6.1 de la norme C++, Syntaxe d'attribut et sémantique. Ils ressemblent à ceci dans la grammaire:

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

Le langage d'ombrage en métal définit de nombreux attributs qui vous permettent d'associer différentes sémantique avec des variables, struct/class membres et arguments de la fonction (y compris les liaisons de table d'arguments comme dans votre question) .

Les Metal Shading Language Specification sursoit à la norme C++ sur ce point, de sorte que le standard C++ est vraiment la référence à consulter:

Le langage de programmation en métal est basée sur le 14 C++ Spécification (alias ISO/CEI JTC1/SC22/WG21 Spécification du langage N4431) avec des extensions et des restrictions spécifiques. Veuillez vous référer à la spécification C++ 14 pour une description détaillée de la grammaire du langage.

+0

Va également ajouter que l'argument '[[buffer (0)]]' mentionné est créé par l'encodeur de commande de rendu. Il met en place une table d'arguments de ressources à envoyer aux shaders: https://developer.apple.com/bibliothèque/prerelease/content/documentation/Divers/Conceptuel/MetalProgrammingGuide/Render-Ctx/Render-Ctx.html #/apple_ref/doc/uid/TP40014221-CH7-SW10 Ainsi il peut mettre en place des tampons, des textures, et samplerStates doit être référencé par indice comme cela est fait avec 'buffer [0]' et 'buffer [1]'. –

+0

L'attribut parameter identifie la ressource "slot" de l'objet tampon correspondant tel que défini dans l'encodeur de commande de rendu au moment de l'appel de dessin en cours ou de la commande de calcul. – warrenm

3

Avec cette [[x]] vous déclarez att qui se passe entre les CPU Shaders des ans

Je cite:

La syntaxe [[...]] permet de déclarer des attributs tels que la ressource destinations, les entrées de shaders et des variables intégrées qui sont passés avant et-vient entre shaders et CPU

+0

D'où vient la citation? Veuillez préciser. – Melebius