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? p>
5 Réponses :
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. p>
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 p>
Si vous Google pour OpenGL ES et mappage OU Shadow, vous trouverez plus d'explications et d'exemple de code source. P>
à 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. P>
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. P>
J'ai fini par mettre en œuvre Raycasting, pour l'instant.
Pas vraiment un duplicata, mais voir aussi: Comment obtenir l'objet dans l'espace Web 3D à partir d'une coordonnée de souris click p>
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 em> a été cliqué et n'a pas vraiment besoin de précision par pixel. P>
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. P>
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. P>
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. P>
Ce lien est mort, mais j'ai trouvé cela sur le site Web: khronos.org/registry/ Webgl / Extensions / WebGL_DEPTH_Texture
Plusieurs années ont passé, ces jours-ci, le Utilisation générale: p> Préparation: P> Rendu: p> Unbind the Cadrebuffer, transmettez la texture de profondeur sur vos shaders et lisez-la comme toute autre texture: p>
webgl_depth_texture code> est largement disponible ... Sauf si vous n'avez besoin de prendre en charge IE.
GL.DEPTH_Component code>) li>
GL.Color_ATCHMENT0 code>,
GL.DEPTH_ATCHAMMENT CODE>) LI>
ol>
texPos.xyz = (gl_Position.xyz / gl_Position.w) * 0.5 + 0.5;
float depthFromZBuffer = texture2D(uTexDepthBuffer, texPos.xy).x;
La question portait sur la lecture des valeurs de profondeur du code JS, pas de GLSL.