2012-01-31 12 views
5

I una aplicación para Android, quiero calcular la normalidad de una superficie de deposición en otros vértices de esta superficie. No quiero hacerlo en el programa "maestro" porque lleva mucho tiempo. En realidad para cada vértice i Pass 4 red de flotadores para cada vextex:¿Cómo acceder a otros vértices en un programa de sombreado de vértices en OpenGL es 2?

attribute vec3 a_bottom; 
attribute vec3 a_left; 
attribute vec3 a_right; 
attribute vec3 a_top; 

vec3 calculNormal() { 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

muy es un código muy muy sucio sé, así que en vez de pasar 4 matrices, quiero hacer eso:

vec3 calculNormal() { 
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ]; 
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ]; 
    ... 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

Entonces, ¿es posible en un programa de sombreado de vértices acceder al búfer de flotación actual? ¿Hay palabras clave especiales como currentFloat? ¿O hay otra posibilidad que extraño?

Respuesta

8

Esto no es posible. Un sombreador de vértices solo tiene acceso al vértice procesado actualmente y sus atributos. Y dado que OpenGL ES no tiene una extensión texture_buffer_object, no puede acceder a los datos de una VBO dentro de un sombreador. Entonces, la única forma de acceder a los vecinos de un vértice es explicándolos explícitamente como atributos de vértices, como en el primer ejemplo.

Pero como parece que su geometría es un patrón rectangular, también puede almacenarla en una textura (o copiarla a una, una extensión pixel_buffer_object puede ayudar con eso si es compatible con ES). En este caso, podría usar un sombreador de fragmentos GPGPU clásico, que calcula las normales para cada "píxel" (en este caso un vértice) de la imagen de salida (en este caso, los datos normales de la geometría rectangular) en función de los valores de sus vecinos (accedidos por accesos de textura simple).

Pero supongo que ni la primera ni la segunda lo harían por usted, teniendo en cuenta las operaciones adicionales de programación y/o copia de memoria, ya que el cálculo de las normales de los vértices ya es bastante rápido. No tiene que hacerlo en todos los cuadros de todos modos y si realmente lo hace, es porque también está actualizando sus posiciones de vértice, en cuyo caso puede usar la misma rutina de actualización para los datos normales (ya sea CPU o GPGPU).

4

Quiero calcular la normalidad de una superficie que se deforme en otros vértices de esta superficie.

Enfoque erróneo. Calcula las normales y guárdalas junto con los vértices.

No quiero hacerlo en el programa "maestro" porque lleva mucho tiempo.

No debe volver a calcular las normales para cada pase de representación. Simplemente calcúlelos y guárdelos. Los cálculos en el sombreador de vértices no son gratuitos. Y el cálculo de las normales en VS es solo desperdicio de poder de procesamiento.

Calcule, guárdelos.

+0

Hola datenwolf. ¿Qué sucede si quiero muestrear un mapa de alturas después de crear un objeto en tiempo de ejecución? ¿Debo ejecutarlo a través de un sombreador para muestrear el mapa de alturas, transformar los vértices, enviarlos de regreso y luego subir otro VBO? No creo que muestrear una textura en la CPU sea realmente el camino, bueno, para una cosa, la textura se ha cargado usando glTexImage y la CPU realmente no la tiene. – Zebrafish

+1

@TitoneMaurice: La pregunta original era sobre mallas genéricas. Pero los mapas de altura son un caso especial, donde la superficie normal se puede calcular usando una convolución con el núcleo correcto (diferencia discreta, también conocido como kernel de gradiente). Usando 'textureGather' (GLSL-4 y posterior) se puede obtener una cuadrícula 2 × 2 de téxeles, que es lo que necesita para eso.Sin embargo, todavía recomiendo precalcular las normales, lo que le da lo que efectivamente es un * mapa normal * para la textura. – datenwolf

+1

@TitoneMaurice: idea de aplicación: cree un mapa de alturas a alta resolución, genere un mapa normal a partir de eso, use un mapa normal de resolución completa (en sombreador de fragmentos) para el cálculo de iluminación y un mapa de alturas muestreado para el desplazamiento de vértices. Idea adicional: puede almacenar resolución completa-normal-mapa y acceder a resolución baja LoD en la etapa de vértice y en el sombreador de fragmentos usar la diferencia entre la resolución completa y el valor de altura de vértice como entrada a un mapeo de paralaje para aumentar la calidad visual. – datenwolf

Cuestiones relacionadas