Pregunta

Tengo una aplicación VB6 (por favor, no se ría) que hace mucho dibujo a través de BITBLT y las funciones estándar de dibujo VB6. Me estoy encontrando contra los problemas de rendimiento (sí, hago los trucos regulares como dibujar a la memoria). Entonces, decidí investigar otras formas de dibujar, y he llegado a OpenGL.

He estado experimentando un poco, y parece sencillo hacer la mayor parte de lo que quiero; La aplicación en su mayoría solo usa un dibujo muy simple, rectángulos 2D relativamente grandes de colores sólidos y demás, pero no he podido encontrar un equivalente a algo como un cepillo de criadero o un cepillo de patrones.

Más específicamente, quiero poder especificar un pequeño patrón de píxel monocromo, elegir un color, y cada vez que dibujo un polígono (o lo que sea), en lugar de ser sólido, lo hice automáticamente con ese patrón, no traducido o girado o girado o girado o girado o girado o girado o girado o girado o girado sesgado o estirado, con los bits "en" del patrón que aparecen en el color especificado, y los bits "apagados" del patrón que queda que muestra lo que se había dibujado debajo del área en el que ahora estoy dibujando.

Obviamente podría hacer todos los cálculos yo mismo. Es decir, en lugar de dibujar como un polígono que de alguna manera se balanceará automáticamente para mí, podría calcular todas las líneas o píxeles o lo que realmente necesite dibujarse, luego dibujarlos como líneas o píxeles o lo que sea. ¿Pero hay una manera más fácil? Como en GDI, ¿dónde solo dices "Dibuja este polígono usando este pincel"?

Supongo que las "texturas" podrían lograr lo que quiero, pero no está claro para mí (soy totalmente nuevo en esto y la documentación que he encontrado no es del todo obvia); ¿Parece que las texturas podrían sesgar o traducir o estirar el patrón, en función de los vértices del polígono? Mientras que quiero el patrón mosaico.

¿Hay alguna manera de hacer esto, o algo así, aparte del cálculo de la fuerza bruta de exactamente los píxeles/líneas/lo que sea necesario?

Gracias de antemano por cualquier ayuda.

¿Fue útil?

Solución

Si entendí correctamente, estás buscando glpolygonstipple () o Gllinestipple ().

Polygonstipple es muy limitado, ya que permite solo un patrón de 32x32, pero debería funcionar como PatternBrush. Sin embargo, no tengo idea de cómo implementarlo en VB.

Otros consejos

En primer lugar, ¿estás seguro de que es la operación de dibujo la que es el cuello de botella aquí? Visual Basic es conocido por ser muy lento (Especialmente Si su programa se compila en el código VM intermediario, que es el AFAIRC predeterminado. ¡Asegúrese de verificar la opción de compilar el código nativo!), Y si es su código el que es el cuello de botella, OpenGL no lo ayudará mucho; deberá reescribir su código en algún otro idioma, probablemente c o C ++, pero cualquier Lang .NET también debería hacer.

OpenGL contiene funciones que le permiten dibujar líneas y polígonos punteados, pero no debe usarlas. Están en desuso durante mucho tiempo y se eliminaron de OpenGL en la versión 3.1 de la especificación. Y eso es por una razón: estas funciones no se mapean bien para el paradigma de renderizado moderno y no son compatibles con el hardware de gráficos modernos, lo que significa que lo más probable es que obtenga un lento Falta de software si los usa.

El camino a seguir es usar una pequeña textura como máscara, y mortalla sobre los polígonos dibujados. La textura se estirará o se comprimirá para que coincida con las coordenadas de textura que especifique con los vértices. Tienes que configurar el modo de envoltura en GL_REPEAT Para ambas coordenadas de textura y calcule las coordenadas correctas para cada vértice para que la textura aparezca en su tamaño original, repitió la cantidad correcta de veces.

También podría usar el búfer de plantilla como describió, pero ... ¿cómo llenaría ese búfer con el patrón y lo hagamos? rápido? Necesitarías una textura de todos modos. Recuerde que necesita borrar el búfer de plantilla en cada cuadro, antes de comenzar a dibujar. No hacerlo podría costarte un masivo HIT de rendimiento (el valor exacto de "masivo" dependiendo del hardware gráfico y la versión del controlador).

También es posible lograr el efecto deseado usando un sombreador de fragmentos, pero aprender sombreadores para eso sería una exageración para un principiante de OpenGL como usted :-).

¡Ah, creo que lo he encontrado! Puedo hacer una plantilla en toda la ventana gráfica en forma del patrón que quiero (o su máscara, supongo), y luego habilitar esa plantilla cuando quiero dibujar con ese patrón.

Podrías usar una textura. Pon el patrón como en la imagen y enciende la repetición de textura y estarás listo para comenzar.

Descubrí esto un Hace un año o dos.

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