영화 “괴물”을 보고

반미 영화이다.. 아니다.. 하는데, 영화 “괴물”은 분명 반미 영화가 맞다. 하지만 일부러이든, 아니든… 어설픈 반미 영화이다. 사회학과를 나온 감독 봉준호의 대가리에서 어설픈 설정은 다소 이해하기 힘든점을 감안할때 다분이 의도된 일부러의 “어설픈” 반미 영화가 아닌가 싶다.

이 영화의 압권은 영화 초반에 괴물이 한강둔치에서, 그것도 벌건 대낮에 인간 먹이 사냥을 멋드러지게 하는 것인데… CG 효과이긴 하겠지만 정말 잘~ 만들었다!! 라는 느낌은 모두다 공감할 것이다.

혹자는 마지막 장면에서 남주(배두나)의 火활에 맞아 괴물이 불에 타는 장면이 어설펐다는 것에 실망했다는데, 내 소견으로는 그 정도면 꾀나 잘만들었다고 생각한다. 휘발위에 온몸이 적셔진 괴물에 불을 붙이면 영화에서 그러한 불이 붙게 된다. 활~ 활 타오는 불이 붙지 못한다. 특히나 이미 괴물은 물에 충분이 젖셔진 상태에서 불이 붙었기 때문에 활활 타오르지 못한다. 감독 봉준호의 괴물에 대한 불타는 불꽃 효과의 선정에 대한 탁월한 감각에 갈채를 보낸다. 우연이든.. 우연이 아니든말이다….

영화를 감상하며 강두(송강호)의 머저리 같은 역에 화가 났다. 효자동 이발사의 주연으로 나왔던 무기력하고 머저리 같은 송강호. 비록 이 두영화가 감독은 달랐지만 어쩜 그리 머지리 같고 무기력하기는 똑 같았을까… 제발 다음 역에서는 조금이라도 스마트한 면모를 보여줬음 좋겠다. 살인의 추억에서 송강호는 어땠난 회상해 본다. 그러고 보니 살인의 추억에서와 괴물에서 박해일이 등작한다. 살인의 추억에서의 박해일은 강간살인범으로써 등장하고 괴물에서는 흔해빠진 4년제 대학을 나와서 백수로 놀고 먹으며 사회를 비관하며 술에 찌들어 사는 놈팽이로 나오지만 강한 자기 주관을 가진 한 멋진(?) 사내로 등장한다. 막판에 괴물에게 화염병을 멋드러지게 던질때 마지막 찰라에 왠 삑사리 쇼를 보여주는 바람에 베리긴 했지만 말이다. 덕분에 남주(배두나)의 멋진 양궁 실력에 우리의 괴물이 최후를 맞이 했다!

이 영화에서 괴물의 의미는 과연 무엇일까? 용산미군기지에 있는 미군 군의관의 지시에 한국인이 포르말린 수십(수백?) 병을 하수구에 방류시킴으로써 한강에 건대한 돌연변이 도룡용(?)이가 생겨난다는 설정이다. 여기서 괴물은 간접적으로는 미군의 찌질이 군위관에 의해 탄생했지만 직접적으로 한국인에 의해 탄생한 것이다. 이후에 세계에서는 한국에서는 자체적으로 괴물을 처지하지 못한다는 결론을 내리고는 다시 미국의 엘로(Yellow)..? 머시기를 사용해서 괴물을 처치하려고 하는데, 많은 시민들이 환경을 엄청나게 훼손시키는 이 엘로 머시기의 사용을 반대한다. 미국에서 (상당한 압박의) 제안을 했을 것이지만, 그 선택은 자국 한국의 선택이였다. 결과적으로 이 머시기를 투하해서 괴물의 잠시 무기력하게 만들긴 했지만… 영화에서 보듯 그 머시기로 인해 그 근처의 사람들의 구멍이란 구멍에서는 피가 나더라… 이 영화를 보면서 괴물의 탄생과 환경 오염에 대한 탓을 미국에 돌릴 수는 있겠지만… 이 모든 최종적인 선택인 우리 한국인들의 몫이다. 그 어떤것도 탓할 것은 없다. 최소한 이 영화에서는 말이다. 제발 탓하지 말자… 쓰잘데기도 없는 남탓은 말이다..

