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.

È stato utile?

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:

Documentazione OpenGL

OpenGL Shading Langauge

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