2010-11-10 23 views
0

J'ai une question concernant le pipeline de rendu OpenGL.Quelle couleur obtient un fragment s'il y a deux sommets à la même position avec deux couleurs différentes?

J'ai récemment lu une théorie sur le Shader de géométrie du GLSL. Je pense que je comprends les bases de la façon d'émettre une nouvelle géométrie et d'assigner des couleurs aux nouveaux sommets. Je ne suis cependant pas sûr de la couleur d'un fragment si l'un de ces nouveaux sommets avait exactement la même position que celui d'un shader Vertex. Je considère cet exemple: Si je comprends bien, je suis capable de gérer un seul sommet avec le shader Vertex. Je fais une transformation et stocke la position dans glPosition. Il est en outre possible d'attribuer une couleur à ce sommet, par ex. en le stockant dans glFrontColor. À titre d'exemple, je lui donne la couleur rouge. Si tous les canaux ont 32 bits, ce serait 0xFFFFFFFF'00000000'00000000'00000000, non? Ensuite, le geometry shader est impliqué. Je veux que mon shader de géométrie émette des sommets supplémentaires. Au moins l'un d'entre eux est à la même position que le sommet originel venant du shader Vertex. Cependant, une autre couleur lui est affectée, par ex. vert. Ce serait 0x00000000'FFFFFFFF'00000000'00000000, non? Tôt ou tard, après que chaque sommet a été traité, la pixellisation a lieu. Si je comprends bien, les deux sommets sont pixellisés et deviendront donc le même fragment. Alors, on y va. De quelle couleur sera ce fragment particulier? Y a-t-il une sorte de mélange automatique et le fragment devient jaune? Ou est rouge ou plutôt vert?

Cette question pourrait être stupide. Mais je ne suis tout simplement pas clair sur ce point et apprécierais que quelqu'un puisse clarifier cela pour moi.

S'il n'y a pas de mélange (ce que je suppose), comment pourrais-je créer un effet de fondu?

Merci beaucoup Walter

Répondre

0

je pense qu'ils seront Z-Fighting, si elles ont exactement les mêmes valeurs pour x et y z.

A propos de mélange:

Il est distinct du pipeline programmable, de sorte que vous ne devez pas faire la plupart des travaux dans les shaders pour elle. D'abord activer le mélange avec glEnable(GL_BLEND), puis spécifier votre fonction de mélange souhaitée avec glBlendFunc, le plus souvent glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Maintenant, les sommets n'ont besoin que d'une valeur alpha définie à gl_FragColor.a et leur couleur se fondra.

2

En supposant que vous êtes des points de rendu (ce qui semble être ce que vous décrivez), les deux sommets avec les différentes couleurs donneront deux fragments (un pour chaque sommet) au même emplacement. Quelle couleur finale sera écrite sur la sortie dépend des valeurs Z pour chacun, l'ensemble de fonctions de mélange et l'ordre dans lequel ils sont traités (qui est effectivement aléatoire - vous ne pouvez pas compter sur l'un ou l'autre ordre sauf si vous faites une synchronisation supplémentaire stuff, donc vous devez définir votre func func/Z-culling de telle sorte que cela n'a pas d'importance).