2009-10-01 8 views
6

iPhone의 텍스처 대비 밝기를 으로 변경하고 싶습니다. 사과 (GLImageProcessing)에서 제공하는 샘플을보고 있었지만 한 번에 하나씩 만 수행 할 수 있습니다 (샘플의 두 메소드 모두를 호출하면 이전 결과를 덮어 씁니다).OpenGL ES에서 밝기와 대비 적용

밝기 좋은 작품 :

난이 후 질감에 대비를 추가로 갈 것 어떻게
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); 

? 아니면 OpenGL ES 2.0으로 이동하고 셰이더로이 작업을 수행하는 것이 더 나은 선택일까요? 여기

는 사과에서 샘플에 대비하기위한 코드이다 : 올바른 방향으로 날 포인트

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

당신은 아마는 OpenGL (ES) 내 경험을 추측 수 있듯이 꽤 아무것도 있도록 제한된다 크게

감사
+0

안녕하세요 안티, 당신이 찾았 죠 당신의 문제에 대한 해결책? 나는 또한 알고 싶다. 미리 감사드립니다. –

답변

7

적어도 OpenGL 2.1에서는 (OpenGL ES를 사용하지 않은) 프래그먼트 셰이더를 사용하는 것이 훨씬 쉽습니다. 책 "OpenGL 쉐이딩 언어"는 19 장의 이미지 프로세싱을 다루고 있습니다.이 쉐이더는 밝기와 대비를 조정하기위한 쉐이더를 제공합니다. 다음은이 반반을 결합 내 버전은 다음과 같습니다

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

편집 : 완성도에 대한 좀 더 자세한 내용은 ...

밝기 및 대비가 너무 통과, 1.0의 기본 값이

두 가지 모두에서 텍스처가 변경되지 않습니다. 1.0보다 작은 값은 밝기를 감소시키고 1.0보다 큰 값은 증가시킵니다. 대비가 1.0보다 작은 값은 텍스처를 더 회색으로 (대비가 덜), 1.0보다 큰 값으로 설정하면 회색이 적어집니다 (대비가 더 많음).

신속하고 더러운 회색 값에 대해 AverageLuminance를 (0.5, 0.5, 0.5, 1.0) 전달할 수 있지만 텍스처의 적절한 평균 휘도를 계산하면 더 나은 결과를 얻을 수 있습니다.

+0

조각 쉐이더를 지원하지 않는 OpenGL ES 1.1 (장치 지원으로 인해)을 선호합니다. 셰이더없이 이것을하는 것에 대한 어떤 생각? 이 고마워, 백업으로 가지고있어 좋은거야 – Antti

+0

당신은 오신 것을 환영합니다. 미안하지만, 셰이더를 사용하지 않는 솔루션에 많은 도움이되지는 않을 것입니다. 텍스쳐 컴 바이 너는 최고의 시간에 두통을 겪습니다. –

0

내 GL은 약간 녹슬었지만 샘플 코드에서이 둘은 기존 장면과 혼합되는 질감을 만듭니다. 따라서 텍스처를 모두 텍스처로 만들고 서로 밟지 않도록하고 다음 두 가지를 섞어서 만들 수 있습니다. 그들은 다른 일을하고 있습니다. 그렇기 때문에 같은 질감으로 결합 할 수 있을지는 의문입니다. 대비가 더 복잡하기 때문에 대비를 먼저 주문하겠습니다.

관련 문제