Question

Autant que je sache, nous ne pouvons pas lire la valeur Z(profondeur) dans OpenGL ES 2.0.Je me demande donc comment obtenir les coordonnées du monde 3D à partir d'un point sur l'écran 2D ?

En fait, j'ai des pensées aléatoires qui pourraient fonctionner.Puisque nous pouvons lire la valeur RGBA en utilisant glReadPixels, que diriez-vous de dupliquer le tampon de profondeur et de le stocker dans un tampon de couleur (par exemple ColorforDepth).Bien sûr, il doit y avoir une bonne convention pour que nous ne perdions aucune information sur le tampon de profondeur.Et puis, lorsque nous avons besoin des coordonnées mondiales d'un point, nous attachons ce tampon de couleur ColorforDepth au framebuffer, puis le rendons.Ainsi, lorsque nous utilisons glReadPixels pour lire les informations de profondeur sur cette image.

Cependant, cela entraînera un flash d'une image puisque le tampon de couleur est un tampon étrange traduit du tampon de profondeur.Je me demande toujours s'il existe un moyen standard d'obtenir la profondeur d'OpenGL es 2.0 ?

Merci d'avance ! :)

Était-ce utile?

La solution

À l'aide d'un FBO, vous pouvez effectuer un rendu sans afficher les résultats.Si vous êtes dans ES 2.0, votre fragment shader peut accéder à la profondeur du fragment actuel (en coordonnées de fenêtre) dans le cadre de gl_FragCoord, vous pouvez donc l'écrire dans le tampon de couleur, utiliser glReadPixels pour récupérer le résultat et continuer.Alternativement, vous pouvez charger l'espace mondial z en tant que variable et l'écrire à partir de votre fragment shader, au cas où ce serait un moyen plus simple.

Pour vous en convaincre, essayez d'écrire un shader rapide qui affiche gl_FragCoord.z ​​à la hâte avec une faible précision, par ex.juste

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

Vous devriez obtenir une échelle de gris dont l'intensité de la couleur représente la profondeur.Parce que vous êtes dans les coordonnées de la fenêtre, l'intensité sera comprise entre 0,0 (fragment non écrêté le plus proche possible) à 1,0 (fragment non écrêté le plus éloigné possible).Afin de ne pas perdre beaucoup de précision, il est probablement plus utile de diviser la valeur entre les composants, car votre fournisseur ne prend certainement pas en charge les tampons cibles à virgule flottante.

Autres conseils

J'utilise un casting de rayons de base pour le choix d'un objet 3D à partir d'un écran tactile. En fait, je calcule l'intersection entre l'écran normal au point de contact et une sphère contenant mon objet. Pour une cueillette très précis ou d'une forme compliquée, vous devez utiliser plusieurs domaines.

Vous pouvez également projeter quelques points clés vous objet dans l'espace 2D vous écran (mon multipliant votre point 3D par votre matrice de transformation) et ensuite faire une comparaison 2D (distance) avec vous touchez le point.

i voudrais aussi être en mesure de lire des valeurs dans le tampon de profondeur, mais la recherche indique qu'il ne peut pas être fait.

vincent suggère, si vous avez des formes simples comme des sphères, ray-casting est probablement mieux.

pour des formes plus complexes tho, Je pense à rendre l'objet à un (potentiellement plus petit) offscreen tampon, attribuer manuellement l'une des composantes de couleur de chaque sommet soit la profondeur de ce sommet, puis la lecture des valeurs de couleur. c'est un peu inélégante et quoique ennuyeux, et vous oblige à être en mesure de convertir l'espace objet à l'espace de l'écran (j'utilise mes propres escouades pour conduire les matrices, de sorte que se charge de cela). il peut y avoir un moyen de shaders pour écrire l'information de profondeur dans le tampon de couleur ou de stencil (GL ES ne dispose même d'un tampon à stencil?)

si quelqu'un a une approche plus propre que j'aimerais l'entendre.

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