Colori che mappano una trama in opengl
Domanda
Sto mostrando una trama che voglio manipolare senza influenzare i dati dell'immagine. Voglio essere in grado di bloccare i valori di texel in modo che qualsiasi cosa al di sotto del valore inferiore diventi 0, qualsiasi cosa al di sopra del valore superiore diventi 0 e qualsiasi cosa tra sia mappata linearmente da 0 a 1.
Inizialmente, per visualizzare la mia immagine stavo usando glDrawPixels. E per risolvere il problema sopra vorrei creare una mappa dei colori usando glPixelMap. Questo ha funzionato magnificamente. Tuttavia, per motivi di prestazioni ho iniziato a utilizzare le trame per visualizzare la mia immagine. L'approccio glPixelMap sembra non funzionare più. Beh, questo approccio potrebbe funzionare ma non sono riuscito a farlo funzionare.
Ho quindi provato a utilizzare glPixelTransfer per impostare scale e distorsioni '. Questo sembrava avere una sorta di effetto (non necessariamente quello desiderato) al primo passaggio, ma quando i vincoli superiore e inferiore sono stati modificati nessun effetto era visibile.
Mi è stato poi detto che gli shader di frammenti avrebbero funzionato. Ma dopo una chiamata a glGetString (GL_EXTENSIONS), ho scoperto che GL_ARB_fragment_shader non era supportato. Inoltre, una chiamata a glCreateShaderObjectARB provoca un'eccezione nullreference.
Quindi ora sono in perdita. Cosa dovrei fare? Per favore, aiutate.
Qualunque cosa possa mai funzionare, sono disposto a provare. Il fornitore è Intel e il renderer è Intel 945G. Sono purtroppo limitato a una scheda grafica integrata sulla scheda madre e ha solo gl 1.4.
Grazie per la tua risposta finora.
Soluzione
A meno che tu non abbia una scheda grafica piuttosto vecchia, è sorprendente che tu non abbia il supporto per lo shader di frammenti. Ti suggerirei di provare a ricontrollare utilizzando questo .
Inoltre, sei sicuro di voler che qualcosa al di sopra del valore massimo sia 0? Forse intendevi 1? Se intendevi dire 1 e non 0, allora sono modi piuttosto lunghi per fare ciò che stai chiedendo.
La risposta sintetica è che si utilizzano più passaggi di rendering. Per prima cosa esegui il rendering dell'immagine a intensità normale. Quindi si utilizza la fusione sottrattiva (cercare glBlendEquation) per sottrarre il valore minimo. Quindi usi la miscelazione additiva per moltiplicare tutto per 1 / (max-min) (che potrebbe richiedere passaggi multipli).
Se vuoi davvero farlo, ti preghiamo di postare GL_VENDOR
e GL_RENDERER
per la tua scheda grafica.
Modifica: Hmm. Intel 945G non ha ARB_fragment_shader
, ma ha ARB_fragment_program
che farà anche il trucco.
Il tuo frammento di codice dovrebbe assomigliare a questo (ma è passato un po 'di tempo da quando ne ho scritto uno, quindi è probabilmente infastidito)
!!ARBfp1.0
ATTRIB tex = fragment.texcoord[0]
PARAM cbias = program.local[0]
PARAM cscale = program.local[1]
OUTPUT cout = result.color
TEMP tmp
TXP tmp, tex, texture[0], 2D
SUB tmp, tmp, cbias
MUL cout, tmp, cscale
END
Lo carichi in OpenGL in questo modo:
GLuint prog;
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glGenProgramsARB(1, &prog);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);
Quindi, prima di eseguire il rendering della geometria, eseguire questa operazione:
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
colour4f cbias = cmin;
colour4f cscale = 1.0f / (cmax-cmin);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a);
//Draw your textured geometry
glDisable(GL_FRAGMENT_PROGRAM_ARB);
Altri suggerimenti
Verifica anche se l'estensione GL_ARB_fragment_program
è supportata. Tale estensione supporta i programmi di frammento di stile ASM. Ciò dovrebbe essere supportato in OpenGL 1.4.
È davvero un peccato che tu stia usando una versione così antica di OpenGL. Puoi effettuare l'upgrade con la tua carta?
Per un OGL 2.x più moderno, questo è esattamente il tipo di programma per GLSL. Grande documentazione può essere trovata qui: