2008-10-24 8 views
2

J'affiche une texture que je veux manipuler sans affecter les données d'image. Je veux être en mesure de bloquer les valeurs de texel pour que tout ce qui est en dessous de la valeur inférieure devienne 0, tout ce qui est au-dessus de la valeur supérieure est 0 et 1.Couleur mappant une texture dans opengl

À l'origine, pour afficher mon image I utilisait glDrawPixels. Et pour résoudre le problème ci-dessus, je voudrais créer une carte de couleurs en utilisant glPixelMap. Cela a fonctionné magnifiquement. Cependant, pour des raisons de performances, j'ai commencé à utiliser des textures pour afficher mon image. L'approche glPixelMap ne semble plus fonctionner. Eh bien, cette approche peut fonctionner, mais je n'ai pas réussi à le faire fonctionner. J'ai ensuite essayé d'utiliser glPixelTransfer pour définir les échelles et les biais. Cela semblait avoir une sorte d'effet (pas nécessairement le désir) au premier passage, mais quand les contraintes supérieures et inférieures étaient changées, aucun effet n'était visible.

On m'a alors dit que les shaders fragmentaires fonctionneraient. Mais après un appel à glGetString (GL_EXTENSIONS), j'ai trouvé que GL_ARB_fragment_shader n'était pas supporté. De plus, un appel à glCreateShaderObjectARB provoque une exception nullreference.

Alors maintenant, je suis à perte. Que devrais-je faire? S'il vous plaît aidez.


Tout ce qui pourrait fonctionner, je suis prêt à essayer. Le fournisseur est Intel et le moteur de rendu est Intel 945G. Je suis malheureusement confiné à une carte graphique qui est intégrée sur la carte mère, et n'a que gl 1.4.

Merci pour votre réponse jusqu'à ce jour.

Répondre

2

À moins d'avoir une vieille carte graphique, il est surprenant que vous n'ayez pas de support fragment-shader. Je vous suggère d'essayer de double vérification en utilisant this.

Également, êtes-vous sûr de vouloir que la valeur 0 soit supérieure à la valeur maximale? Peut-être que vous vouliez dire 1? Si vous avez voulu dire 1 et non 0 alors sont des moyens assez longs pour faire ce que vous demandez.

La réponse condensée est que vous utilisez plusieurs passes de rendu. D'abord, vous rendez l'image à une intensité normale. Ensuite, vous utilisez un mélange soustractif (recherchez glBlendEquation) pour soustraire votre valeur minimale. Ensuite, vous utilisez le mélange additif pour multiplier tout en haut de 1/(max-min) (ce qui peut nécessiter plusieurs passes).

Si vous voulez vraiment faire cela, veuillez renvoyer les GL_VENDOR et GL_RENDERER pour votre carte graphique.

Édition: Hmm. Intel 945G n'a pas ARB_fragment_shader, mais il a ARB_fragment_program qui fera également l'affaire.

Votre fragment de code devrait ressembler à ceci (mais ça fait un moment que je l'ai écrit tout de sorte qu'il est probablement mis sur écoute)

!!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 

Vous chargez cela en OpenGL comme ceci:

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); 

Ensuite, avant de rendre votre géométrie, vous faites ceci:

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); 
0

Voir aussi si le GL_ARB_fragment_program extension est supportée.Cette extension prend en charge les programmes de fragment de style ASM. Cela est supposé être supporté dans OpenGL 1.4.

+0

GL_ARB_fragment_program est pris en charge. –

-1

Il est vraiment dommage que vous utilisiez une version aussi ancienne d'OpenGL. Pouvez-vous mettre à jour avec votre carte?

Pour un OGL 2.x plus moderne, c'est exactement le genre de programme pour lequel GLSL est. Grande documentation se trouve ici:

OpenGL Documentation

OpenGL Shading Langauge

+1

s'il dit qu'il est limité à 1,4, il est limité à 1,4. Le tenter avec quelque chose qu'il ne peut pas avoir est simplement méchant. – mmr

Questions connexes