가족의 아버지 박희봉(변희봉님 역)의.. 뭘랄까…. 정부에 대한 복종적이고 헌신적인 모습을 보인, 하지만 가족중에 가장 처음 괴물에게 죽임을 당하고야 마는.. 그리고 두째 아들 남일(박해일)의 제법 스마트한 활약.. 하지만 선배로부터의 현상금에 대한 욕심으로 배신을 당하기는 하지만… 여튼 그의 활약을 통해 딸 남주(배두나).. 정말 영화에서 배두나는 이뻤다.. 난 왜 이런 스턀의 여자 배우에게 끌리는 걸까.. 어찌 되었든 그녀의 불타는 마지막 활시위에 의해 괴물은 불에 타게 되고.. 불에 타 괴로워 하는 괴물은 불을 끄기 위해 다시 한강속으로 뛰어 들려고 하지만 역시.. 주인공 중에 주인공 강두(송광호)의 제지로 끝내 괴물은 입수를 할 수 없게 되어 죽게된다…. 여기서 이 영화에서 주목해야할 점은 일련의 모든 괴물 퇴치의 액션은 군, 경찰, 정부가 아닌 힘도 없을 것같은 한 가족에 의해 이루어 진다는 점이다. 가족… 딸.. 조카… 손녀가 괴물에게 납치되었고 살아있다는 희망속에서, 그 엄청난 무언가의 힘… 감히 사랑이라는 힘으로 괴물을 처치한 것이다.

감독 봉준호가 말하고자 하는 것은 무엇인가… 반미. 하지만 (일부러) 어설프게 반미에 대한 상황을 펼쳐 놓았다. 그리고 가족. 한강 둔치에서 매점이나 하면서 그저 한없이 보통스럽기만 한.. 하루 하루를 살아가는 가족… 어느 누구, 어느 단체의 도움.. 도움은 커녕 방해만 받기 일수였다.. 이런 상황에서 한 가족은, 한 가족 구성원을 구출해 내기 위해서 목숨을 걸고 괴물과 맞서 싸우는 것이다. 감독 봉준호가 말하는 것은 보일듯 말듯… 않보이는 그만인… 이미 누구나 다 아니까.. 하는 미국에 대한 책망은 그 뒤로 하고라도….. 그가 보여주고 싶은 것은 가족에 대한 절실한 사랑이였다. 가족에 대한 사랑…… 진정 그가 보여주고 싶었던 것은 말이다..

놀고 있는 비디오 메모리 활용

비디오 카드의 메모리의 용량은 적게는 32M에서 256M 정도 된다. 흔히 128M 정도의 카드가 많이 사용된다. 이 많은 비디오 카드의 메모리는 렌더링의 속도를 향상 시키기 위해서 3차원 그래픽 프로그램에서 사용된다. 하지만 3차원 그래픽 프로그램이 구동되지 않을 경우 대부분의 비디오 카드 메모리는 사용되지 않고 낭비된다. 예를들어 필자의 경우 해상도 1280×1024에서 32비트 색상을 사용하고 비디오 카드의 메모리는 128M이므로 128M에서 약 5M를 뺀 약 120M 정도의 비디오 메모리가 놀고 있는 셈이다.

그렇다면 이렇게 낭비되는 비디오 카드의 메모리를 3D 그래픽의 사용 목적이 아닌 일반 메모리처럼 사용할 수는 없을까? 게다가 비디오 카드의 메모리는 일반 메모리에 비해서 그 속도가 훨씬더 빠르다는 장점이 있지 않은가?

비디오 메모리를 사용하기 위해서는 당연히 비디오 메모리에 접근할 수 있어야 한다. 비디오 메모리에 접근하기 위한 API가 필요한데, 접근을 위한 특별한 API 라이브러리를 사용하는게 아니라 OpenGL과 DirectX의 API를 사용하면 되겠다. 여기서 필자에게 익숙한 OpenGL API를 사용하도록 하겠다.

