Question

J'ai beaucoup de positions et directions stockées dans des textures 1D sur le GPU. Je veux les utiliser comme rendersources dans un geometry shader GLSL. Pour ce faire, je dois créer des matrices de vue correspondant de ces textures.

Ma première pensée est de prendre un détour à la CPU, lisez les textures à la mémoire et de créer un groupe de matrices de vue à partir de là, avec quelque chose comme glm::lookat(). Ensuite, envoyez les matrices comme variables uniformes au shader.

Ma question est, il est possible wether sauter ce détour et au lieu de créer directement les matrices de vue dans le geometry shader GLSL? Aussi, est-ce possible la performance sage?

Était-ce utile?

La solution

Personne ne dit que (ou personne ne devrait dire) que votre matrice de vue doit provenir de la CPU par un uniforme. Vous pouvez simplement générer la matrice de vue à partir des vecteurs dans votre droit de texture à l'intérieur du shader. Peut-être que la mise en œuvre du bon vieux gluLookAt est de vous aider il.

Si cette approche est une bonne idée est une autre question, des performances, mais si cette texture est assez grande ou change fréquemment, ce aproche est peut-être mieux que le relisant à la CPU.

Mais peut-être vous pouvez pré-générer les matrices dans une autre texture / tampon à l'aide d'un simple GPGPU comme shader qui ne fait que générer une matrice pour chaque position / vecteur dans les textures et le stocker dans une autre texture (en utilisant FBOs) ou un tampon (à l'aide de transformer la rétroaction). De cette façon, vous n'avez pas besoin de faire un aller-retour à la CPU et vous n'avez pas besoin de générer les matrices pour chaque nouveau sommet / / primitif que ce soit. D'autre part, cela augmentera la mémoire requise comme une matrice 4x4 est un peu plus lourd qu'une position et une direction.

Autres conseils

Bien sûr. Lire la texture, et de construire les matrices à partir des valeurs ...

vec4 x = texture(YourSampler, WhateverCoords1);
vec4 y = texture(YourSampler, WhateverCoords2);
vec4 z = texture(YourSampler, WhateverCoords3);
vec4 w = texture(YourSampler, WhateverCoords4);
mat4 matrix = mat4(x,y,z,w);

Tout problème avec cela? Ou ai-je raté quelque chose?

La matrice de vue est uniforme, et les uniformes ne changent pas au milieu d'un rendu par lots, ils ne peuvent pas être écrit à partir d'un shader (directement). Dans la mesure où je ne vois pas comment générer il pourrait être possible, du moins pas directement.

A noter également que les pistes de shaders de la géométrie après les sommets ont été transformés avec la matrice modelview, il ne fait pas tout sens trop (au moins pendant la même passe) pour re-générer cette matrice ou une partie de celui-ci.

Vous pourriez bien sûr faire sans doute encore un peu de bidouille avec transformer des commentaires, écrire des valeurs à un tampon, et soit copier / bind ce tampon comme uniforme plus tard ou tout simplement lire les valeurs de l'intérieur d'un shader et se multiplient comme une matrice. Ce serait au moins éviter un aller-retour à la CPU - la question est de savoir si une telle approche est logique et si vous voulez vraiment faire une telle chose obscure. Il est difficile de dire ce qui est mieux sans savoir exactement ce que vous voulez atteindre, mais tout à fait probablement transformer les choses dans le vertex shader (lire ces textures, construire une matrice, il faut multiplier) fonctionnera mieux et plus facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top