Autant que je sache, nous ne pouvons pas lire la valeur z (profondeur) dans OpenGL ES 2.0. Je me demande donc comment nous pouvons obtenir les coordonnées du monde 3D d'un point sur l'écran 2D? P>
En fait, j'ai des pensées aléatoires pourraient fonctionner. Étant donné que nous pouvons lire la valeur RGBA en utilisant GLREADPIXEXELS, que diriez-vous de nous dupliquer le tampon de profondeur et de la stocker dans un tampon de couleur (Say Colorfordrepth). Bien sûr, il doit y avoir une bonne convention de manière à ne pas perdre d'informations sur le tampon de profondeur. Et ensuite, lorsque nous avons besoin de coordonnées du monde d'un point, nous attachons ce tampon de couleur Colorfordepth à la tramebuffer, puis de le rendre. Ainsi, lorsque nous utilisons GlreadPixels pour lire les informations de profondeur dans ce cadre. p>
Cependant, cela mènera à 1 flash de cadre car le ColorBuffer est un tampon étrange traduit de la tampon de profondeur. Je me demande toujours s'il y a un moyen standard d'obtenir la profondeur dans OpenGL ES 2.0? P>
thx à l'avance! :) p>
3 Réponses :
J'utilise une coulée de rayons de base pour choisir un objet 3D à partir d'une touche écran. En fait, je calcule l'intersection entre l'écran normal au point tactile et une sphère contenant mon objet. Pour une cueillette très précise ou une forme compliquée, vous devez utiliser plusieurs sphères. P>
Vous pouvez également projeter des points clés de votre objet dans l'espace 2D de votre écran (ma multiplication de votre point 3D par votre matrice de transformation), puis effectuez une comparaison 2D (distance) avec votre point tactile. P>
Je voudrais aussi pouvoir lire des valeurs dans le tampon en profondeur, Mais la recherche indique qu'il ne peut pas être fait. P>
Comme Vincent suggère, si vous avez des formes simples comme des sphères, la coulée de rayons est probablement meilleure. p>
pour des formes plus complexes tho, Je pense rendre l'objet à un tampon (potentiellement plus petit) offscreen, attribuer manuellement l'un des composants de couleur de chaque sommet comme la profondeur de ce sommet, puis lire les valeurs de couleur. C'est un peu inélégant et ennuyeux Tho, et vous oblige à convertir l'espace d'objet en espace d'écran (j'utilise mes propres quaternions pour conduire les matrices, donc cela prend en charge cela). Il peut y avoir un moyen avec des shaders pour écrire les informations de profondeur dans la couleur de la couleur ou du pochoir (GL es a même un tampon de pochoir?) P>
Si quelqu'un a une approche plus propre, j'aimerais l'entendre. P>
Utiliser un FBO, vous pouvez rendre sans afficher les résultats. Si vous êtes dans ES 2.0, votre fragment Shader peut accéder à la profondeur de la fragment actuelle (dans les coordonnées de la fenêtre) dans GL_FRAGOORD, afin que vous puissiez écrire cela sur le tampon de couleur, utilisez GlreadPixels pour obtenir le résultat. Alternativement, vous pouvez charger World-Space Z comme une variation et d'écrire cela de votre fragment Shader, au cas où c'est une solution plus facile.
Pour vous convaincre, essayez d'écrire une shader rapide qui met GL_FRAGOORD.Z à la hâte de la faiblesse , par exemple Juste p>
gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);
Tommy, pourriez-vous s'il vous plaît dites un peu plus sur la division GL_FRAGOORD.Z entre les composants. Ne pas suivre. Acclamations.
@DUGLA Si la profondeur était un entier 32 bits, vous pourriez sauf 8 bits dans chacun de R, G, B et A. donc en pratique ce que vous feriez, c'est quelque chose comme multiplier le vecteur (1, 256, 65536, 16777216) code>, puis stockez chaque composant de ce vecteur MOD 1.0 dans les canaux correspondants. Vous pouvez recombiner plus tard en divisant par les composants pertinents et en ajoutant ensemble.
@Tommy c'est très intéressant !! Pourriez-vous élaborer à l'inverse du VEC4 de conversion de flotter? Vous pouviez montrer un exemple s'il vous plaît?