2009-12-20 67 views
8

Tengo una aplicación que dibuja líneas de vista en 3-d marcadas que muestran varias características. Estoy trasladando el mapa a una arquitectura OpenGL-ES, pero estoy teniendo problemas para encontrar la forma de líneas discontinuas.Dibujar líneas punteadas con OpenGL-ES

Haciendo muchas búsquedas en Google, he encontrado muchas referencias a la idea de que dibujar líneas discontinuas y polígonos se eliminaron de OpenGL-ES ya que se pueden emular fácilmente utilizando triángulos de texturas. Eso es genial, pero no puedo encontrar a nadie que realmente haga esta emulación y/o tenga una descripción de los pasos involucrados.

Un ejemplo, de un problema que he encontrado al intentar prototipar este concepto, es que la perspectiva aprieta mis líneas hacia lo invisible a medida que avanzan hacia el horizonte. Con LINE_STRIP, esto no sucede, y las líneas permanecen un ancho constante en el mapa.

Cualquier consejo sobre cómo lograr líneas de ancho constante discontinuas en una vista en perspectiva sería muy apreciado.

+0

¿Has probado una línea normal? ¿Las hace desaparecer en el horizonte, o solo si las usas con textura? –

+0

Las líneas normales se dibujan correctamente, pero no puedo usarlas. Intenté aplicar una textura al LINE_STRIP, pero esto no pareció hacer nada. Buscando eso encontré un consejo que indicaba que no funcionaría y que los triángulos con textura eran el camino a seguir. Si se puede hacer que la textura LINE_STRIP funcione, eso sería genial. PD - Estoy usando egl 1.1. – Piklor

Respuesta

5

Creo que puede aplicar una textura a una línea, no solo a un triángulo. Tendrá que establecer las coordenadas de textura para cada extremo de la línea; la textura se interpolará linealmente a lo largo de la línea.

La efectividad de esta solución no debe depender de si usa líneas o líneas: las líneas son solo una forma de crear líneas con menos vértices.

Existe otro problema: la tendencia del patrón de textura a compactarse a medida que una línea se aleja de la cámara. Esto sucede porque la interpolación de coordenadas de textura es correcta en perspectiva, incluso para líneas (consulte la sección 3.5 de la especificación GL).

Hay dos maneras de evitar esto:

  1. Si se puede calcular una "q" de coordenadas para su textura que se deshace la perspectiva, puede restaurar la texturización del espacio de pantalla. Esta técnica es probablemente demasiado costosa para el rendimiento.

  2. Puede proyectar la textura en el espacio visual (por ejemplo, glTexGen).

coordenada de textura generación es, por supuesto, no está disponible en GLES 1.1, pero si está utilizando vértices de matriz, puede fingir por:

  • Configuración de la coordenada de textura matriz para ser coordinar su vértice array y
  • Usando la matriz de textura para "transformar" los vértices.

La desventaja de esta técnica es que el patrón de textura estará en el espacio de la pantalla fija, es decir, la textura no se ejecutará en las líneas.

+0

Gracias, voy a probar esto. Intenté texturizar la línea previamente, pero no funcionó, podría haber renunciado a principios. Me gustaría que la textura se repita para que tenga rayas consistentes en la línea sin importar cuánto tiempo haya crecido. – Piklor

+1

Sin sombreadores, no creo que pueda hacer esto sin calcular los coords ST por cuadro. Con sombreadores, necesitarás: - Codifica la dirección de la línea en el espacio modelo en tu malla. - En el sombreador de vértices, transfórmalo en coordenadas ojo-espacio. - Genere el mapa real de UV en espacio de pantalla (por píxel) - Gire el muestreo del mapa de UV por el vector de dirección de línea transformado (y normalizado). Baste decir que esto no es muy trivial si no está muy cómodo con las transformaciones de matriz y los espacios de coordenadas. :-( –

+1

Además, es posible que desee ver en esto: http://homepage.mac.com/arekkusu/bugs/invariance/HWAA.html Parece que una gran cantidad de GPU de consumo no hacer punteado bajo una variedad de condiciones. Para punteado horizontal y vertical (uno de los pocos casos que se obtienen a la derecha) basta con proyectar un tablero de ajedrez que repita la textura. –

3

Si todo lo que quiere es dibujar líneas punteadas, simplemente cambie de GL_LINE_STRIP a GL_LINES. De esta forma, GL abierto conectará los vértices 1 & 2, 3 & 4, 5 & 6, pero no 3 & 4, o 4 & 5 dejando espacios allí.En esencia, será una línea punteada de media/media relación - el equivalente aproximado de glLineStipple (1, 0101);

IE: en la matriz vértice

[0,0,1,1,2,2,3,3,4,4,5,5,6,6]

OpenGL se conectará (0,0) a (1,1), pero no se conectará (1,1) a (2,2) [mientras que con GL_LINE_STRIP]. Luego se conectará (3,3) a (4,4), pero NO (4,4) a (5,5). La conexión final será (5,5) a (6,6).

Esto es lo que parece cuando lo hice:

Dotted Lines on Android

La línea de puntos no es 50/50/vacío porque en mi caso, que representa la posición de una entidad juego de juego de cada cuadro - y los marcos de los juegos no son necesariamente todos de igual longitud, por lo tanto, la línea inconsistente: relación espacial.

El código es el siguiente dibujarlo:

pública void draw (gl GL10) { gl.glDisable (GL10.GL_TEXTURE_2D);

gl.glColor4f(color[0], color[1], color[2], color[3]/fade); 
      //pointsBuffer holds the points on the line 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, pointsBuffer); 

    gl.glDrawArrays(GL10.GL_LINES, 0, points.length/2); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 

}

Una idea alternativa para crear un punteado modelado más intencionalmente sería saltarse determinados vértices por lugar de dibujo con una matriz índices (glDrawElements). Sin embargo, no tengo un ejemplo de eso para mostrarte. :/

Cuestiones relacionadas