2012-02-21 4 views
4

OpenGL에서 키홀을 통해 보는 효과를 시뮬레이션 할 수 있는지 궁금합니다.OpenGL에서 원으로 클립하는 방법

나는 내 3D 장면을 그렸지만 중앙 원형을 제외한 모든 것을 검정색으로 만들고 싶습니다. ...

// here i draw my 3D scene 

// Begin 2D orthographic mode 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 

GLint viewport [4]; 
glGetIntegerv(GL_VIEWPORT, viewport); 

gluOrtho2D(0, viewport[2], viewport[3], 0); 

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// Here I draw a circle in the center of the screen 
float radius=50; 
glBegin(GL_TRIANGLE_FAN); 
glVertex2f(x, y); 
for(int n = 0; n <= 100; ++n) 
{ 
    float const t = 2*M_PI*(float)n/(float)100; 
    glVertex2f(x + sin(t)*r, y + cos(t)*r); 
} 
glEnd(); 

// end orthographic 2D mode 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 
glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

는 내가 얻을 것은 중앙에 그려진 원이지만, 나는 그것의 보완을 얻기 위해 싶습니다

나는이 솔루션을 시도했지만 그 일을 완전히 반대를 내가 원하는

답변

6

OpenGL의 다른 모든 기능과 마찬가지로이 작업을 수행 할 수있는 몇 가지 방법이 있습니다. 여기 내 머리 꼭대기 두 개가있다.

를 사용하여 원 텍스처 : (권장)

  1. 장면을 그립니다.
  2. 직교 투영으로 전환하고 가운데에 흰색 원이있는 텍스처를 사용하여 전체 화면에 4 분의 1을 그립니다. 적절한 블렌딩 기능을 사용

    glEnable(GL_BLEND); 
    glBlendFunc(GL_ZERO, GL_SRC_COLOR); 
    /* Draw a full-screen quad with a white circle at the center */ 
    

또는, 당신은 원형을 생성하기 위해 픽셀 쉐이더를 사용할 수 있습니다.

사용 스텐실 테스트 :은 (권장하지 않음, 그러나 당신이 텍스처 나 쉐이더가없는 경우에 더 쉬울 수도 있습니다)

  1. 취소 스텐실 버퍼, 그리고 그것으로 원을 그립니다.

    glEnable(GL_STENCIL_TEST); 
    glStencilFunc(GL_ALWAYS, 1, 1); 
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
    /* draw circle */ 
    
  2. 씬의 나머지 부분에 대한 스텐실 테스트를 활성화하십시오.

    glEnable(GL_STENCIL_TEST) 
    glStencilFunc(GL_EQUAL, 1, 1); 
    glStencileOp(GL_KEEP, GL_KEEP, GL_KEEP); 
    /* Draw the scene */ 
    

각주 : 난 당신의 코드에서 어떤 시점에서 즉시 모드의 사용을 피하고, 대신 배열을 사용하는 것이 좋습니다. 이렇게하면 코드의 호환성, 유지 보수성, 가독성 및 성능이 향상되어 모든 분야에서 승리 할 수 ​​있습니다.

+0

나는 두 번째 방법을 해결했습니다. 이것은 필요한 자료입니다. http://en.wikibooks.org/wiki/OpenGL_Programming/Stencil_buffer "즉각적인 모드"란 무엇을 의미하는지 이해하지 못합니다. glVertex2f 및 다른 프리미티브의 사용을 의미합니까? – linello

+0

예, 'glVertex2f'와 그 친구는 즉각적인 모드입니다. 대신에'glVertexPointer' /'glDrawArrays' /'glDrawRangeElements' 등을 사용하는 것이 좋습니다. 'glVertex2f'를 과거 시대의 고대 유물로 생각하고'glVertexPointer'를 "옛날 방식"으로 생각합니다 (그러나 오래된 것은 아닙니다). –

+0

팁 주셔서 감사합니다! – linello

관련 문제