<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-931078517202405968</id><updated>2011-12-13T22:36:11.915+09:00</updated><category term='번역'/><category term='그래픽스'/><category term='konstruktor'/><category term='음악'/><category term='영화'/><category term='안드로이드'/><category term='게임'/><category term='개발'/><title type='text'>electroscape.ko</title><subtitle type='html'>rationality on top of blazing enthusiasm.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-3038942683857820573</id><published>2011-04-07T23:42:00.006+09:00</published><updated>2011-04-08T00:47:39.042+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='konstruktor'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>메쉬와 씨름하기</title><content type='html'>&lt;p&gt;요즘 Konstruktor 렌더링 엔진의 퀄리티를 개선하기 위한 방법을 생각하고 있습니다. 현재 퀄리티에서 가장 문제가 되는 부분은 쉐이딩입니다.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-j2lrSKzqqUU/TZ3SxKr9JeI/AAAAAAAAAKA/ATu3P7T-LdM/s1600/render.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 284px;" src="http://1.bp.blogspot.com/-j2lrSKzqqUU/TZ3SxKr9JeI/AAAAAAAAAKA/ATu3P7T-LdM/s320/render.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5592858054388164066" /&gt;&lt;/a&gt;&lt;p&gt;플랫 쉐이딩으로 인해 물체 표면이 각져 보입니다. 현재 LDraw의 스펙에서는 단순히 삼각형, 사각형을 그리기 위한 vertex들의 집합(mesh)만 정의되어 있고, surface normal을 정의하지 않습니다. 그래서 단순히 그 정점의 데이터만 가지고 surface normal을 뽑아내면 저런 식으로 물체가 각져 보이게 되는데, smooth shading을 하기 위해서는 인접한 삼각형과 사각형을 이루는 vertex가 가지는 surface normal 벡터들을 보간해야 합니다. 하지만 가장 큰 문제는 LDraw 파일의 스펙이 strictly declarative하지 않다는 것입니다. 그러다 보니 렌더러에서 정해진 파일 스펙 이상을 표현하기가 어렵게 되다 보니 현재 mesh를 인접한 것들끼리 서로 분류하기 위해서는 전체 파일 트리를 뒤지면서 메쉬를 재구성하는 절차가 필요해지게 되는데, 그 시점에서 고려해야 할 부분이 많은 꽤나 골치아픈 작업이 될 것 같습니다.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-UpewxeJVx1o/TZ3b_bAb9XI/AAAAAAAAAKI/R061mo9SJHA/s1600/render2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 163px;" src="http://4.bp.blogspot.com/-UpewxeJVx1o/TZ3b_bAb9XI/AAAAAAAAAKI/R061mo9SJHA/s320/render2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5592868194891855218" /&gt;&lt;/a&gt;&lt;p&gt;그리고 또 다른 문제가 있는데, 이 스크린샷에서는 일부 삼각형의 쉐이딩이 깨집니다. 파트 제작자의 실수인지는 모르겠지만 정점 순서가 잘못되어 surface normal이 인접 삼각형과 반대 방향으로 반전되어 생기는 문제입니다. 근본적으로는 렌더러의 문제가 아니라 파트 자체의 문제이나 메쉬 재구성 과정을 통해서 능동적으로 고칠 여지는 있습니다.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;일단 고려해야 할 부분은:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;메쉬 전체를 그루핑하면 안 됩니다. 원래부터 각진 표면이 있기 때문에 모든 정점에 대해 normal smoothing을 적용하면 안 됩니다. 일단 인접 삼각형, 사각형과의 각도를 재어서 threshold를 적당하게 주면 될 겁니다.&lt;/li&gt;&lt;li&gt;메모리 사용량을 최소화해야 합니다. 지금 LDraw 구조를 나이브하게 활용하면 중복되는 정점 데이터가 너무 많이 생깁니다. 메쉬를 재구성하는 김에 triangle, quad strip 등으로 재조립해서 중복되는 정점 데이터를 최소화해야 합니다.&lt;/li&gt;&lt;li&gt;그리고 이 모든 과정은 휴리스틱해야 합니다. triangle/quad strip을 만드는 문제도 그렇고 두번째 스크린샷의 normal 반전 오류를 고치는 등의 문제를 해결하기 위해서는 적절한 조건이 있어야 할텐데, 이건 조금 더 생각해봐야 할 문제인 것 같군요.&lt;/li&gt;&lt;li&gt;빨라야 합니다. part 데이터는 수시로 메모리에 적재되기 때문에 이 모든 메쉬 재구성 작업에 들어가는 시간은 최대한 적은 것이 좋을 겁니다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;사실 이런 것은 시중에 나와있는 대부분의 3D 소프트웨어가 기본으로 하는 일일텐데 공부하는 셈 치고 독자적으로 구현해 볼 생각입니다. 이 모든 작업을 위해서는 일단 자료구조부터 잘 설계해야 하는데, 조금 더 생각해보고 실제 구현해 본 다음에 이어서 포스팅하겠습니다. 아마 비슷한 걸 다루는 논문이라도 있는지 찾아봐야겠군요.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-3038942683857820573?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/3038942683857820573/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2011/04/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/3038942683857820573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/3038942683857820573'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2011/04/blog-post.html' title='메쉬와 씨름하기'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-j2lrSKzqqUU/TZ3SxKr9JeI/AAAAAAAAAKA/ATu3P7T-LdM/s72-c/render.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-8989943091828304994</id><published>2011-02-16T23:11:00.003+09:00</published><updated>2011-02-16T23:39:09.048+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>rss2metaweblog</title><content type='html'>&lt;p&gt;관리하고 있는 4개의 블로그의 포스트를 중앙에 모을 수 있는 방법이 없을까 하고 생각하고 있었습니다. 네이버 블로그를 그렇게 좋아하진 않지만 네이버 블로그의 규모와 유저 베이스를 결코 앝볼 수 없기에 글을 모아놓는다면 거기가 가장 적당할 거라고 생각했습니다.&lt;/p&gt;&lt;p&gt;블로그에서 다른 블로그로 글을 실시간으로 보낼 수 있는 방법을 찾아보았지만 찾을 수 없었습니다. 글의 배급은 RSS나 Atom을 통해, 블로그에 글을 게시하는 통일된 인터페이스는 MetaWeblog API를 통해 제공되지만 이 둘을 합쳐서 실시간으로 피드를 받아와서 블로그에 글을 게시해 주는 서비스가 없는 것 같더군요.&lt;/p&gt;&lt;p&gt;그래서 임의의 RSS/Atom 피드를 크롤링하면서 MetaWeblog API를 통해 해당 피드들을 임의의 블로그에 게시해 주는 간단한 스크립트를 만들어 보았습니다. XMLRPC나 MetaWeblog API, JSON, RSS 피드 리더 전부 파이선에서 그냥 바로 가져다 쓸 수 있는 형태로 만들어져 있어서 어렵지 않게 작업이 가능했습니다. 테스트까지 합쳐서 1시간 반 정도 걸렸습니다.&lt;/p&gt;&lt;p&gt;혹시 필요하실 분이 계실까봐 공개합니다. &lt;a href="https://github.com/segfault87/rss2metaweblog"&gt;https://github.com/segfault87/rss2metaweblog&lt;/a&gt; MIT 라이센스를 따르며 파이선 2.x, Universal Feed Parser 5.0가 필요합니다. 네이버 블로그에서 쓰려고 만들었지만 아마 MetaWeblog API를 지원하는 블로그 서비스라면 어디서든지 사용이 가능할 겁니다. 설정 파일의 형식은 JSON이며 대략적인 설정 방법은 제 설정 파일을 참고해 주세요.&lt;/p&gt;&lt;pre&gt;{&lt;br /&gt;    "preferences": {&lt;br /&gt;            "update_interval": "5m"&lt;br /&gt;        },&lt;br /&gt;    "feeds": [&lt;br /&gt;        {&lt;br /&gt;            "id": "electroscape.en", &lt;br /&gt;            "url": "http://en.blog.influx.kr/feeds/posts/default"&lt;br /&gt;        }, &lt;br /&gt;        {&lt;br /&gt;            "id": "electroscape.ko", &lt;br /&gt;            "url": "http://ko.blog.influx.kr/feeds/posts/default"&lt;br /&gt;        }, &lt;br /&gt;        {&lt;br /&gt;            "id": "scrapranch", &lt;br /&gt;            "url": "http://scrapranch.influx.kr/rss"&lt;br /&gt;        }, &lt;br /&gt;        {&lt;br /&gt;            "id": "tangibility", &lt;br /&gt;            "url": "http://tangibility.influx.kr/rss"&lt;br /&gt;        } &lt;br /&gt;    ], &lt;br /&gt;    "target": [&lt;br /&gt;        {&lt;br /&gt;            "id": "naver", &lt;br /&gt;            "url": "https://api.blog.naver.com/xmlrpc", &lt;br /&gt;            "blogid": "segfault87", &lt;br /&gt;            "userid": "segfault87",&lt;br /&gt;            "password": "API 키" &lt;br /&gt;        }&lt;br /&gt;    ],&lt;br /&gt;    "category_map": {&lt;br /&gt;        "naver": {&lt;br /&gt;            "electroscape.en": "electroscape.en", &lt;br /&gt;            "electroscape.ko": "electroscape.ko", &lt;br /&gt;            "scrapranch": "scrap ranch", &lt;br /&gt;            "tangibility": "tangibility"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-8989943091828304994?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/8989943091828304994/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2011/02/rss2metaweblog.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/8989943091828304994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/8989943091828304994'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2011/02/rss2metaweblog.html' title='rss2metaweblog'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-768373057416029757</id><published>2011-01-27T22:56:00.003+09:00</published><updated>2011-01-27T23:02:15.774+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='konstruktor'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>최종(?) 스크린샷.</title><content type='html'>&lt;p&gt;Konstruktor의 첫번째 베타 버전(0.9.0-beta1)의 스크린샷입니다.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/segfault87/5393062462/sizes/o/" title="Flickr에서 segfault87님의 konstruktor1"&gt;&lt;img src="http://farm6.static.flickr.com/5016/5393062462_55fd7e582a.jpg" width="500" height="311" alt="konstruktor1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/segfault87/5392463961/sizes/o/" title="Flickr에서 segfault87님의 konstruktor2"&gt;&lt;img src="http://farm6.static.flickr.com/5134/5392463961_baa377de2a.jpg" width="500" height="311" alt="konstruktor2" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/segfault87/5393062556/sizes/o/" title="Flickr에서 segfault87님의 konstruktor3"&gt;&lt;img src="http://farm6.static.flickr.com/5294/5393062556_f1e434550e.jpg" width="500" height="303" alt="konstruktor3" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-768373057416029757?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/768373057416029757/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2011/01/blog-post_27.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/768373057416029757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/768373057416029757'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2011/01/blog-post_27.html' title='최종(?) 스크린샷.'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5016/5393062462_55fd7e582a_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-2978660524289891885</id><published>2011-01-27T15:11:00.005+09:00</published><updated>2011-01-27T15:18:23.790+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='konstruktor'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>체크리스트</title><content type='html'>&lt;ol&gt;&lt;li&gt;자르기, 복사, 붙여넣기 기능 구현&lt;/li&gt;&lt;li&gt;부품 검색 기능 구현&lt;/li&gt;&lt;li&gt;설정 GUI 구현&lt;/li&gt;&lt;li&gt;multipart thumbnail 갱신 버그 수정&lt;/li&gt;&lt;li&gt;웹사이트 제작&lt;/il&gt;&lt;/ol&gt;&lt;p&gt;자잘한 문제만 남았습니다. 이제 정말 릴리즈가 코 앞이라는 것이 실감이 나기 시작하는군요. 이번에는 두번째 베타의 마일스톤을 정리해 봅니다.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;윈도 버전 릴리즈 준비&lt;/li&gt;&lt;li&gt;Statistics 기능 구현&lt;/li&gt;&lt;li&gt;Part Explorer 사용성 개선&lt;/li&gt;&lt;li&gt;POV-Ray 렌더러 설정 UI 추가&lt;/li&gt;&lt;li&gt;KDE 의존성 걷어내는 작업 준비&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-2978660524289891885?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/2978660524289891885/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2011/01/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/2978660524289891885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/2978660524289891885'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2011/01/blog-post.html' title='체크리스트'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-3539817460987398026</id><published>2011-01-20T17:25:00.003+09:00</published><updated>2011-01-20T17:36:17.320+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='konstruktor'/><title type='text'>VirtualBox</title><content type='html'>&lt;p&gt;&lt;a href="http://farm6.static.flickr.com/5047/5369762998_f6399a6874_o.png"&gt;&lt;img src="http://farm6.static.flickr.com/5047/5369762998_438de6b86e.jpg" alt="WTF?" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.virtualbox.org"&gt;VirtualBox&lt;/a&gt;에 개발 환경을 구성해서 테스트해 보고 있습니다. VirtualBox에서 죽는다는 보고가 들어와서 살펴 보니 OpenGL 드라이버에 pbuffer 지원이 빠져 있더군요. 사실상 GLX에서 offscreen에 렌더링할 유일한 방법이라 이 확장이 꼭 필요한데, 요즘 대부분의 GLX 구현에 기본적으로 포함된 확장이 구현이 안 되었다는 점이 매우 수상합니다. &lt;a href="http://chromium.sourceforge.net"&gt;Chromium&lt;/a&gt;을 베이스로 한 것 같은데 일종의 wrapper 같은 거라 구현이 특별히 어렵진 않을 거 같습니다. 시간 나면 패치나 만들어서 보내볼까 합니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-3539817460987398026?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/3539817460987398026/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2011/01/virtualbox.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/3539817460987398026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/3539817460987398026'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2011/01/virtualbox.html' title='VirtualBox'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5047/5369762998_438de6b86e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-7272232416342263873</id><published>2011-01-17T00:33:00.012+09:00</published><updated>2011-01-17T19:32:05.565+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='konstruktor'/><title type='text'>Konstruktor 작업 현황.</title><content type='html'>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;알파 릴리즈를 목전에 두고 있습니다. 핵심적인 기능은 대부분 구현이 되었고 지루한 UI 작업이 부분적으로 남아 있습니다. 집중력 잃지 않고 이번 달까지 릴리즈할 수 있도록 노력하겠습니다.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;몇몇 시스템에서 OpenGL rendering context 생성이 제대로 되지 않는다는 버그 보고가 들어왔습니다. &lt;a href="http://nouveau.freedesktop.org/wiki/"&gt;nouveau&lt;/a&gt; 드라이버를 쓰는 시스템인 것 같은데, 여기서 테스트하기도 곤란한 상황입니다. 특별히 OpenGL을 변태적으로 활용하지는 않은 것 같은데 왜 이런 데서 문제가 발생하는지 모르겠습니다. 일단 버그 보고는 계속 받겠습니다.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;POV-Ray 3.7 RC 버전을 붙여 봤는데 일단 문제 없이 동작합니다. 문제는 SMP 지원이 추가되면서 렌더링 중간 과정이 바로 스트리밍 되지 않고 완료되면 짠 하고 뜬다는 건데 이건 어쩔 수가 없네요.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;버텍스 쉐이더 구현은 뒤로 미루기로 했습니다. 버텍스 쉐이더를 구현하려는 이유가 색깔별로 buffer를 따로 두지 않기 위함이었는데 색 버퍼를 따로 둬도 그렇게까지 performance hit이 일어나지 않을 거라는 판단이 들었습니다. 장기적으로 보면 메모리 사용량 절약을 위해서라도 버텍스 쉐이더를 쓰는게 옳다고는 생각되지만 지금은 릴리즈가 급선무라.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;오브젝트 선택 구현을 거의 새로 했습니다. 이제 오브젝트의 선택을 훨씬 더 직관적으로 할 수 있는데다가 boolean operation(add, subtract, intersect)도 지원합니다. 뿌듯하군요.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;슬슬 KDE 의존성을 빼는 계획을 세우고 있습니다. 지금 KDE의 구성요소를 다음과 같은 부분에서 활용하고 있는데,&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;XMLGUI&lt;/li&gt;&lt;br /&gt;&lt;li&gt;KSettings&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Oxygen 아이콘&lt;/li&gt;&lt;br /&gt;&lt;li&gt;몇몇 helper class들&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;도움 클래스나 환경설정이야 그냥 대체해 버리면 상관이 없지만 XMLGUI 프레임워크 덕을 많이 보고 있어서 당장 갈아치우기도 곤란한 상황입니다. 아이콘도 마찬가지고요. 게다가 KDE와 UX를 맞추고 싶다는 개인적인 욕심도 있고. 아마 가능하다면 KDE dependency는 optional하게 빼는 쪽으로 가게 될 것 같습니다.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;윈도와 맥 버전은 이번 알파 릴리즈에 포함되지 않을 겁니다. KDE 의존성 빼는 작업이 끝나면 양 플랫폼으로도 릴리즈할 계획입니다. KDE 런타임을 X11 밖에서 쓰기에는 너무 덩치가 큰지라…. 윈도 버전이 실은 매우 중요한데, 처음에는 이 프로젝트가 리눅스용 &lt;a href="http://www.ldraw.org"&gt;LDraw&lt;/a&gt; 캐드를 만들어 보겠답시고 시작한 프로젝트였지만 멀티플랫폼이 되니 어떤 플랫폼에서 가장 많이 쓰일 지는 어차피 안 봐도 뻔하기 때문이지요.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;릴리즈가 다가오니 홈페이지를 만들어야 할텐데 그저 귀찮습니다. github 페이지로 때울까…. 아니 홈페이지 만들어 주실 분 안 계시려나. (…)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;여담이지만 작업 경과는 항상 git 저장소에 반영하고 있습니다. 소스 코드나 커밋 로그는 여기서 보실 수 있습니다: &lt;a href="http://github.com/segfault87/Konstruktor"&gt;http://github.com/segfault87/Konstruktor&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-7272232416342263873?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/7272232416342263873/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2011/01/konstruktor.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/7272232416342263873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/7272232416342263873'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2011/01/konstruktor.html' title='Konstruktor 작업 현황.'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-245403938643024020</id><published>2010-12-16T21:33:00.004+09:00</published><updated>2010-12-17T08:34:03.202+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='그래픽스'/><title type='text'>ACM SIGGRAPH Asia 2010 (day two)</title><content type='html'>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Modeling Player Performance in Rhythm Games&lt;/b&gt; : 음악 게임 난이도 측정에 probablistic model이라.... 중간에 나와서 자세한 건 기억이 안 나는군요.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Introduction to OpenCL by Example&lt;/b&gt; : OpenCL에 대한 개략적인 설명과 사용법 설명. 전반적으로 대충 알고 있었던 건데 오후에 OpenCL을 주제로 좀 더 심도있는 강의가 있다는 사실을 미리 알았으면 다른 걸 들었어야 하는 건데 말입니다.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Physical and Graphical Effects in OpenCL by Example&lt;/b&gt; : Xcode의 OpenCL 예제 코드를 기준으로 설명하더군요. 나중에 cloth simulation을 GPGPU로 구현하기 위한 전략을 설명하던데 대단히 흥미롭게 들었습니다. Bullet Physics Engine에 OpenCL로 구현된 코드가 있다고 하니 시간 나면 들여다 봐야겠습니다. GPGPU 프로그래밍 경험이 없어서 여기서 중점적으로 다룬 performance-wise 문제는 뜬구름 잡는 것 처럼 느껴지긴 해도 대충 이건 이렇게 하고 저건 저렇게 하는구나 하는 개념 정도는 알게 되었으니 만족.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Geometry Simulation for Feature Films&lt;/b&gt; : ILM에서 아티스트 한 분이 오셔서 아바타, 인디아나 존스 4, 터미네이터 4 등의 영화의 몇몇 샷에서의 지오메트리 시뮬레이션을 어떤 식으로 구현했는지를 자세히 설명하셨습니다. 아무리 시뮬레이션을 돌려도 원하는 결과를 얻기 위해서는 아티스트의 눈이 필연적으로 갈 수 밖에 없고 엄청난 노가다가 동원됩니다. 1초 남짓한 샷 하나를 얻는 데도 4개월 가까이 걸렸다는 얘기를 듣고 VFX 업계에 대한 경외감이.... 엔지니어와 아티스트가 어떤 식으로 커뮤니케이션을 하며 문제를 해결해 가는지에  대해서도 알 수 있었고 ILM의 workflow에 대해서도 간단하게나마 알 수 있었던 유익한 시간이었습니다.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Animation Shorts&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Sintel : 블렌더 제단에서 자유 소프트웨어만으로 만든 작품입니다. 예전에 한국어 자막을 만든 적이 있는데 설마 내가 만든 자막이 나오는게 아닐까 하고 두근두근하면서 봤는데 아예 자막이 안 나오더군요. 하긴 뭐 자막 없이 봐도 전혀 지장 없는 작품이긴 하다....&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Nirvana : 스미에 스타일의 짧은 모션 그래픽 작품.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Gruffalo : 동화책을 원작으로 했더군요. 따스한 색감이 매력적이었습니다. 러닝 타임은 30분.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A Lost and Found Box of Human Sensation : 중간에 들어와서 내용 파악이 잘 안 되더군요. 기억에 남는 건 이언 맥켈런 옹의 나레이션.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Light : 현란하고 추상적인 3분짜리 모션 그래픽 애니메이션. 영상 끝나고 성경 구절 인용이 나오는 걸 보고 좀 벙쪘습니다. 제목이 The Light인 것도 그렇고 아무래도 종교적인 함의가 있는 것 같은데 아마도 제가 본 가장 난해한 종교적인 영상일 겁니다.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Star Wars The Clone Wars: The Zilo Beast Strikes Back : 스타워즈 TV시리즈 클론 워즈의 파일럿 에피소드인 것 같습니다. 코루스칸트 행성에서 Zilo Beast라는 괴물이 난동을 부리고 제다이들이 힘을 합쳐 막아낸다는 이야기.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Light House Keeper : 매우 짧은 흑백 단편입니다. CGI가 쓰이긴 했지만 거의 hand-drawn 애니메이션.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Lost Thing : 은근히 디스토피아적인 배경인데도 파스텔톤의 색감과 몽환적인 분위기가 어우러져서 묘한 느낌의 애니메이션입니다. 크리쳐 디자인도 재밌더군요.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Luciernaga : 깜빡 졸았는데 이미 끝나 있었음. 어 뭐야....&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Birthday Gift : 중국 애니메이션. 무슨 전래동화 읽는 기분이었습니다. 영어 대사를 중국풍으로 혀 꼬아서 읽으니 어찌나 웃기던지.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Mouse Who is Soared : 하늘을 나는 쥐의 이야기. 쥐가 웃기게 생겼다는거 말고는 딱히 기억에 남지는 않네요.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lost and Found : The Lost Thing이랑 소재가 비슷합니다. 한 소년과 펭귄의 우정을 그린 작품. 이것도 동화책 원작이더군요. 어른의 눈에서 보면 뻔하지만 그래도 마냥 훈훈한 이야기.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-245403938643024020?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/245403938643024020/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/12/acm-siggraph-asia-2010-day-two.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/245403938643024020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/245403938643024020'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/12/acm-siggraph-asia-2010-day-two.html' title='ACM SIGGRAPH Asia 2010 (day two)'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-3892683445868602691</id><published>2010-12-16T01:23:00.002+09:00</published><updated>2010-12-16T01:24:02.760+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='그래픽스'/><title type='text'>ACM SIGGRAPH Asia 2010 (day one)</title><content type='html'>&lt;p&gt;제가 본 것들에 대한 짤막한 감상입니다.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Scattered Data Interpolation for Computer Graphics&lt;/b&gt; : 여러 가지 data interpolation 기법을 소개하고 실제 구현사례를 소개합니다. skinning, cel shading, path morphing 등 specific한 예를 들어 설명하긴 했는데 보간법이라는 것이 키프레임 기반의 애니메이션에서 핵심적인 역할을 하다 보니 CG 애니메이션 전반적으로 중요한 기법이라 흥미롭게 보았습니다. Voronoi diagram을 이용한 tessellation에 대해서도 소개하긴 하던데 그냥 간단히 훑고 넘어가는 것 같아서 아쉬웠습니다. 중간에 나와서 잘은 모르지만 뒤에 더 설명했으려나….&lt;/li&gt;&lt;li&gt;&lt;b&gt;Toy Story 3 Double Feature: Characters and Lighting&lt;/b&gt; : 토이 스토리 3의 character development와 주요 장면의 lighting setup에 대해서 다뤘습니다. 픽사가 언제나 그랬듯이 이런 류의 프리젠테이션에서 기술에 대해서 in-depth하게 다루기보다는 주로 감성적인 부분을 중심으로 소개하는 편인데, 사실 타깃 오디언스가 엔지니어보다는 아티스트이긴 하지만 워낙에 픽사 영화를 좋아하는지라 흥미롭게 보았습니다.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Lightfield Photography: Theory and Methods&lt;/b&gt; : 기대하면서 프리젠테이션 룸에 앉아 있는데 발표자가 회장에 아직 도착하지 못했다고 하면서 세션이 취소되었습니다. 대체 이게 뭔….&lt;/li&gt;&lt;li&gt;&lt;b&gt;Introduction to Computer Graphics&lt;/b&gt; : 말 그대로 학부 컴퓨터 그래픽스 개론 수준의 강의. drawing primitives, projection, lighting, shading 등등 이쪽 일을 하고 있다면 숨쉬는 공기처럼 기본적인 것들을 다루더군요. 앞의 세션이 파토나버린 관계로 잠깐 시간 때우는 용도로 봤습니다. 그런데 방이 지나치게 작어서 사람들이 꽉 찬 나머지 바깥까지 대기줄이 서서 방 안쪽에 있는 사람이 한명 나가면 대기줄의 한명이 들어가는 식으로 하더군요. 앞 세션 취소된 것도 그렇고 행사 진행이 은근 매끄럽지 않은 점이 걸립니다. 이런 식으로 보고 싶은 세션 못 보는 일이 생긴다면 나중에는 환불 요구하는 사람도 생길 거 같다는 생각이 듭니다. 보고 싶은 세션 보러 왔는데 이런 식으로 방이 꽉 차서 들어가지도 못한다면…. 여기 참가하려고 단돈 만원을 낸 것도 아닐 거고.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Fast Forward Session&lt;/b&gt; : 정신 없었습니다. 그냥 앞으로의 토크에 대한 맛보기 수준.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;여담이지만 FC라고 적힌 네임택 달고 다니는 사람이 어찌나 부럽던지….&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-3892683445868602691?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/3892683445868602691/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/12/acm-siggraph-asia-2010-day-one.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/3892683445868602691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/3892683445868602691'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/12/acm-siggraph-asia-2010-day-one.html' title='ACM SIGGRAPH Asia 2010 (day one)'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-5330304894704184778</id><published>2010-11-02T20:57:00.007+09:00</published><updated>2010-11-03T00:23:05.251+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='게임'/><category scheme='http://www.blogger.com/atom/ns#' term='번역'/><title type='text'>존 카맥이 iPhone용 RAGE를 말하다</title><content type='html'>&lt;p&gt;지난 8월 12일 존 카맥은 QuakeCon 2010의 기조 연설에서 iOS용 RAGE를 발표하여 많은 사람들을 놀라게 했습니다. 그리고 발매일을 약 한 달 앞둔 시점에서 카맥은 &lt;a href="http://www.bethblog.com/"&gt;베데스다 블로그&lt;/a&gt;를 통해서 iOS용 RAGE의 개발 비화와 기술적인 사항을 정리한 포스팅을 남겼습니다. RAGE에 대한 언급은 물론, 그래픽스와 사운드, 리소스 관리 등 게임의 전반적인 기술적 사항에 대해서 언급하고 있으므로 RAGE 게임에 관심이 있는 분은 물론 모바일 게임 개발에 관심 있는 분들도 한번 쯤 보시는 게 좋겠습니다. 회사에서 눈치 보면서 대충대충 의역한거라 내용이 부정확할 수 있습니다. 만약 시간 남으시는 분들은 원문과 대조해서 오역 발견하시면 알려 주시면 감사하겠습니다. 원문은 &lt;a href="http://bethblog.com/index.php/2010/10/29/john-carmack-discusses-rage-on-iphoneipadipod-touch/"&gt;여기&lt;/a&gt;에서 볼 수 있습니다. 그리고 몇 가지 부분에서 번역에 조언해 주신 &lt;a href="http://mearie.org/"&gt;lifthrasiir&lt;/a&gt;님께 감사드립니다.&lt;/p&gt;&lt;h2&gt;iPhone 용 RAGE&lt;/h2&gt;&lt;p&gt;작년에 id에서의 모바일 게임 개발 작업에는 우여곡절이 있었습니다. 계획은 언제나 다음에 RAGE 같은 것을 iPhone/iPad/iPod 터치용으로 만드는 것이었지만 id에서 진행중인 큰 프로젝트의 뒤에 가려져서 모바일 게임 개발은 그다지 우선순위가 높지 않았습니다. 물밑에서 진행중인 작업이 있긴 했지만, 7월 말이 되어서야 프로젝트를 본격적으로 이끌어 나갈 코어 엔진 코드에 손을 댈 수 있었습니다.&lt;/p&gt;&lt;p&gt;저는 일이 잘 풀리자 흥분했습니다. 그리고 그 때는 QuakeCon이 막 시작할 무렵이었죠. 그래서 저는 전통을 깨고 제 기조 연설에서 기술 데모를 시연했습니다. 나중에 생각해 보면 저는 그 때 소개를 나쁘게 했던 것 같습니다. 아마 제가 이렇게 말했던 것 같군요. "이건 RAGE구요, iPhone 용이구요, 60 fps로 돌아가요." 그래서 몇몇 사람들은 PC/콘솔판 RAGE 게임 전체를 iPhone에서 플레이할 수 있다는 의미로 해석한 것 같습니다. 하지만 그런 건 절대로 아닙니다.&lt;/p&gt;&lt;p&gt;제가 시연했던 것은 처음부터 새로 작성된 기술 데모였습니다. 하지만 RAGE의 컨텐츠 제작 파이프라인과 데이터를 활용해서 만들어졌죠. 우리는 iOS에 RAGE 본편 전체를 옮기지 않았습니다, 아니 엄두조차 내지 않고 있습니다. 만약 (놀랍게도!) PC/콘솔 버젼의 RAGE 게임을 약간의 노력만으로도 iPhone 4에다가 컴파일할 수 있게 된다고 하더라도 그것은 절망적으로 나쁜 아이디어일 것입니다. 가장 최근에 나온 최고의 모바일 장비조차도 Xbox 360과 PS3 성능의 극히 일부밖에 되지 않습니다. 그러므로 이 플랫폼에 성능의 트레이드오프를 만드는 것 자체부터 적절하지가 않습니다. 조작의 차이야 말할 것도 없고요.&lt;/p&gt;&lt;p&gt;우리가 만들고 있는 것은 iOS 플랫폼에서 이전에 본 적이 없는 것입니다. 눈부시게 아름다우며 무척 재미있습니다. 지난 QuakeCon 이후로 개발 작업은 격렬히 진행 중이고 11월이 끝나기 전까지는 앱을 출시할 수 있기를 바랍니다.&lt;/p&gt;&lt;p&gt;이 게임의 제작에 메가텍스쳐 컨텐츠 제작 파이프라인을 사용하게 된 것은 이 게임의 범위 때문입니다. 이 게임에 들어가는 데이터는 큽니다. 그것도 아주 크죠. 하지만 700메가가 넘는 iPhone 용 Myst&lt;sup&gt;1&lt;/sup&gt;를 보면서 사람들이 아무리 커다란 앱이라도 다운받을 것이라는 자신감을 가지게 되었습니다. 그리고 그 용량이 RAGE의 SD 버젼의 용량이 되었고 iPad / iPhone 4용 HD 버젼은 그 용량의 2배 가까이 될 것입니다. 이건 앱이라기보단 차라리 영화를 내려받는 것과 비슷할 겁니다. 그러니 오랜 다운로드에 대비해 두세요. 다른 관점에서 보면 RAGE 게임 본편은 JPEG-XR로 압축된 20 기가의 데이터로 채워져 있으니 무압축 0.7 기가의 데이터는 분명 거기서 아주 작은 일부일 뿐이겠지요.&lt;/p&gt;&lt;p&gt;그렇게 광활한 레벨을 게임에 넣지 않을 계획이었기 때문에 게임이 얼마나 좋게 보이든간에 가격을 높이 책정하면 많은 사람들이 실망할 것이라는 것을 알고 있었습니다. iPhone 타이틀의 가격대를 너무 낮은 가격은 피하되 다양하게 책정하면서 실험해 보았습니다. 그리고 우리는 RAGE의 SD 버전은 $0.99, HD 버전은 $1.99로 책정하는 것이 적당하다는 결론을 내렸습니다. 우리는 이 프로젝트를 최대한 우리의 통제하에 놓을 수 있도록 집중해야 했습니다. 하지만 사람들은 이 가격에 만족할 거라고 생각합니다.&lt;/p&gt;&lt;p&gt;우리는 RAGE 게임의 일부분 중에서 "Mutant Bash TV"를 가지고 iPhone 게임을 만들기로 결정하였습니다. Mutant Bash TV는 RAGE의 황무지 세계관에 있는 포스트-아포칼립틱 전투 게임 TV 쇼인데, 이것은 적을 조준하고, 쏘고, 재장전을 하고, 적의 공격을 피하고, 지난 번보다 더 나은 점수를 얻으면서 레벨의 끝까지 가는 등 진정한 일인칭 슈팅 게임으로서는 최적의 설정이지요. 기본적인 서바이벌 외에도  주울 수 있는 아이템이나 헤드 샷, 힛 스트릭 배수&lt;sup&gt;2&lt;/sup&gt; 등 게임성에 깊이를 더하는 부분도 있으며 그냥 쏘기만 하면 끝나는 것부터 거의 불가능에 가까운 것까지 광범위한 스킬 레벨도 있습니다.&lt;/p&gt;&lt;p&gt;이 프로젝트의 최대 목표는 여러번 다시 플레이할 수 있는 게임을 만드는 것입니다. 이런 게임플레이의 핵심은 스토리 진행이나 캐릭터의 발전이나 기타 등등이 아닌 보상의 측면에 있습니다. 예를 들어서 둠 레저렉션에서 게임의 많은 요소가 처음 플레이할 때는 좋았지만 나중에는 리플레이 가치를 떨어트렸죠. RAGE iOS판은 언제나 액션 뿐입니다. 저는 수십 번 이 게임을 플레이해 보았고, 테스트하는 작업은 여전히 일이라기보다는 즐거움입니다.&lt;/p&gt;&lt;h2&gt;기술적 상세&lt;/h2&gt;&lt;p&gt;id Tech 5 엔진은 기본적으로 게임상의 모든 것에 균일하게 페이징된(uniform paged) 가상 텍스쳐 시스템을 사용합니다. 알고리즘 자체는 3GS나 그 이후 장치들에서 구현할 수 있지만 프래그먼트당 처리 코스트가 상당한 데다가 PVRTC&lt;sup&gt;3&lt;/sup&gt; 형식의 텍스쳐에다가 개별 페이지를 업데이트하는 것은 불가능합니다. 그래서 모바일용 RAGE에서 사용한 방법은 월드 전반에 가변적인 사이즈를 가지는 인접한 "텍스쳐 섬"들을 만들어서 텍스쳐 스트리밍을 적용하는 것이었습니다. 이 방법은 훨씬 빠르지만 큰 표면이 있으면 강제로 분할(geometric subdivision)해야 하며 피드백에 의한 반응이 아닌 철저히 예측적인 방식으로 스트리밍을 해야 합니다. 캐릭터, 아이템, UI는 전통적인 방식으로 텍스쳐링됩니다.&lt;/p&gt;&lt;p&gt;우리는 PC에서 레벨을 만들어서 RAGE에서 돌려보았습니다. 그리고 프로파일링 / 추출 도구를 사용하여 iOS용 맵 데이터를 생성했습니다. 이 도구는 지도 상의 경로를 찾아 다니면서 어느 텍스쳐 섬이 언제, 무슨 해상도와 무슨 방향으로 보일 지를 결정합니다. 텍스쳐 섬의 픽셀 정보는 원래 RAGE의 큰 페이지 파일에서 추출되어 필요한 만큼 여러 해상도로 이방성 필터링&lt;sup&gt;4&lt;/sup&gt;이 적용된 후 장치에 맞는 여러 개의 1024x1024 PVRTC 포맷으로 압축되어 들어가게 됩니다.&lt;/p&gt;&lt;p&gt;텍스쳐 형태로 압축하는 것은 텍스쳐 데이터를 전부 구겨 넣어서 앱 용량을 최소함과 동시에 한 뷰를 수백 개의 텍스쳐 섬으로 쪼개고 싶지는 않다는 서로 상충하는 목표가 있습니다. 다른 NP-완전&lt;sup&gt;5&lt;/sup&gt;한 문제들과 마찬가지로 그리디&lt;sup&gt;6&lt;/sup&gt;한 측정 방식의 최적화 배치 전략을 사용했습니다.&lt;/p&gt;&lt;p&gt;1 기가바이트가 넘는 미디어를 관리하는 데에 플래시 메모리 IO와 프로세스 메모리 관리는 매우 중요하며, 이것들을 연구하기 위해서 상당히 많은 성능 측정 작업을 거쳤습니다.&lt;/p&gt;&lt;p&gt;결정적으로 모든 데이터는 정적이며 쉽게 버릴 수 있습니다. iOS는 스왑 파일&lt;sup&gt;7&lt;/sup&gt;이 없기 때문에 만약 당신이 너무 많은 동적 메모리를 사용하면 OS는 한두번 경고하다가 이내 프로세스를 죽여 버립니다. iOS 개발자들의 골칫거리가 그 "너무 많은" 메모리가 정확히 얼마인지 정의되어 있지 않다는 건데, 사실 이것은 다른 앱들이 (사파리, 메일, iPod 등등) 메모리에 얼마나 상주해 있느냐에 따라서 달라지는 문제입니다. 만약 당신이 모든 게임 데이터를 메모리에 상주시킨다면 OS는 아무 것도 할 수 없습니다. 그리고 당신은 위험에 빠지게 되는 것이죠. 하지만 만약 당신의 데이터가 읽기 전용의 메모리 맵 파일에 들어있다면 OS는 필요할 시 그것들을 해제할 수 있습니다. 이렇게 하면 만약 다음 (메모리 영역)이 필요할 시 게임이 뚝뚝 끊기는 문제가 있겠지만 최소한 갑자기 프로그램이 종료되는 문제는 없습니다. 다만 메모리 부족 경고는 여전히 프레임레이트를 몇 초 동안 지옥에 보내버리는데, 심지어 그 시점에서 게임 자체에서 하는 일이 별로 없다고 하더라도 백그라운드의 다른 모든 앱에서 메모리를 버리기 때문입니다.&lt;/p&gt;&lt;p&gt;흥미있게도 32비트 운영체제임에도 불구하고 단지 700 메가바이트의 가상 메모리 공간에 매핑을 할 수 있습니다. 3 기가 정도는 안 되더라도 저는 최소한 그 두 배는 기대했거든요.&lt;/p&gt;&lt;p&gt;페이지 폴트&lt;sup&gt;8&lt;/sup&gt; 시 메모리 맵 파일에서 32kb의 데이터를 가져오는데 iPhone 4에서는 1.8 ms, iPod touch 2세대에서는 2.2 ms가 소요됩니다. 만약 파일의 맨 처음에서 폴트가 일어나면 32kb가 아닌 128kb를 가져 오는데, 파일의 처음에는 헤더가 있다고 가정한 일종의 최적화로 보입니다.&lt;/p&gt;&lt;p&gt;Apple의 운영체제에서 기존 UNIX 플래그가 제대로 동작하는지 항상 불안했기 때문에 iOS서 fcntl(fd, F_NOCACHE) 함수가 기대했던 대로 정확히 동작한 것이 다행이라고 말씀드리고 싶습니다. 이걸 사용하면 파일 캐싱을 건너뛰면서 페이지로 정렬된 타겟 메모리의 페이지 폴트 대역폭이 30mb/s (구형 아이팟 터치는 22mb/s)로 매우 빠른 성능을 보여 줍니다. 그리고 일반적인 읽기와는 달리 메모리의 복사가 전혀 일어나지 않기 때문에 부분적으로 더 빨라질 수 있습니다. 하지만 가장 중요한 점은 캐싱을 끔으로서 더 중요한 국소성&lt;sup&gt;9&lt;/sup&gt;을 지니는 다른 버퍼 데이터를 침범하지 않는다는 점입니다. 월드 상의 모든 메가텍스쳐 데이터는 제가 언제 먼저 미리 읽어 놓을지를 알고 있기 때문에 캐싱되지 않은 방식으로 읽혀집니다. 그리고 데이터를 버려야 할 시점도 명확합니다. 만약 주어진 영역을 지나가면 그 영역의 텍스쳐 데이터는 앞으로 다시는 필요하지 않을 것입니다. 반면 적들의 애니메이션과 사운드 데이터 같은 데이터는 나중에 다시 나타날 수도 있습니다.&lt;/p&gt;&lt;p&gt;저는 텍스쳐 읽는 작업이 끝난 뒤에 캐싱되지 않은 읽기 스레드에서 관계된 월드의 지오메트리 정보를 미리 읽도록 해 보았습니다. 하지만 생각해 보면 지오메트리 정보를 텍스쳐에 같이 끼워넣고 캐싱되지 않은 읽기를 했어야 했습니다.&lt;/p&gt;&lt;p&gt;OpenAL&lt;sup&gt;10&lt;/sup&gt;은 1024개까지 사운드 버퍼를 만들 수 있는 제약이 있는 것 같습니다. 우리는 큰 문제를 일으키지 않고 정적 버퍼 매핑을 동적으로 생성하고 삭제하고 싶었습니다. 그래도 1024개는 항상 그 아래로 유지할 수 있는 합리적인 갯수입니다.&lt;/p&gt;&lt;p&gt;OpenAL에서 (디스어셈블을 통해) 발견하고 놀란 동작 중 하나는 Play() 명령을 실행하면 버퍼의 4킬로바이트를 항상 건드린다는 것입니다. 말이 되는 동작인데, 사운드 믹싱을 깨트리지 않으려면 일단 버퍼를 램에다가 강제로 페이징해서 올려야 하기 때문입니다. 하지만 호출시 스레드가 예측할 수 없이 잠깐씩 멈추더군요. 그게 적당한 크기의 믹스 어헤드 버퍼를 가진 믹싱 스레드에서 발생한 페이지 폴트로 말미암은 것이었으면 하고 바랐습니다만, 아마도 실제로는 GPU가 이미 모든 버퍼 대역폭을 차지해 버려서 십여 개의 사운드 버퍼가 폴트를 내 버리는 극단적인 상황이라 생각합니다. 그래서 모든 OpenAL 명령을 별개의 스레드에서 처리하도록 만들까 생각중입니다. 그렇게 하면 만약 채워야 할 페이지가 있을 경우 프레임레이트가 불안정해지는 대신에 사운드에 약간의 지연이 생기겠지요.&lt;/p&gt;&lt;p&gt;플래시 메모리 읽기 대기열에 우선순위를 부여할 수 있었다면 좋겠다는 생각을 했습니다. 게임 스레드에서 CPU 폴트에 가장 높은 우선순위를, 사운드 샘플 읽기는 중간, 텍스쳐 읽기는 가장 낮게. 큰 텍스쳐를 여러 개의 덩어리로 나누는 것이 CPU가 멈추는 최악의 케이스를 방지할 수 있다는 것을 발견했습니다.&lt;/p&gt;&lt;p&gt;이 프로젝트에서 고심을 거듭하여 결정한 두 가지 기술적인 점이 있습니다.&lt;/p&gt;&lt;p&gt;기본적인 렌더링 기술은 모두 고정 파이프라인 기능만을 가지고 표현할 수 있는 것을 알고 있었기에 게임을 OpenGL ES 1.1을 사용하여 만들었습니다. 덕분에 낡은 MBX&lt;sup&gt;11&lt;/sup&gt; GPU 플랫폼에서도 구동이 가능합니다. 구형 플랫폼을 지원하는 것이 좋긴 하나 그것들은 이제 시장에서 무시해도 좋을 정도라는 증거는 충분합니다. 그리고 저는 이 결정을 위해 몇 가지 기능 구현과 최적화를 할 기회를 포기해야 했습니다.&lt;/p&gt;&lt;p&gt;구닥다리 고정 기능을 가지고 삽질하는 것은 재미있었습니다. 예를 들어 싱글 패스로 DOT3 법선 매핑(normal mapping) 위에 단색 동적 광원(dynamic lighting) 효과를 얻기 위해서 조명 수치를 텍스쳐의 환경 색(environment color)의 알파 채널에 붙이는 방법을 사용했습니다. 이렇게 하면 색이 GL_SRC_ALPHA, GL_ZERO 블렌딩 모드를 거쳐서 혼합되어 불투명한 캐릭터에 영향을 주게 됩니다. 이런 식의 고정 파이프라인 트릭을 쓰다 보면 여전히 흐뭇한 기분이 들지만 사실 이런 건 요즘같은 픽셀 쉐이더의 시대에 필요한 스킬은 아니지요.&lt;/p&gt;&lt;p&gt;다른 큰 문제는 코드베이스의 혈통입니다.&lt;/p&gt;&lt;p&gt;제가 개인적으로 작성한 iPhone의 코드에는 울펜슈타인 RPG의 렌더러, 울펜슈타인 클래식과 둠 클래식의 모든 iPhone용 코드, 그리고 몇 가지 테스트 어플리케이션의 코드가 포함되어 있습니다. 그 시점에서 저는 플랫폼에서 '해야 할 옳은 것들'이 뭔지는 잘 알고 있었지만 어떻게 하면 하나의 온전한 게임에 적용시킬 수 있을 지에 대한 원숙한 표현법은 잘 몰랐습니다. 둠 클래식에는 괜찮은 코드가 있었지만 모두 C 언어로 작성된 것들이었고 저는 새로운 게임은 (절제된) C++ 언어로 개발하는 것을 선호할 것입니다.&lt;/p&gt;&lt;p&gt;우리가 선택할 수 있었던 것은 Escalation Studios에서 개발한 (저에게 그닥 접점은 없었던) 둠 레저렉션이었습니다. 게임의 플레이 스타일도 어느 정도 비슷했기 때문에 (RAGE에서 돌아볼 거리가 많긴 하지만요) 이걸 사용하는 것은 합리적인 선택인 것 같았습니다. 이것은 "&lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;코드를 절대로 버리지 말라&lt;/a&gt;"는 신조와도 일치하는 것이기도 합니다. 저는 제가 성공을 거듭하는 동안 코드를 싸그리 뭉쳐서 갖다 버린 적이 많은지라 저 글의 여러 가지 부분에서 동의하지 않습니다만 저 글에는 여전히 지혜가 녹아들어 있습니다.&lt;/p&gt;&lt;p&gt;만약 처음부터 새로(from scratch) 만든다고 했을때 코드베이스가 어떻게 될 것인가에 대해서는 긍정적이었습니다. 100k 미만의 가변적인 CPU 데이터를 가질 것이며 게임의 리소스와 관련된 어떤 문자열 데이터도 보이지 않을 것이며&lt;sup&gt;12&lt;/sup&gt; 새로운 플랫폼에서는 60 fps, 구형 플랫폼에서는 30 fps로 돌아갈 것이라고 생각했습니다. 그리고 저는 이걸 대략 4개월 내에 할 수 있다고 확신했습니다. (하지만 그건 아마 오산이었겠죠) 하지만 불행히도 아이폰 프로젝트에 4개월을 할애할 수 없는 상황이어서 2개월으로 밀어붙이게 되었습니다. (지금은 거의 완성된 상태이며 다시 돌아갈 연구 주제를 찾고 있습니다.)&lt;/p&gt;&lt;p&gt;그래서 우리는 개발 편의와 코드 효율성을 타협하는 조건으로 레저렉션의 코드베이스 위에서 만들기 시작했습니다. 이것은 저에게는 흥미로운 경험이었는데, 원래 제가 다루는 모든 코드는 저의 "코딩 DNA"가 있는 것이어야 했기 때문입니다. 왜냐 하면 id 소프트웨어의 코딩 표준은 기본적으로 "존 카맥이 하는 식으로 코딩하라"이기 때문이거든요. 반면 Escalation의 프로그래머들은 완전히 다른 배경을 가지고 있었기에 원래의 코드베이스는 "여기에는 STL&lt;sup&gt;13&lt;/sup&gt;이 있고 저기에는 boost&lt;sup&gt;14&lt;/sup&gt;가 있고 프로퍼티 리스트&lt;sup&gt;15&lt;/sup&gt;를 채우고 이벤트를 디스패치하고 저걸 위임(delegate)하라" 같은 식이었죠.&lt;/p&gt;&lt;p&gt;저는 다른 큰 게임들의 코드베이스가 그에 고통받고 있음에도 불구하고 우리의 거대한 코드베이스에서 다양한 "현대적" C++ 디자인 패턴을 활용함으로서 이득을 볼 수 있을 거라는 생각을 하고 있었습니다. 하지만 저는 이 생각을 철회했습니다.&lt;/p&gt;&lt;p&gt;저는 여기에 대해서 (주로 트위터에) 자주 불평하고 있으며 가끔 다른 모바일 개발자들에게 다양한 실례들을 지적하고는 합니다. 지금까지 이 방법은 통하고 있으며 아마 결국 이것은 옳은 결정이었을 겁니다.&lt;/p&gt;&lt;p&gt;존 카맥&lt;br /&gt;&lt;br /&gt;10-26-2010&lt;/p&gt;&lt;h2&gt;잡담&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;설마 했는데 정말 OpenGL ES 1.1만으로 게임을 만들었군요. 요즘 스마트폰이나 모바일 장치는 기본이 OpenGL ES 2.0이라 그런지 구형 스펙을 가지고 이 정도 퀄리티의 게임을 만들어 냈다는 것이 믿기지가 않습니다. 생각해보면 텍스쳐 스트리밍 자체가 고정 파이프라인만 가지고도 구현할 수 있는 것이긴 하지만 모바일에서도 프로그래머블 파이프라인으로 쉐이더 써서 게임 만드는 시대에 고정 파이프라인으로 이 정도 게임을 만들었다는 것이 놀랍습니다.&lt;/li&gt;&lt;li&gt;최근에 존 카맥이 트위터로 공개한 사실이지만 안드로이드용 RAGE도 준비중이라고 합니다. 포스팅의 내용에 따르면 iOS용은 PVRTC를 사용했다는 거 같은데 이것은 아이폰의 하드웨어가 PowerVR GPU 위에서만 돌아가고 있기 때문에 가능한 것인 반면 하드웨어에 중립적인 안드로이드 장치에서 PowerVR 전용 확장을 쓰긴 어렵겠죠. Qualcomm의 Adreno, ARM의 Mali, NVIDIA의 Tegra 등 다른 GPU를 쓰는 안드로이드 장치도 많을 텐데 안드로이드 포트에서는 이 문제를 어떻게 해결할 지 사뭇 궁금해집니다. iOS용은 PVRTC 텍스쳐 스트림을 그대로 데이터에 때려박았다는 듯한 뉘앙스인데, 안드로이드 포트는 아예 렌더링 패스를 다르게 구현하려나?&lt;/li&gt;&lt;li&gt;저 바닥에서 짬밥 좀 많이 먹은 프로그래머라면 대체적으로 그렇지만 이 양반도 디자인 패턴이나 개발 방법론에 대해서는 보수적인 면이 있는 것 같습니다. 하긴 뭐 예전부터 그랬으니 별로 새로울 건 없군요. GPL로 공개한 소스를 까 보면 구조 자체는 별다른 언어적 기교 없이 무척 심플하게 되어 있었죠. 여담이지만 롤러코스터 타이쿤 시리즈의 제작자 크리스 소여는 Z80 시절부터 어셈블리로 프로그래밍을 한 영향인지 롤러코스터 타이쿤 2까지 코드 대부분을 x86 어셈블리로 짰다는 전설은 유명하죠.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;각주&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Myst: 1993년 Mac OS로 나온 그래픽 어드벤쳐 게임입니다. 나중에 iPhone으로 포팅이 되었는데 용량이 720MB에 달했습니다. 다른 평균적인 iPhone 어플리케이션에 비해서 굉장히 큰 편이죠.&lt;/li&gt;&lt;li&gt;FPS 게임에서 죽지 않고 적을 연속으로 계속 죽이면 보너스가 주어지는 게임플레이 요소.&lt;/li&gt;&lt;li&gt;PVRTC: iPod/iPod touch/iPad에서 사용하는 PowerVR 그래픽스 프로세서에서 사용되는 블럭 단위의 텍스쳐 압축 알고리즘입니다. S3TC나 DXTC와는 다르게 저주파 이미지 두개를 Bilinear Interpolation으로 업스케일해서 변조하는 식으로 구현합니다. 알고리즘 상세는 여기서 확인하실 수 있습니다: &lt;a href="http://web.onetel.net.uk/~simonnihal/assorted3d/fenney03texcomp.pdf"&gt;http://web.onetel.net.uk/~simonnihal/assorted3d/fenney03texcomp.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;이방성 필터링(Anisotropic filtering): 텍스쳐를 여러 장 다운샘플링하여 보이는 각도에 따라 다른 해상도의 텍스쳐를 부분적으로 적용하는 테크닉입니다. 밉 맵(MIP Map)과 비슷하지만 밉 맵은 렌더링 속도를 향상시키기 위한 테크닉이고, 이방성 필터링은 비스듬한 물체의 표면에서 렌더링 퀄리티를 향상시키기 위한 목적입니다. 밉 맵은 등방성(isotropic)인 반면 이방성 필터링은 가로 세로 다른 비율로 이미지를 다운샘플링합니다.&lt;/li&gt;&lt;li&gt;NP-완전: &lt;a href="http://en.wikipedia.org/wiki/NP-complete"&gt;http://en.wikipedia.org/wiki/NP-complete&lt;/a&gt;&lt;/li&gt;&lt;li&gt;탐욕(그리디) 알고리즘: 순간순간마다 최적이라고 생각되는 것을 골라 나가는 알고리즘입니다.&lt;/li&gt;&lt;li&gt;스왑 파일: 페이징 개념에서 말하는 가상 메모리 파일.&lt;/li&gt;&lt;li&gt;페이지 폴트: 가상 메모리에 저장되어 있지만 물리적인 기억 장치에 올라오지 않은 메모리 영역이 있을 경우 이를 물리적 메모리에 올리기 위해서 소프트웨어에서 발생시키는 트랩(trap).&lt;/li&gt;&lt;li&gt;일시적 참조의 국소성(Temporal locality of reference): 메모리 영역에서 순간적으로 접근이 많이 이루어지는 부분을 말합니다. 이를테면 캐싱으로 인해서 빈번하게 접근되는 메모리 영역이 엉킬 수가 있겠죠.&lt;/li&gt;&lt;li&gt;OpenAL: Creative Technology에서 개발한 다채널 오디오 API입니다. 이름에서 알 수 있듯이 OpenGL의 construct를 상당 부분 모방하고 있으며, iPhone 개발 환경에서 오디오 API의 일환으로 제공하고 있습니다.&lt;/li&gt;&lt;li&gt;PowerVR MBX: 구형 iPhone(1세대, 3G)와 iPod touch(1세대, 2세대)의 AP에 탑재되어 있는 GPU입니다. OpenGL ES 1.1 스펙에 대응하고 있습니다.&lt;/li&gt;&lt;li&gt;아마 리소스 문자열을 코드베이스 내에 하드코딩하는 것을 의미하는 것 같습니다.&lt;/li&gt;&lt;li&gt;STL: C++의 표준 템플릿 라이브러리입니다. container, iterator, functor, algorithm 등 다양한 템플릿 기반의 편의 기능을 제공합니다.&lt;/li&gt;&lt;li&gt;Boost: C++의 연장선상에 있는 라이브러리의 집합입니다. 이 라이브러리의 몇 가지 기능들은 차기 C++0x 표준의 일부로 편입되기도 했습니다.&lt;/li&gt;&lt;li&gt;프로퍼티 리스트(plist): NeXTSTEP과 여기서 파생된 애플의 API에서 제공하는 직렬화(serializable) 가능한 데이터를 저장하기 위한 파일과 이에 접근하기 위한 API를 말합니다.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-5330304894704184778?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/5330304894704184778/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/11/iphone-rage.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/5330304894704184778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/5330304894704184778'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/11/iphone-rage.html' title='존 카맥이 iPhone용 RAGE를 말하다'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-8824738816050425736</id><published>2010-10-03T02:14:00.005+09:00</published><updated>2010-10-07T02:06:57.661+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='영화'/><title type='text'>&lt;불청객&gt; 감상 소감.</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_wsaBTslQUzs/TKdoXRUFUYI/AAAAAAAAAFY/i17iTBVlBH4/s1600/uninvited.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_wsaBTslQUzs/TKdoXRUFUYI/AAAAAAAAAFY/i17iTBVlBH4/s320/uninvited.jpg" width="225" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;최근에 디시인사이드 &lt;a href="http://gall.dcinside.com/list.php?id=hit&amp;no=9880&amp;page=1&amp;bbs="&gt;힛갤에 올라간 그 영화&lt;/a&gt;이지요. 어쩌다 보니 기회가 되어 지인과 같이 &lt;a href="http://www.filmforum.co.kr/"&gt;필름포럼&lt;/a&gt;에 가서 보고 왔습니다.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;백수들이 모여 사는 자취방이 갑자기 통째로 은하계로 날아가 버린다는 설정은 좋습니다. 이 설정 하나만으로도 힛갤감.&lt;/li&gt;&lt;li&gt;디시인사이드에 심취한 감독이 만들어서 그런지 특유의 루저 정서가 작품 전체를 관통합니다. 출연 배우들도 실제로 비슷한 생활을 했다고도 하고 전체적으로 빈티나는 분위기만큼은 제대로 표현이 되었던 것 같습니다. 작품의 프로덕션 밸류를 봐도 그런 게 바로 느껴지지 않습니까?&lt;/li&gt;&lt;li&gt;하지만 대사는 심심하고 개연성이 부족해서 극적인 재미는 떨어집니다.&lt;/li&gt;&lt;li&gt;연기 수준은 딱 기대했던 수준만큼이었습니다. 애초에 "자취방 같이 사는 형들"이랑 찍은 영환데 뭘 더 기대하랴….&lt;/li&gt;&lt;li&gt;감독이 서울대 출신의 엘리트라고 화제가 되었길래 청년실업에 대한 뭔가 특별한 문제의식을 기대했는데 특별한 건 없더군요. 고작해야 포인트맨의 "ㅉㅉ 한심한 백수들" 정도가 전부.&lt;/li&gt;&lt;li&gt;CG가 매우 많이 들어간 영화인데 당연하지만 특수효과 수준은 조악합니다. 그나마 무중력 장면이라든지 몇몇 장면은 괜찮았던 것 같습니다.&lt;/li&gt;&lt;li&gt;기본 설정은 &amp;lt;고무인간의 최후&amp;gt;를 연상시키고 중간중간에 &amp;lt;2001: 스페이스 오딧세이&amp;gt; 같은 영화의 오마주가 나옵니다. 이런 걸 찾아보는 재미가 있습니다.&lt;/li&gt;&lt;li&gt;감독 본인도 이 영화가 극장에 걸릴거라고는 기대하지 않았다고 합니다. 원래 필름스쿨 들어가려고 포트폴리오로 만들던 작품이라고 하는데 어쩌다보니 부천 영화제에 출품되었고 소규모지만 극장개봉도 하게 되었다고 하는군요.&lt;/li&gt;&lt;li&gt;단점이 많지만 그렇다고 이 영화가 나오지 말았어야 할 영화인가? 최소한의 자원으로 대규모(?) 스케일의 영화를 만들었다는 점은 높이 사야 할 점입니다. 결과물은 조악하지만 이 말도 안 되는 기획을 실천에 옮기기 위해서 발산했던 큰 에너지가 느껴집니다. 이런 영화에 상업영화의 잣대를 들이대는 것은 무의미한 일일 겁니다.&lt;/li&gt;&lt;li&gt;디시인사이드가 언급됩니다. 시작할 때 "이 영화를 디씨인사이드에 바칩니다", 그리고 스탭롤에서 한번 더….&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/segfault87/5043786509/" title="Flickr에서 segfault87님의 이응일 &amp;lt;불청객&amp;gt; 감독과"&gt;&lt;img alt="이응일 &amp;lt;불청객&amp;gt; 감독과" height="375" src="http://farm5.static.flickr.com/4144/5043786509_b47faba04f.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;감독님과 한 컷.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/segfault87/5043787077/" title="Flickr에서 segfault87님의 노회찬 진보신당 대표와"&gt;&lt;img alt="노회찬 진보신당 대표와" height="375" src="http://farm5.static.flickr.com/4091/5043787077_e87da544e1.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;진보신당 노회찬 대표도 이 영화를 보러 오셨더군요. 바로 옆 자리에 어디서 본 인물이 있어서 자세히 보니…. 이웃(?) 정당 당원이라고 소개하면서 인사 드리니 흔쾌히 사진을 같이 찍어 주셨습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-8824738816050425736?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/8824738816050425736/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/10/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/8824738816050425736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/8824738816050425736'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/10/blog-post.html' title='&lt;불청객&gt; 감상 소감.'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wsaBTslQUzs/TKdoXRUFUYI/AAAAAAAAAFY/i17iTBVlBH4/s72-c/uninvited.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-493509886489047847</id><published>2010-09-28T21:02:00.000+09:00</published><updated>2010-09-28T21:02:45.692+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='konstruktor'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>디버깅 시작</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wsaBTslQUzs/TKHViDJq5hI/AAAAAAAAAFU/1hFpA6KrA-Q/s1600/konstructor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_wsaBTslQUzs/TKHViDJq5hI/AAAAAAAAAFU/1hFpA6KrA-Q/s320/konstructor.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;결국 프로그램의 이름을 또 한번 바꾸었습니다. 새 이름은 &lt;b&gt;Konstruktor&lt;/b&gt;. 별 아이디어도 없는 상황에서 해외 유저가 제안해 주셔서 바꾸게 됐습니다. 이것도 사실 이상적인 이름은 아니지만 KLDraw, Klotz 따위보단 나은 것 같아요.&lt;/p&gt;&lt;p&gt;&lt;a href="http://planetmono.blogspot.com/2010/09/klotz.html"&gt;앞의 포스트&lt;/a&gt;에서 언급했던 normal 역전 버그를 보고 있습니다. 작업 좀 더 편하게 하자고 30분 가량 삽질해서 우선 디버그용 프로그램부터 만들고….&lt;/p&gt;&lt;p&gt;이런 프로그램을 만드는데는 GLUT가 확실히 적격인 것 같습니다. 쓰기 쉽고 간단하기 때문이거든요. 어차피 LDraw 렌더링 코드는 UI 툴킷과 따로 분리가 되어 있기 때문에 추가적인 작업도 불필요했고요. 다만 스트링 출력 함수가 무척 짜증나게 되어 있네요. 원래 GLUT는 스트링 출력 함수가 없고 문자 출력 함수가 있습니다. 다시 말하자면 함수 하나가 한개의 글자밖에 찍을 수 없다는 건데, 따로 wrapper를 만들기 귀찮아서 OpenGLUT의 비표준(?) glutBitmapString() 함수를 써야 했습니다.&lt;/p&gt;&lt;p&gt;일단 10월 내로는 릴리스하겠다고 나 자신과 약속했는데 글쎼요. 과연 지킬 수 있을까….&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-493509886489047847?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/493509886489047847/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/09/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/493509886489047847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/493509886489047847'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/09/blog-post.html' title='디버깅 시작'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wsaBTslQUzs/TKHViDJq5hI/AAAAAAAAAFU/1hFpA6KrA-Q/s72-c/konstructor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-2553547023977615254</id><published>2010-09-18T02:05:00.003+09:00</published><updated>2010-09-18T02:09:16.478+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='음악'/><title type='text'>글로벌 개더링 2010</title><content type='html'>&lt;a href="http://www.flickr.com/photos/segfault87/4998321001/" title="Flickr에서 segfault87님의 IMAG0102.jpg"&gt;&lt;img src="http://farm5.static.flickr.com/4129/4998321001_262eca80dc.jpg" width="500" height="299" alt="IMAG0102.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://vuent.co.kr/"&gt;글로벌 개더링 2010 홈페이지&lt;/a&gt;&lt;/p&gt;&lt;p&gt;작년에 비해서 라인업이 부실해 보이긴 하지만 지금까지 발표된 해외 라인업 전부 좋아하는 뮤지션이라 별 불만은 없습니다. 특히 팻보이 슬림은 공연 영상 보면서 바로 비행기 티켓 끊어서 브라이튼 해변으로 달려가고 싶은 생각이 들었을 정도니까요. 친히 한국까지 찾아 주신다니 저야 뭐 헤헤 넙죽넙죽.&lt;/p&gt;&lt;p&gt;작년에 가장 아쉬웠던 것이 글로벌 개더링 2009에 못 갔던 것이라 여전히 아쉬움은 남습니다. 프로디지, 언더월드, 로익솝, 펜듈럼, MSTRKRFT 모두 좋아하는 뮤지션이라서요. 특히 요즘 자주 듣고 있는 Röyksopp은 너무 아쉽습니다. 차라리 작년에 안 오고 올해에 왔더라면…. 그러고 보니 얼마 전에 Senior 앨범이 발매된 모양인데 유튜브에서 찾아서 몇 곡 들어보고 사야겠습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-2553547023977615254?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/2553547023977615254/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/09/2010.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/2553547023977615254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/2553547023977615254'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/09/2010.html' title='글로벌 개더링 2010'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4129/4998321001_262eca80dc_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-871442939119978691</id><published>2010-09-08T02:56:00.000+09:00</published><updated>2010-09-08T02:56:10.256+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='안드로이드'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>디시인사이드 업로더 사용자 1000명 돌파.</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wsaBTslQUzs/TIZ2estbieI/AAAAAAAAAEQ/YKqUcZfWlFI/s1600/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7+2010-09-07+%EC%98%A4%EC%A0%84+12.24.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://2.bp.blogspot.com/_wsaBTslQUzs/TIZ2estbieI/AAAAAAAAAEQ/YKqUcZfWlFI/s400/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7+2010-09-07+%EC%98%A4%EC%A0%84+12.24.09.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;제가 처음으로 만들어 본 안드로이드용 어플리케이션인 &lt;a href="http://palladium.planetmono.org/dcuploader"&gt;디시인사이드 업로더&lt;/a&gt;의 유저 수가 얼마 전에 1000명을 넘어섰습니다. 1000명이 그리 많은 숫자는 아니지만 제 나름대로의 기준으로 정해두려고 합니다. 이런 저런 버그도 많고 부족한 점도 많은 어플리케이션이지만 각계(?)에서 너무 긍정적으로 평가해 주시고 잘 쓰고 계시니 몸 둘 바를 모르겠습니다.&lt;/p&gt;&lt;p&gt;제가 디시의 충성스러운 이용자도 아닌데 왜 하필 디시업로더를 만들게 됐는지를 설명드리면, 디시인사이드가 말도 많고 탈도 많지만 일단 규모면에서 가장 큰 곳 중 하나거든요. 처음에 모바일 어플리케이션을 만들 생각을 하면서 기존의 대형 커뮤니티를 어떻게 모바일과 연계시켜서 일상적인 상황에서 부담없이 쓸 수 있을지를 고민했습니다. 특히나 디시는 명목상으로는 디카 커뮤니티이기도 하고요. 스마트폰을 가지고 다니면서 바로 꺼내서 사진을 찍고 즉시 디시인사이드에 올리는 것을 생각하고 만든 것이 디시업로더입니다. 게다가 단순히 사진을 올리는 것 뿐만 아니라 &lt;a href="http://m.boxweb.net/"&gt;박스웹&lt;/a&gt;과 &lt;a href="http://m.oolzo.com/"&gt;물조&lt;/a&gt;의 도움을 받아 모바일 페이지와 연계하여 나름의 모바일 SNS로 발전했다고 생각합니다.&lt;/p&gt;&lt;p&gt;앞으로의 계획은 일단 신기능은 비로그인(유동닉) 글쓰기까지만 구현할 거고요, 그 이후에 특별한 일 없으면 아마 버그픽스 정도로 유지할 생각입니다. 혹시 새로운 기능 제안하실 게 있다면 댓글 달아 주세요.&lt;/p&gt;&lt;p&gt;고작 천 명밖에 안 쓰는데 무슨 자뻑질이냐... 하시면 할 말이 없지만 제가 지금까지 만든 프로그램 중에서 이정도로 퍼진 프로그램이 없기 때문에 감회가 새롭군요. 여튼 부족한 프로그램 써 주셔서 감사하고요, 앞으로도 잘 부탁드립니다.&lt;/p&gt;&lt;p&gt;PS: 혹시나 해서 밝히는 거지만 디시업로더는 MIT 라이센스로 배포되는 자유 소프트웨어입니다. 소스 코드는 &lt;a href="http://code.google.com/p/segfault-snippets/"&gt;http://code.google.com/p/segfault-snippets/&lt;/a&gt;에서 받으세요.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-871442939119978691?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/871442939119978691/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/09/1000.html#comment-form' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/871442939119978691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/871442939119978691'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/09/1000.html' title='디시인사이드 업로더 사용자 1000명 돌파.'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wsaBTslQUzs/TIZ2estbieI/AAAAAAAAAEQ/YKqUcZfWlFI/s72-c/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7+2010-09-07+%EC%98%A4%EC%A0%84+12.24.09.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-931078517202405968.post-4840805611316897625</id><published>2010-09-06T21:04:00.005+09:00</published><updated>2010-09-06T21:30:40.288+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>Klotz 릴리즈까지 남은 것들</title><content type='html'>병특 시작한 이래 작업을 거의 못 하고 있었습니다. 계속 이렇게 방치해둘 수는 없다는 생각에 첫번째 베타 릴리즈까지 해야 할 점들을 정리해 둡니다.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;렌더링 엔진 개선&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;1. Back Face Culling (BFC)&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;단순히 뒷면을 거르는 것만의 문제가 아닌, 제대로 된 surface normal vector를 구하기 위해서 꼭 구현해야 하는 거라서 릴리즈 전까지는 작업을 해야 하는 부분입니다.&lt;/p&gt;&lt;p&gt;보통 3D 하면 BFC는 기본이지만, LDraw 스펙에서 BFC는 필수가 아니며 일종의 확장으로 구현이 되어 있습니다. 물론 대부분의 primitive는 BFC-compilant하지만 만에 하나 그렇지 않은 경우를 위해서 예외 처리를 해 두어야 합니다.&lt;/p&gt;&lt;p&gt;지금 BFC 자체는 구현이 거의 되어 있지만 렌더링 코드에서 문제가 계속 발생하고 있습니다. 분명히 스펙대로 짰는데 subfile inclusion시 가끔 normal이 역전되는 문제가 발견되고 있습니다. 지금 여기서 작업이 막혀 있는데 그래서 요즘 능력의 부족함을 통감하고 있습니다. 고등학교때 수학 수업 좀 더 제대로 들어 놓을 걸 그랬네요.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;2. Vertex Buffer Object (VBO)&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;지금 렌더링 코드는 전부 glBegin - glVertex - glEnd로 구현이 되어 있습니다. 가장 기본적이며 간단한 방법임과 동시에 가장 비효율적이기도 합니다. 정점 하나 찍거나 색깔 하나 찍는데 함수 호출 하나라니 함수 호출 오버헤드만 해도 상당한 수준이겠지요. 결국 이 방식은 OpenGL ES와 최신 OpenGL 4 스펙에서 (고정기능 파이프라인 함수들과 함께) deprecate된 semantics라 portability를 위하여 VBO 기반으로 코드를 전부 뜯어고칠 필요가 있습니다.&lt;/p&gt;&lt;p&gt;문제는 LDraw 포맷의 계층적 구조가 그닥 VBO와 친하지 않다는 것입니다.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wsaBTslQUzs/TITLcb69rbI/AAAAAAAAAD0/cIT_j0_zvV4/s1600/vbo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_wsaBTslQUzs/TITLcb69rbI/AAAAAAAAAD0/cIT_j0_zvV4/s400/vbo.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;보시다시피 LDraw 모델은 최상단에 모델 파일이 있고 거기서 다른 서브파일들을 참조하는 방식으로 구성이 되어 있습니다. 그리고 가장 밑에 있는 part 혹은 subpart, primitive에서 실제  선, 삼각형, 사각형과 같은 정보를 담고 있습니다.&lt;/p&gt;&lt;p&gt;그럼 여기서 어디까지를 VBO로 만들 것인지의 문제가 있습니다.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;전체 모델 : 버퍼 하나를 만들어서 거기에 모든 데이터를 넣습니다. 가장 단순한 방식이나 모델에 수정이 가해지만 버퍼 전체의 내용을 새로 만들어야 합니다.&lt;/li&gt;&lt;li&gt;Part : 모델 레벨에서 가장 기본적인 단위까지 VBO를 만듭니다. 그러니 part 하나 하나가 object가 되는 방식이지요. 언뜻 합리적으로 보이나 밑에 얽혀있는 수많은 primitive 데이터가 각 part마다 중복되어 들어가므로 메모리가 낭비되는 문제가 있습니다.&lt;/li&gt;&lt;li&gt;Primitive : primitive 도형들에 대해서 VBO를 만듭니다. 다만 primitive의 색상은 caller의 색상을 따르므로, 그릴 때마다 버퍼의 색상 정보를 일일히 업데이트합니다. 색상 정보를 바꾸는 데 드는 오버헤드가 어느 정도인지는 아직 모릅니다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;1번은 그닥 고려할만한 가치가 없을 것 같고 2번 혹은 3번을 선택해야 할 것 같은데, 일단 두 가지 경우를 모두 테스트해 보고 최선이 무엇인지 가늠해 본 다음에 결정해야 하겠습니다.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;3. Line type 5&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;LDraw 스펙 문서에 보면 Line type 5가 있습니다. 간단히 설명하면 두 쌍의 벡터가 있는데, 각 벡터를 현재 projection 행렬에 곱합니다. 그럼 그 두개의 벡터가 2차원 평면에 사상되는데, 이 벡터가 서로 평행(identical)이라면 그립니다. 한 마디로 말하면 둥근 오브젝트의 경계선을 그리기 위한 엘리먼트라고 보시면 됩니다.&lt;/p&gt;&lt;p&gt;현재 카메라 시점에 따라 그리는 결과물이 달라지므로 미리 계산할 수는 없고 매번 렌더링할 때마다 검사하여 그리는 엘리먼트이기 때문에 아직 렌더러를 프로파일링해보지 않아 모르긴 몰라도 아마 부하가 상당할 겁니다.&lt;/p&gt;&lt;/p&gt;그러므로 이걸 최적화하는 것도 과제 중 하나인데, vertex shader를 이용할 생각입니다. 몇십 줄의 ARB program으로도 구현이 가능할 것 같네요.&lt;/p&gt;&lt;p&gt;단, 요즘 대부분 그래픽 카드가 프로그래머블 파이프라인이라 걱정할 필요는 없지만 리눅스 환경에서 몇몇 오픈 소스 3D 드라이버는 아직 쉐이더 구현이 미비하거나 아예 없으므로 CPU fallback을 마련해야 할 것 같습니다.&lt;/o&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;레이트레이서(POV-Ray) 연동&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;POV-Ray 3.6까지는 정상 작동하나 POV-Ray 3.7 베타로 테스트해보니 안 되더군요. 그래서 문제를 분석하다가 POV-Ray 소스 코드를 뒤져보니 stdout으로 출력물을 보내는 기능 전체가 주석 처리되어 있었습니다. 지금 구현은 POV-Ray에서 targa 포맷의 이미지를 stdout으로 스트리밍하고 Klotz에서 이걸 받아서 실시간으로 보여주게 되어 있는데 POV-Ray 3.7이 베타라서 이 기능을 임시로 빼 놓은 모양이더군요. 하긴 3.7에 SMP 기능이 들어가서 렌더링 결과가 깍두기로 나오더니 제대로 되려나 싶었습니다.&lt;/p&gt;&lt;p&gt;이걸 발견한 게 작년의 일이니 지금은 고쳐졌을지 모르겠군요. 시간 되면 한번 알아봐야겠습니다.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;UI 및 편집기 개선사항&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;1. de-KDE-ify&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Klotz에서 KDE 라이브러리를 쓴 건 다음 이유에서였습니다.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;XMLGUI&lt;/li&gt;&lt;li&gt;설정 파일 통합&lt;/li&gt;&lt;li&gt;KDE와의 UX integration&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;리눅스의 KDE 환경에서 KDE와의 통합은 적절한 선택이었다고 생각하지만 다른 플랫폼(Mac OS X, 윈도)으로 가면 상황이 달라집니다. 고작 캐드 프로그램 하나 쓰겠답시고 그 크고 무거운 KDE 환경 전체를 끌고 와야 할 필요는 없지요.&lt;/p&gt;&lt;p&gt;그래서 윈도와 맥의 경우 (그리고 리눅스에서도 선택적으로) KDE 라이브러리를 제외하는 작업이 필요합니다. KDE에 의존적인 코드가 많지 않아서 그나마 다행이지만 더 급한 문제가 많으니 지금 당장은 어렵고 장기적으로 해야 하겠습니다.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;2. Cut, Copy and Paste&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;이거 안되면 캐드 맞나요? (…)&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;3. 설정 GUI&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;기본 설정은 너무 빈약하고, 레이트레이서 설정은 아예 없습니다. 이런 단순한 UI 작업은 단지 노가다일 뿐이라 선뜻 손이 가지 않네요.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;4. Data model 개선&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;가끔씩 편집하다 보면 DataModel이 깨지더군요. Model은 솔직히 귀찮아서 야매로 구현했는데 (Qt의 MVC 구현이 너무 복잡해서…) 조금 시간이 걸릴 것 같긴 하지만 시간 들여서 조금씩 고쳐 나가야 하겠습니다.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wsaBTslQUzs/TITYk7hyMMI/AAAAAAAAAD8/abn_ViuQV5s/s1600/scr1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_wsaBTslQUzs/TITYk7hyMMI/AAAAAAAAAD8/abn_ViuQV5s/s320/scr1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;인증샷. 앞서 말한 BFC 버그 때문에 쉐이딩이 엉망이군요.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/931078517202405968-4840805611316897625?l=ko.blog.influx.kr' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ko.blog.influx.kr/feeds/4840805611316897625/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://ko.blog.influx.kr/2010/09/klotz.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/4840805611316897625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/931078517202405968/posts/default/4840805611316897625'/><link rel='alternate' type='text/html' href='http://ko.blog.influx.kr/2010/09/klotz.html' title='Klotz 릴리즈까지 남은 것들'/><author><name>segfault</name><uri>http://www.blogger.com/profile/02569670447901287258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_wsaBTslQUzs/TUEYT0dXuEI/AAAAAAAAAHM/ryYt9yb4vQU/s220/76653_1675243007765_1438143683_1745683_6180050_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wsaBTslQUzs/TITLcb69rbI/AAAAAAAAAD0/cIT_j0_zvV4/s72-c/vbo.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
