2008-10-22 7 views

답변

0

데스크톱에서는 아무런 문제가 없으므로 CoreImage를 사용하십시오.

그러나 CoreGraphics를 사용하여 전화를 걸 수있는 방법이 있다고 생각하지 않습니다. OpenGLES가 절대적으로 비판적 일 수 있다면 도움이 될 것입니다.

그러나 인터페이스를 다시 생각해 보시기 바랍니다. 흐리게 표시된 텍스트가 혼란 스럽다고 생각합니다.

편집 : mledford는 CoreAnimation을 사용할 수 있다는 의견을 지적합니다. 휴대 전화의 CA가 바탕 화면과 같이 흐려지는 반경을 포함하는지 여부는 알 수 없지만 시도해 볼 수는 있습니다.

+0

콜린, 당신은이를 구축하는 코어 애니메이션 레이어를 사용하지 수 있을까? 그다지 권장하지 않습니다 ... 흐림 필터로 레이어를 만든 다음 다른 레이어를 위에 합성합니다. –

+0

확인 했어야합니다. :-(CALayer 속성 필터에 대한 문서 발췌 "특별 고려 사항 CALayer 클래스가이 속성을 노출하는 동안 Core Image는 iPhone OS에서 사용할 수 없으며 현재이 속성에 사용할 수있는 필터는 정의되지 않았습니다." –

+0

Michael의 의견에 감사드립니다. –

1

iPhone OS는 내가 아는 핵심 이미지 필터를 제공하지 않습니다. 그렇지 않으면 예, 필터링 된 CALayer가 올바른 방법 일 것입니다. NSBitmapImageRep을 사용할 수 있다면 텍스트를 드로잉하고 이미지를 축소 (다운 샘플링) 한 다음 이미지를 다시 확대 (업 샘플링)하여 원시 블러를 만들 수 있습니다. 불행히도 누락 된 것 같습니다. 플래시에서 텍스트가 흐릿 해 보이는 것을 보았습니다. 마지막으로 확인한 결과 픽셀 수준의 필터링은 없습니다. 당신은 그것에 대한 튜토리얼을 찾고 Cocoa Touch에 적응할 수있는 것을 볼 수도 있습니다.

0

알파 레이어를 사용하면 성능이 저하됩니다. 가능한 경우 다른 방법을 고려하십시오 (어쩌면 텍스트를 사전 조합하여 여러 레이어 대신 그래픽으로 병합 할 수도 있습니다).

성능을 시험하고 수용 가능한지 보려면 Instruments를 사용하십시오. 스크롤보기로 스크롤하면 으로 스크롤됩니다.

9

Apple의 GLImageProcessing iPhone 샘플을 살펴보십시오. 그것은 무엇보다도 흐리게 처리합니다.

관련 코드가 포함

static void blur(V2fT2f *quad, float t) // t = 1 
{ 
    GLint tex; 
    V2fT2f tmpquad[4]; 
    float offw = t/Input.wide; 
    float offh = t/Input.high; 
    int i; 

    glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex); 

    // Three pass small blur, using rotated pattern to sample 17 texels: 
    // 
    // .\/.. 
    // ./\\/ 
    // \/X/\ rotated samples filter across texel corners 
    // /\\/. 
    // ../\. 

    // Pass one: center nearest sample 
    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_MODULATE); 
    glColor4f(1.0/5, 1.0/5, 1.0/5, 1.0); 
    validateTexEnv(); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    // Pass two: accumulate two rotated linear samples 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
    for (i = 0; i < 4; i++) 
    { 
     tmpquad[i].x = quad[i].s + 1.5 * offw; 
     tmpquad[i].y = quad[i].t + 0.5 * offh; 
     tmpquad[i].s = quad[i].s - 1.5 * offw; 
     tmpquad[i].t = quad[i].t - 0.5 * offh; 
    } 
    glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &tmpquad[0].x); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glActiveTexture(GL_TEXTURE1); 
    glEnable(GL_TEXTURE_2D); 
    glClientActiveTexture(GL_TEXTURE1); 
    glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &tmpquad[0].s); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,  GL_INTERPOLATE); 
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,   GL_TEXTURE); 
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,   GL_PREVIOUS); 
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB,   GL_PRIMARY_COLOR); 
    glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB,  GL_SRC_COLOR); 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,  GL_PRIMARY_COLOR); 

    glColor4f(0.5, 0.5, 0.5, 2.0/5); 
    validateTexEnv(); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    // Pass three: accumulate two rotated linear samples 
    for (i = 0; i < 4; i++) 
    { 
     tmpquad[i].x = quad[i].s - 0.5 * offw; 
     tmpquad[i].y = quad[i].t + 1.5 * offh; 
     tmpquad[i].s = quad[i].s + 0.5 * offw; 
     tmpquad[i].t = quad[i].t - 1.5 * offh; 
    } 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    // Restore state 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glClientActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, Half.texID); 
    glDisable(GL_TEXTURE_2D); 
    glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB,  GL_SRC_ALPHA); 
    glActiveTexture(GL_TEXTURE0); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glDisable(GL_BLEND); 
} 
+0

간단한 코코아 터치 응용 프로그램에서 openGL ES보기를 사용하지 않고도 OpenGL ES를 사용할 수 있다고 가정하는 것이 맞습니까? 해당 블러 필터링에만 openGL을 사용할 수 있습니까? 출력을 UIImage에 쓸 수 있습니까? –

+0

아니요, 코드를 보았을 때 약간의 EAGLView와 glview를 회상하는 것 같습니다. 위의 코드보다 훨씬 멋진 흐림을 생성하는 다음 URL에서 코드를 실험하고 있습니다. http://incubator.quasimondo.com /processing/fast_blur_deluxe.php – mahboudz

+0

그것은 진부한 것이 아닙니다. t,하지만 UILabels 또는 텍스트를 흐리게 처리하기 만하면됩니다. – mahboudz