2010-12-06 9 views
2

J'ai utilisé DirectX (avec XNA) depuis un certain temps et je suis récemment passé à OpenGL. Je l'aime vraiment, mais une chose m'a ennuyé.Tableaux GLSL à indexation dynamique

J'ai essayé de mettre en œuvre quelque chose qui nécessite une indexation dynamique dans le vertex shader, mais on m'a dit que cela nécessite l'equivilant de SM 4.0. Cependant je sais que cela fonctionne en DX même avec SM 2.0, peut-être même 1.0. L'exemple d'instanciation de XNA utilise ceci pour faire de l'instanciation sur des cartes SM2.0 seulement http://create.msdn.com/en-US/education/catalog/sample/mesh_instancing.

Le compilateur ne peut pas avoir été « dérouler » dans une liste géante si les déclarations, étant donné que ce serait sûrement dépasser pour nos 250 cas, la limite d'instruction sur SM2.

DX fait-il des trucs que je ne peux pas faire avec OpenGL, puis-je manipuler OpenGL pour faire de même, ou est-ce une fonctionnalité matérielle que OpenGL n'expose pas?

+0

Je ne connais pas la réponse, mais par curiosité, qu'est-ce que SM? – LarsH

+0

[ "shader model"] (http://en.wikipedia.org/wiki/High_Level_Shader_Language#Shader_model_comparison) – genpfault

Répondre

0

Vous pouvez télécharger un tableau pour vos directions de la lumière avec quelque chose comme glUniform3fv, puis (en supposant que je comprenne ce que vous essayez de faire correctement) vous avez juste besoin de votre format vertex pour inclure un index dans ce tableau. beaucoup de duplication de ces indices si l'indice change seulement une fois par maillage ou quelque chose comme ça). Si vous ne le savez pas, vous pouvez utiliser glGetAttribLocation + glVertexAttribPointer pour envoyer des attributs de vertex arbitraires comme celui-ci au shader (par opposition à l'utilisation des attributs intégrés obsolètes comme gl_Vertex, gl_Normal, etc.).

+0

Oui, c'est exactement ce que j'essaie de faire :). Mais comment définir le tableau dans le shader et y accéder? – Hannesh

0

De votre lien:

Notez qu'il n'y a pas une seule technique d'instanciation parfaite. Celle-ci doit être mis en œuvre d'une manière différente sur de Windows par rapport à la Xbox 360, et sur Windows, la technique idéale nécessite shaders 3.0, mais il y a aussi une approche de repli qui fonctionnera avec shaders 2.0. Cet exemple met en œuvre plusieurs différentes techniques de instanciation , il peut donc travailler sur les deux plates-formes et versions de shaders.

pas la partie enhardis. Donc, sur une base, vous devriez être capable de faire une instanciation similaire sur le modèle de shader 3. L'instanciation de Shader model 2 est habituellement effectuée en utilisant une palette de matrice. Cela signifie que vous pouvez rendre plusieurs maillages en un seul appel en téléchargeant une charge de matrices de transformation en une fois. Cela réduit les appels de tirage et améliore la vitesse. Quoi qu'il en soit pour OpenGL il y avait beaucoup de problèmes pour finaliser cette extension et donc vous avez besoin de shader 4. Vous pouvez cependant coller un index de palette de matrice par vertex dans la structure de vertex yoru et faire un rendu de palette de matrice en utilisant un shader.

+0

La technique de SM3 utilise 2 flux de sommet, quelque chose de complètement différent. Cette palette de matrice est ce que je veux dire, mais dans DX, je peux passer vec3 en tant que tableau aussi, puis-je faire cela dans OpenGL? – Hannesh

+0

@Hannesh: Vous pouvez toujours faire glUniform * appels fv ou vous pouvez regarder dans GL_ARB_uniform_buffer_object – Goz

+0

Je vais regarder dans les palettes de matrice, ce que je veux réellement est juste la direction de la lumière dans l'espace normal pour 6 faces du cube. Peut-être utiliser une chaîne de déclarations if? – Hannesh