Domanda

Ho un'applicazione VB6 (si prega di non ridere), che fa un sacco di disegno tramite BitBlt e il VB6 standard di funzioni di disegno. Sono in esecuzione contro i problemi di prestazioni (sì, faccio i trucchi regolari come disegnare a memoria). Così, ho deciso di indagare altri modi di disegno, e sono venuto su OpenGL.

Ho fatto alcuni esperimenti, e sembra semplice da fare la maggior parte di ciò che voglio; l'applicazione utilizza per lo più solo molto semplice disegno - relativamente grandi 2D rettangoli di tinte unite e quali -. ma non sono stato in grado di trovare un equivalente a qualcosa come un HatchBrush o PatternBrush

In particolare, voglio essere in grado di specificare un piccolo modello in bianco e nero di pixel, scegliere un colore, e ogni volta che disegnare un poligono (o qualsiasi altra cosa), invece di essere solido, farlo piastrelle automaticamente con quel modello, non tradotte o ruotata o inclinata o allungato, con il "on" bit del modello mostrando nel colore specificato, e il "fuori" bit del modello di sinistra visualizza tutto ciò che era stato redatto sotto l'area che ora sto disegnando su.

Ovviamente ho potuto fare tutti i calcoli io stesso. Cioè, invece di disegnare come un poligono, che in qualche modo automaticamente essere piastrellato per me, ho potuto calcolare tutte le linee o pixel o qualsiasi altra cosa che in realtà hanno bisogno di essere disegnato, poi disegnare come linee o pixel o qualsiasi altra cosa. Ma c'è un modo più semplice? Come in GDI, in cui basta dire "disegnare questo poligono di utilizzare questo pennello"?

sto indovinando che "texture" potrebbero essere in grado di realizzare quello che voglio, ma non è chiaro per me (io sono totalmente nuovo a questo e la documentazione che ho trovato non è del tutto ovvio); sembra trame potrebbe inclinare o tradurre o allungare il modello, in base ai vertici del poligono? Mentre io voglio il motivo a mosaico.

C'è un modo per fare questo, o qualcosa di simile, altro che la forza bruta calcolo esattamente pixel / linee / qualunque cosa che hanno bisogno di essere disegnato?

Grazie in anticipo per qualsiasi aiuto.

È stato utile?

Soluzione

Se ho capito bene, siete alla ricerca di glPolygonStipple () o glLineStipple () .

PolygonStipple è molto limitato in quanto consente solo 32x32 modello ma dovrebbe funzionare come PatternBrush. Non ho idea di come implementarlo in VB però.

Altri suggerimenti

Prima di tutto, sei sicuro che sia l'operazione di disegno in sé che è il collo di bottiglia qui? Visual Basic è noto per essere molto lento ( Specialmente se il programma viene compilato a intermediario codice VM -.!, Che è l'impostazione predefinita AFAIRC Assicurarsi di verificare la possibilità di compilare in codice nativo), e se è il codice che è il collo di bottiglia, quindi OpenGL non vi aiuterà molto - è necessario riscrivere il codice in qualche altra lingua -. probabilmente C o C ++, ma qualsiasi .NET lang dovrebbe anche fare

OpenGL contiene funzioni che consentono di disegnare linee punteggiato e poligoni, ma non si dovrebbe usare. Stanno deprecati per lungo tempo, e si sono rimossi dalle OpenGL nella versione 3.1 delle specifiche. E questo è per una ragione - queste funzioni non mappa bene al moderno paradigma di rendering e non sono supportati da hardware grafica moderna -. Che significa che molto probabilmente ottenere un lento software fallback se li usate

La strada da percorrere è quella di utilizzare una piccola texture come una maschera, e le mattonelle sopra i poligoni disegnati. La texture otterrà allungato o compresso per abbinare le coordinate della texture specificati con i vertici. È necessario impostare la modalità di avvolgimento a GL_REPEAT per entrambe le coordinate della texture, e calcolare le coordinate giuste per ogni vertice in modo che le appare trama nella sua dimensione originale, ripetono la giusta quantità di volte.

Si potrebbe anche usare lo stencil buffer, come hai descritto, ma ... come è possibile riempire quel buffer con il modello, e lo fa veloce ? Si avrebbe bisogno comunque una texture. Ricordate che è necessario cancellare lo stencil buffer di ogni fotogramma, prima di iniziare a disegnare. Non farlo potrebbe costare un massiccia calo di prestazioni (l'esatto valore di "massiccia" a seconda del hardware grafico e la versione del driver).

E 'anche possibile ottenere l'effetto desiderato utilizzando uno shader frammento, ma shader di apprendimento per questo sarebbe un eccessivo per un principiante OpenGL come te: -).

Ah, credo di aver trovato! Posso fare uno stencil su tutta la finestra a forma di modello che voglio (o la sua maschera, credo) e quindi attivare che stencil quando voglio disegnare con quel modello.

Si potrebbe utilizzare una texture. Mettere il modello in come in immagine e accendere texture ripetuta e siete a posto.

capito questo un un anno o due anni fa .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top