8
votes

Comment puis-je lire le tampon de profondeur dans Webgl?

Utilisation de l'API WebLL, comment puis-je obtenir une valeur à partir du tampon de profondeur ou de déterminer de toute autre manière à déterminer les coordonnées 3D à partir des coordonnées d'écran (c.-à-d. Pour trouver un emplacement cliqué sur), autrement que en effectuant mon propre rayoncasting?


0 commentaires

5 Réponses :


7
votes

Je ne sais pas s'il est possible d'accéder directement au tampon de profondeur, mais si vous voulez des informations de profondeur dans une texture, vous devez créer une texture RGBA, la fixer comme une pièce jointe à un objet de tampon de cadre et de rendez-vous. Informations détaillées dans la texture, à l'aide d'un shader de fragment qui écrit la valeur de profondeur dans GL_FRAGCOLOR.

Pour plus d'informations, voir les réponses à l'une de mes questions plus anciennes: WebGL - La profondeur de rendu de la texture FBO ne fonctionne pas

Si vous Google pour OpenGL ES et mappage OU Shadow, vous trouverez plus d'explications et d'exemple de code source.


0 commentaires

4
votes

à partir de la section 5.13.12 de la spécification WebLL Il semble que vous ne puissiez pas lire directement le tampon de profondeur, alors peut-être que la suggestion de Markus est la meilleure façon de le faire, bien que vous ne puissiez pas nécessairement besoin d'un FBO pour cela.

Mais si vous voulez faire quelque chose comme cueillir, il y a d'autres méthodes pour cela. Juste la navigation, comme on l'a demandé très souvent.


1 commentaires

J'ai fini par mettre en œuvre Raycasting, pour l'instant.



1
votes

Pas vraiment un duplicata, mais voir aussi: Comment obtenir l'objet dans l'espace Web 3D à partir d'une coordonnée de souris click

Mis à côté de non-consommation et de casting d'un rayon (puis d'effectuer des tests d'intersection contre celui-ci au besoin), votre meilleur pari est de regarder «cueillir». Cela ne donnera pas de coordonnées 3D exactes, mais il s'agit d'un substitut utile de non-récupération lorsque vous ne vous souciez que de savoir quel objet a été cliqué et n'a pas vraiment besoin de précision par pixel.

Cueillette dans WebGL signifie rendre la scène entière (ou au moins, les objets que vous aimez) à l'aide d'un shader spécifique. Le shader rend chaque objet avec une carte d'identité unique différente, qui est codée dans les canaux rouge et vert, à l'aide du canal bleu comme clé (non-bleu signifie aucun objet d'intérêt). La scène est rendue dans un cadre décrénel pour qu'il ne soit pas visible à l'utilisateur final. Ensuite, vous lisez en arrière, en utilisant GL.ReadPixels (), le pixel ou les pixels d'intérêt et voir quel identifiant d'objet a été codé à la position donnée.

Si cela aide, voir MOI Mise en œuvre de la cueillette WebGL . Cette implémentation choisit une région rectangulaire de pixels; Le passage dans une région 1x1 entraîne la cueillette à un seul pixel. Voir aussi les fonctions des lignes 146, 162 et 175.


0 commentaires

1
votes

Au 23 janvier 2012, il existe un projet d'extension WebGL pour activer la lecture de tampon de profondeur, webgl_depth_texture . Je n'ai aucune information sur sa disponibilité dans les implémentations, mais je ne m'y attends pas à cette date précoce.


1 commentaires

Ce lien est mort, mais j'ai trouvé cela sur le site Web: khronos.org/registry/ Webgl / Extensions / WebGL_DEPTH_Texture



10
votes

Plusieurs années ont passé, ces jours-ci, le webgl_depth_texture code> est largement disponible ... Sauf si vous n'avez besoin de prendre en charge IE.

Utilisation générale: p>

Préparation: P>

  1. Quertiez l'extension (obligatoire) li>
  2. allouer une texture de couleur et de profondeur séparée ( GL.DEPTH_Component code>) li>
  3. combine les deux textures dans une seule tramebuffer ( GL.Color_ATCHMENT0 code>, GL.DEPTH_ATCHAMMENT CODE>) LI> ol>

    Rendu: p>

    1. Liez la tramebuffer, rendant votre scène (généralement une version simplifiée) li>
    2. Unbind the Cadrebuffer, transmettez la texture de profondeur sur vos shaders et lisez-la comme toute autre texture: p>

      texPos.xyz = (gl_Position.xyz / gl_Position.w) * 0.5 + 0.5;
      float depthFromZBuffer = texture2D(uTexDepthBuffer, texPos.xy).x;
      


1 commentaires

La question portait sur la lecture des valeurs de profondeur du code JS, pas de GLSL.