2016-07-10 3 views
0

Bon, c'est un peu compliqué (du moins pour moi), et je n'ai trouvé aucune solution. Je fais un jeu de golf 2D en OpenGL. Le fond est une texture que j'ai faite qui aura une carte du parcours. Le problème est que les frontières, où la balle ne peut pas atterrir en toute sécurité (hors limites, pièges à sable, etc.) n'est pas géométrique, donc je ne peux pas comparer les coordonnées x et y de la balle à quelques valeurs pour voir si c'est sorti. Une idée que j'ai en tant que solution est d'utiliser le canal alpha de la texture pour marquer ce que les pixels sont en dehors des limites. Je voudrais que mon shader dessine les valeurs RVB indépendamment de l'alpha. Ensuite, je marquerais dans les limites comme alpha==1.0f et hors-limites comme alpha==0.0f, ou quelque chose de similaire au moins. Ensuite, je pourrais échantillonner la texture aux coordonnées x et y de la balle pour voir si elle est dedans ou dehors. La plupart de ceci je peux m'accomplir, excepté pour une chose: Comment est-ce que j'échantillonne la texture du CPU? Je sais que les shaders sur la carte graphique peuvent utiliser la fonction texture() avec sampler2D et vec2, et c'est très bien, mais si la seule sortie du fragment shader est de colorer les pièces jointes (sans compter gl_FragDepth ou quelque chose de similaire), alors comment faire Je récupère la valeur alpha retournée à la CPU? Ou échantillonnez-vous sur la CPU plutôt que d'utiliser un autre shader? Ou est-ce que tout ce concept est défectueux? Toute aide est appréciée.Utiliser la couche alpha d'une texture comme carte de bordure

P.S. J'utilise OpenGL 4, si ce n'était pas clair.

Répondre

2

OpenGL existe pour effectuer le rendu. Donner des informations OpenGL dans le seul but de les lire plus tard est erroné.

Vous ne devez pas transmettre ces informations de limites à OpenGL à moins que vous n'ayez l'intention de l'utiliser pour dessiner des images. Et même si vous le faites, gardez une copie de celui-ci sur le CPU, de sorte que vous pouvez l'interroger sans tracas. Sur la CPU, il vous suffit de calculer la coordonnée de pixel dont vous avez besoin de lire et de lire à partir de celle-ci.

Ce n'est pas différent de la lecture d'un tableau 2D.

+0

Merci! Mais si je stocke l'image dans un tableau 2D et l'envoie à OpenGL via 'glTexImage()', n'y a-t-il pas un peu de redondance dans le stockage de l'image deux fois? Ou est-ce juste inévitable? – TheJared802