상세 컨텐츠

본문 제목

OpenGL glPolygonMode()와 glCullFace()

프로그래밍 관련/3D,2D DRAW 관련

by AlrepondTech 2017. 8. 18. 17:31

본문

반응형





OpenGL을 쓰고 항시 API를 쓰고 다시 해제해주어야 하는 API들은 해제 해주는것을 잊지 마세요 

예로들어 wglMakeCurrent(...)로 들자면 


HDC   hdc    = getHDC();

HGLRC hglrc = getHGLRCRES_GL();


::wglMakeCurrent(hdc, hglrc); //사용


///////////////////////////////////////////////////////////
//{랜더링 코드들

..................................................................

//}
///////////////////////////////////////////////////////////

::wglMakeCurrent(NULL, NULL);  //::wglMakeCurrent(hdc, NULL);  //해제



위와같이 wglMakeCurrent(...) 랜더링 부분에 Api 사용과 해제 부분을 제대로 하지 않으면 다른 

위치의 wglMakeCurrent(...) 를 사용시 문제가 생길수 있습니다.





////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



출처: http://diehard98.tistory.com/m/entry/glPolygonMode%EC%99%80-glCullFace



OpenGL에서 폴리곤 (다각형)은 앞면과 뒷면이 존재한다. glPolygonMode() 함수를 이용하면 앞면과 뒷면을 어떻게 그릴 것인지 설정할 수 있다.


glPolygonMode(GLenum face, GLenum mode); 
- face 인자로 올수 있는 것은 GL_FRONT_AND_BACK, GL_FRONT, GL_BACK 등이 있고 mode 인자로 올수 있는 것은 GL_POINT, GL_LINE, GL_FILL 등이 있다.

첫번째 인자로 앞면과 뒷면 혹은 앞뒤 둘 다에게 두번째 인자로 오는 mode를 적용하게 된다. 뭐, mode 인자로 올 수 있는 것들은 상식적으로 이해 가능한 놈들이다. 포인트로 그릴거냐 선으로 그릴거냐, 아니면 채워넣을 거냐...




 





첫번째 그림은 원뿔인데 정상적으로 보인다. 이 경우 glPolygonMode의 두번째 인자를 GL_FILL로 주었기 때문에 밑을 구성하는 원이 제대로 그려졌다. 헌데 만약 GL_LINE을 주게 되면 아래를 구성하는 원이 선으로 그려지게 되고 아래 그림처럼 뻥 뚫린것 처럼 보이게 된다.

또 다른 함수인 glCullFace는 앞면과 뒷면을 '파낼것' 인가 말것인가를 지정한다. '파낸다'라는 말이 우습게 들릴수도 있다... 나는 처음에 들었을때 코파냐... 라고 생각했었따. -_-

예를 들어 벽돌을 그린다고 해보자. 벽돌 안은 절대 보일 일이 없다. 고로 벽돌을 구성하는 6개의 폴리곤 (사각형) 들은 보여질 면만 그리면 된다. 안보여질 부분은 안그리는게 속도 향상에 도움이 된다. 고로 glCullFace 함수로 그걸 지정해준다 이말이다. 

다만 주의 할 것은 이 함수를 불러내서 사용하기 전에 반드시 glEnable(GL_CULL_FACE) 함수를 먼저 호출하여 '파내기' 상태를 YES로 변경해야 한다.

고로 예를 들어 보여지지 않을 후면을 모두 파내버리고 싶다면,
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
이라 하면 오케 바리 바리 발바리..

한가지 짚고 넘어갈 점은 시계방향 (CW)와 반시계방향(CCW)에 대한 것인데 일반적으로 모든 폴리곤 삼각형은 반 시계 방향이 정면이다. 즉, CCW (Counterclock wise)가 Front Facing Polygon 이라는 말이다. 그래서 Vertex (점)을 공간상에 찍어서 사각형을 그려낼때 항상 반시계 방향으로 그려주게 된다.

하지만 '나는 시계 방향 주의자야!' 라고 하는 분들은 이것을 glFrontFace() 함수를 이용해 변경할 수 있으나, 필요하다면 사용하겠지만 최대한 피할 수 있다면 피하는게... 



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

반응형


관련글 더보기

댓글 영역