2009-10-01 11 views
6

Quiero cambiar el brillo y contraste de una textura en el iPhone. He estado buscando en la muestra provista por Apple (GLImageProcessing) pero solo puede hacer una a la vez (llamando a ambos métodos en la muestra sobrescribe el resultado anterior).Aplicación de brillo y contraste con OpenGL ES

Brillo funciona muy bien:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
if (brightness >= 1.0f) { 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); 
    glColor4f(brightness-1, brightness-1, brightness-1, brightness-1); 
} else { 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); 
    glColor4f(1-brightness, 1-brightness, 1-brightness, 1-brightness); 
} 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

cómo iba a ir con la adición de contraste con la textura después de esto? Alternativamente, ¿sería una mejor opción pasar a OpenGL ES 2.0 y hacer esto con sombreadores?

Aquí está el código para el contraste en la muestra de manzana:

glActiveTexture(GL_TEXTURE0); 
glVertexPointer (2, GL_FLOAT, sizeof(V2fT2f), &quad[0].x); 
glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &quad[0].s); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 

glActiveTexture(GL_TEXTURE1); 
glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA); 
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); 

glColor4f(h, h, h, 0.75 - 0.5 * h); // 2x extrapolation 
validateTexEnv(); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Restore state 
glDisable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1); 
glActiveTexture(GL_TEXTURE0); 

Como es fácil adivinar mi experiencia con OpenGL (ES) es bastante limitado así que cualquier cosa que me apunta en la dirección correcta es muy apreciada

+0

Hola Antti, le parecieron una solución a su problema? Me gustaría saber también. ¡Gracias de antemano! –

Respuesta

7

Esto es mucho más fácil de hacer con un sombreador de fragmentos, al menos en OpenGL 2.1 (no he usado OpenGL ES). El libro "OpenGL Shading Language" cubre el procesamiento de imágenes en el capítulo 19. Proporcionan sombreadores para ajustar el brillo y el contraste. Aquí está mi versión, que combina los dos medio-y-media:

uniform sampler2D Texture; 
uniform float Brightness; 
uniform float Contrast; 
uniform vec4 AverageLuminance; 

void main(void) 
{ 
    vec4 texColour = texture2D(Texture, gl_TexCoord[0].st); 
    gl_FragColor = mix(texColour * Brightness, 
     mix(AverageLuminance, texColour, Contrast), 0.5); 
} 

Editar: algunos detalles más para completar ...

brillo y el contraste tienen un valor base de 1,0, por lo que pasa eso en ambos dejará la textura sin cambios. Un valor inferior a 1.0 disminuirá el brillo y un valor superior a 1.0 lo aumentará. Un valor inferior a 1.0 para el contraste hará que la textura sea más gris (menos contraste), y un valor mayor que 1.0 lo hará menos gris (más contraste).

Puede pasar (0.5, 0.5, 0.5, 1.0) por AverageLuminance para un valor de gris rápido y sucio, pero se obtendrán mejores resultados al calcular una luminancia promedio apropiada para su textura.

+0

Prefiero pegarme a OpenGL ES 1.1 (debido a la compatibilidad del dispositivo), que no es compatible con los sombreadores de fragmentos. ¿Alguna idea de hacer esto sin sombreadores? Gracias por esto, es bueno tener como copia de seguridad – Antti

+0

De nada. Me dio una buena excusa para jugar un poco más con sombreadores :-) Lo siento, probablemente no sea de mucha ayuda con una solución sin sombreador. Los combinadores de textura me dan dolor de cabeza en el mejor de los casos, y los de Apple son bastante horripilantes. –

0

Mi GL está un poco oxidado, pero a partir del código de muestra ambos crean una textura para combinar con la escena existente. Por lo tanto, es posible que solo pueda crear ambas texturas, asegurándose de que no se pisen una a la otra y luego fusionarlas en su lugar. Aunque están haciendo cosas diferentes, dudo que puedas combinarlos con la misma textura. Primero ordenaría el contraste ya que es una mezcla más complicada.

Cuestiones relacionadas