Pregunta

Hasta donde yo sé, no podemos leer el valor Z (profundidad) en OpenGL ES 2.0.Entonces me pregunto cómo podemos obtener las coordenadas del mundo 3D desde un punto en la pantalla 2D.

De hecho, tengo algunas ideas aleatorias que podrían funcionar.Dado que podemos leer el valor RGBA usando glReadPixels, ¿qué tal si duplicamos el búfer de profundidad y lo almacenamos en un búfer de color (por ejemplo, ColorforDepth)?Por supuesto, es necesario que haya alguna convención agradable para que no perdamos ninguna información del búfer de profundidad.Y luego, cuando necesitamos las coordenadas mundiales de un punto, adjuntamos este buffer de color ColorforDepth al framebuffer y luego lo renderizamos.Entonces, cuando usamos glReadPixels para leer la información de profundidad en este cuadro.

Sin embargo, esto provocará un flash de 1 fotograma ya que el búfer de color es un búfer extraño traducido del búfer de profundidad.Todavía me pregunto si existe alguna forma estándar de obtener profundidad en OpenGL es 2.0.

¡Gracias de antemano! :)

¿Fue útil?

Solución

Usando un FBO, puedes renderizar sin mostrar los resultados.Si está en ES 2.0, su sombreador de fragmentos puede acceder a la profundidad del fragmento actual (en coordenadas de ventana) como parte de gl_FragCoord, por lo que puede escribirlo en el búfer de color, usar glReadPixels para obtener el resultado y continuar.Alternativamente, puede cargar world-space z como una variación y escribirlo desde su sombreador de fragmentos, en caso de que sea una forma más fácil de evitarlo.

Para convencerse, intente escribir un sombreador rápido que elimine gl_FragCoord.z ​​rápidamente con baja precisión, p.justo

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

Debería obtener una escala de grises en la que la intensidad del color represente la profundidad.Debido a que estás en coordenadas de ventana, la intensidad variará de 0,0 (fragmento sin recortar más cercano posible) a 1,0 (fragmento sin recortar más lejano posible).Para no perder mucha precisión, probablemente sea más útil dividir el valor entre los componentes, ya que es casi seguro que su proveedor no admite buffers de destino de punto flotante.

Otros consejos

Yo uso un rayo básica casting para recoger un objeto 3D a partir de una pantalla táctil. En realidad puedo calcular la intersección entre la pantalla normal en el punto de contacto y una esfera que contiene mi objeto. Para una cosecha muy preciso o forma complicada que tiene que utilizar varios ámbito.

También puede proyectar algunos puntos clave de ustedes objeto en el espacio 2D de ustedes Pantalla (mi multiplicando su punto 3D por su matriz de transformación) y luego hacer una comparación 2D (distancia) con la que se toca el punto.

i también le gustaría ser capaz de leer los valores en la memoria intermedia de profundidad, pero la investigación está indicando que no se puede hacer.

como sugiere Vicente, si tiene formas simples como esferas, ray-casting es probablemente mejor.

para formas más complejas Tho, Estoy pensando de hacer que el objeto a una (potencialmente más pequeño) buffer fuera de pantalla, asignar manualmente uno de los componentes de color de cada vértice de ser la profundidad de ese vértice, y después de leer los valores de color. esto es poco elegante y aunque molesto, y requiere que usted sea capaz de convertir objetos en el espacio para el espacio de pantalla (estoy usando mis propias cuaterniones para conducir las matrices, por lo que se encarga de eso). puede haber un camino con shaders para escribir la información de profundidad en el color o stencil buffer (no GL ES siquiera tiene un stencil buffer?)

si alguien tiene un enfoque más limpio Me encantaría escucharlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top