2009-10-01 89 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

你好安蒂, 你發現了一個解決您的問題?我也想知道。 在此先感謝! – 2010-01-09 16:31:20

回答

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的值將使其灰度更少(更多對比度)。

可以在(0.5,0.5,0.5,1.0)通作AverageLuminance一個快速和骯髒的灰度值,但更好的結果將通過計算適當的平均亮度爲你的紋理來獲得。

+0

我更喜歡堅持OpenGL ES 1.1(由於設備支持),它不支持片段着色器。有沒有着色器做這個想法?非常感謝您的支持 – Antti 2009-10-05 21:53:35

+0

不客氣。它給了我一個很好的藉口,可以更好地利用着色器:-)對不起,對於非着色器解決方案,我可能不會有太多幫助。紋理合成器在最好的時候給我頭痛,而那些蘋果產品非常可怕。 – 2009-10-07 03:22:25

0

我GL是有點生疏,但是從樣本代碼,這些都創造了質感與現有場景融爲一體。因此,您可以只創建紋理,確保他們不踐踏對方,然後融入地方他們兩人。他們正在做不同的事情,所以我懷疑你可以將它們結合在相同的紋理中。因爲這是一個更復雜的混合,所以我首先命令對比。