비디오 메모리와 관련된 OpenGL API는 다음과 같다.

– glBindBuffer
– glBufferData
– glBufferSubData
– glDeleteBuffers
– glGenBuffers
– glMapBuffer
– glUnmapBuffer

위의 API는 ARB 군에 속해 있다가 OpenGL 1.5부터는 표준으로 안착되었다. 즉, OpenGL 1.5 이전에는 위의 함수명에다 접미사격으로 ARB를 붙여 사용해야 한다. 예를 들어서 glBindBuffer의 경우 glBindBufferARB 처럼 말이다. 물론 ARB의 경우는 Extension이므로 지원하는지의 여부를 먼저 확인해야 할 것이다. 확인을 위한 문자값은 GL_ARB_vertex_buffer_object이다.

각 함수의 내용에 대한 설명은 생략하고 사용하는 방법에 대해서만 살펴보겠다. 먼저 OpenGL을 초기화하고 현재 그래픽 카드가 지원하고 있는 OpenGL의 버전이 1.5 이상인지를 확인해야 한다. 여기서 한가지 문제점이 있는데, 그것은 바로 OpenGL의 초기화이다. OpenGL을 초기화하지 않으면 해당 API의 진입점을 찾지 못한다. 하지만 3D 기능을 사용하지도 않을 것인데, OpenGL을 초기화하해야한다는 것은 어쩌면 큰 부담이다. 특히 Console 프로그래밍과 같은 경우 렌더링 창에 대한 DC를 얻어와야 OpenGL을 초기화할 수 있는데, 이런 경우에 필자는 바탕화면의 DC를 사용하였다. 초기화를 위해 바탕화면의 DC를 사용하였을뿐, 실제로 무엇인가 렌더링하지는 않았기때문에 별 문제는 없으리라 본다.

어찌되었든 OpenGL을 초기화하고 OpenGL의 버전이 1.5 이상인 경우 위의 API의 진입점 포인트를 성공적으로 얻어왔다면 이제 사용하는 일만 남았다.

사용하는 방법은 정말 간단하다. 일반 메모리의 포인터를 얻어와 사용하는 방법과 유사하기 때문이다.

먼저 glGenBuffers를 사용하여 비디오 카드 메모리 버퍼의 ID를 생성하고 이 메모리 버퍼를 GL_ARRAY_BUFFER와 묶기 위해 glBindBuffer 함수를 사용한다. 그 후에 glBufferData를 사용하여 실제 비디오 메모리를 원하는 크기만큼 할당하는데 이 경우 가장 빠른 속도를 위해 GL_STATIC_DRAW를 사용하였다. 할당할 메모리의 크기는 자신이 사용하는 비디오 카드의 메모리의 크기를 잘 고려해서 지정하기 바란다. 여기까지 성공하였다면 할당 받은 비디오 카드의 메모리를 일반 메모리의 포인터처럼 사용하기 위해 메모리 주소값으로 Mapping 시키기 위해 glMapBuffer함수를 사용하여 포인터 주소를 얻어 온다. 바로 이 포인터 주소를 사용해서 일반 메모리와 똑같이 사용할 수 있는 것이다.

위의 코드는 실제로 비디오 카드의 메모리를 마치 일반 포인터의 개념처럼 사용하는 예를 든 것이다.

이제는 이렇게 사용한 비디오 카드의 메모리를 해제시키는 방법은 다음 코드와 같다.

필자가 시험삼아 10M의 메모리를 비디오 카드에 할당해 사용하는 방법과 일반 메모리에 new 연산자를 이용해 힙에 할당해서 사용하는 방법의 속도 차이를 비교해본 결과 약 3배정도의 속도 향상이 있음을 발견했다.

끝으로 이런 비디오 카드의 메모리의 속도의 장점을 잘활용한다면 빠른 속도를 요구하는 코드에 더욱 좋은 성능 향상을 꾀할 수 있을 것이다. 또한 비디오 메모리의 경우 일반 메모리에 비해 외부의 어플리케이션으로부터의 메모리 해킹이 어렵기 때문에 보안적인 면에서도 좋은 이점이 있을 것으로 생각된다.