2010-11-08 19 views
0

Existe-t-il un moyen de détecter si l'alpha d'un pixel après le dessin n'est pas égal à 0 lors de l'utilisation d'OpenGLES sur l'iPhone?Point de test dans le canal alpha

Je voudrais tester plusieurs points pour voir qu'ils sont dans la zone d'un polygone dessiné par l'utilisateur. Si vous connaissez Flash, quelque chose d'équivalent à BitmapData :: getPixel32 est ce que je recherche.

+0

BitmapData :: getPixel32 ne renvoie-t-il pas la valeur du canal alpha? – PatrickS

+0

getPixel32 renvoie la valeur ARGB complète d'un pixel. De cela, vous pouvez détecter s'il y a quelque chose ou pas sur ce pixel. – sharvey

Répondre

1

Le framebuffer est conservé par le GPU et n'est pas immédiatement accessible par le CPU. Je pense que la chose que vous voudriez probablement de OpenGL complet est la requête d'occlusion; vous pouvez demander à ce que la géométrie soit dessinée et être informé du nombre de pixels réellement tracés. Malheureusement, ce n'est pas disponible sur l'iPhone.

Je pense que ce que vous voulez probablement, c'est glReadPixels, qui peut être utilisé pour lire un seul pixel si vous préférez, par exemple. (Écrit ici, comme je tape, non testé)

GLubyte pixelValue[4]; 
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelValue); 

NSLog(@"alpha was %d", pixelValue[3]); 

L'utilisation glReadPixels provoque une chasse d'eau de canalisation, est donc généralement une mauvaise idée d'un point de vue de la performance de GL, mais il fera ce que vous voulez. Contrairement à iOS, OpenGL utilise l'ordre du papier graphique pour les coordonnées de pixel, donc (0, 0) est le coin inférieur gauche.

+0

Cela fonctionne, et cela affecte aussi grandement les performances. J'ai essayé de charger tous les pixels à la fois, mais c'est toujours lent. Y a-t-il un moyen de prendre juste le canal alpha pour accélérer les choses? – sharvey

+0

J'ai découvert par la suite que vous pouvez spécifier GL_ALPHA comme format plutôt que GL_RGBA et que juste ce canal est retourné. Cependant, je ne suis pas sûr que cela ferait une grande différence pour les performances - cela appelle glReadPixels à tout ce qui pose problème. Si vous faites plusieurs tests, je pense qu'il pourrait être plus rapide d'utiliser glReadPixels pour saisir l'intégralité de l'affichage en même temps, puis vérifier les valeurs alpha à partir de cela. – Tommy