Je code un petit moteur de rendu avec les shaders GLSL:
Chaque Maille (bien, submesh) a un certain nombre de vertex flux (par exemple. position normale,la texture,la tangente,etc) dans une grande VBO et un MaterialID.
Chaque Matériau a un jeu de textures et propriétés (par exemple. spéculaire-couleur, diffus, de la couleur, la texture, normal map,etc)
Ensuite, j'ai un shader GLSL, avec des uniformes et des attributs. Disons:
uniform vec3 DiffuseColor;
uniform sampler2D NormalMapTexture;
attribute vec3 Position;
attribute vec2 TexCoord;
Je suis un peu coincé en essayant de concevoir une façon pour le shader GLSL pour définir le flux de mappages (sémantique) pour les attributs et les uniformes, et ensuite lier le sommet des flux pour les attributs appropriés.
Quelque chose dans les lignes de dire à la maille :"mettez votre position flux dans l'attribut "Position" et votre tex coordonnées "TexCoord". Aussi mettre votre couleur diffuse du matériau dans "DiffuseColor" et votre matériel de seconde texture en "NormalMapTexture"
Pour le moment je suis en utilisant codée en dur noms pour les attributs (ie. vertex pos est toujours "Position" ,etc) et de vérifier chaque uniforme et le nom de l'attribut à comprendre ce que le shader est de l'utiliser pour.
Je suppose que je suis à la recherche d'un moyen de créer un "vertex déclaration", mais y compris les uniformes et les textures aussi.
Je me demandais comment les gens le faire à grande échelle des moteurs de rendu.
Edit:
Récapitulatif des méthodes proposées:
1. Attribut/Uniforme de la sémantique est donnée par le nom de la variable (ce que je fais maintenant) À l'aide de noms prédéfinis pour chaque attribut.Le GLSL classeur de requête le nom de chaque attribut et lien le vertex array basé sur le nom de la variable:
//global static variable
semantics (name,normalize,offset) = {"Position",false,0} {"Normal",true,1},{"TextureUV,false,2}
...when linking
for (int index=0;index<allAttribs;index++)
{
glGetActiveAttrib(program,index,bufSize,length,size[index],type[index],name);
semantics[index]= GetSemanticsFromGlobalHardCodedList(name);
}
... when binding vertex arrays for render
for (int index=0;index<allAttribs;index++)
{
glVertexAttribPointer(index,size[index],type[index],semantics[index]->normalized,bufferStride,semantics[index]->offset);
}
2. Des emplacements prédéfinis pour chaque sémantique
GLSL classeur de toujours lier les vertex arrays aux mêmes endroits.C'est le shader à utiliser les les noms appropriés pour correspondre. (Cela semble terriblement similaire à la méthode 1, mais à moins que j'ai mal compris, ce qui implique la liaison de TOUS les vertices disponibles données, même si le shader ne le consomme pas)
.. when linking the program...
glBindAttribLocation(prog, 0, "mg_Position");
glBindAttribLocation(prog, 1, "mg_Color");
glBindAttribLocation(prog, 2, "mg_Normal");
3. Dictionnaire des attributs disponibles à partir de Matériau, Moteur globals, moteur de Rendu et de Maille
Mettez à jour la liste des attributs disponibles publiés par la matière active, le Moteur globals, l'actuel moteur de Rendu et de la Scène actuelle Nœud.
par exemple:
Material has (uniformName,value) = {"ambientColor", (1.0,1.0,1.0)}, {"diffuseColor",(0.2,0.2,0.2)}
Mesh has (attributeName,offset) = {"Position",0,},{"Normals",1},{"BumpBlendUV",2}
puis dans le shader:
uniform vec3 ambientColor,diffuseColo;
attribute vec3 Position;
Lors de la liaison du sommet de données pour le shader, le GLSL classeur en boucle sur les attribs et de la lier à celle que l'on trouve (ou pas? ) dans le dictionnaire:
for (int index=0;index<allAttribs;index++)
{
glGetActiveAttrib(program,index,bufSize,length,size[index],type[index],name);
semantics[index] = Mesh->GetAttributeSemantics(name);
}
et la même chose avec les uniformes, la seule requête de matière active et globals aswell.