tag:blogger.com,1999:blog-52813849172751325682023-11-16T16:32:23.738+09:00블라인드 렌더러25% 렌더링 프로그래머, 30% 잠자는 숲속의 미녀(?), 10% 그냥 프로그래머, 5% 장농속 음악인, 30% 미스테리Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.comBlogger172125tag:blogger.com,1999:blog-5281384917275132568.post-37035249274198254882020-06-10T09:16:00.000+09:002020-06-10T09:16:01.742+09:00새 블로그로 옮깁니다<div>좀더 빠르고 쾌적한 환경을 위해 새 블로그로 옮깁니다.</div><div><br /></div><a href="https://blog.popekim.com/ko">예전에 있던 글들도 다 옮겼으니 이 링크를 눌러 새 블로그를 방문해 주세요 :) </a>Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-51139501660729272732014-01-17T08:30:00.000+09:002014-02-13T02:43:48.553+09:00TOP 1% 먹었습니다.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LMogEMvSevQdkZ3PNik4Ty8ivvQRjaUVnreV5VAlCiBPrHj-yv2fCGLNd5eY12DXDa_xRAV5xxDuZsgojRcfPxRGbJAwld7eMfc3hZm6nBsbN3LToIpJXA9kMuCCphOSiPaXFjZ0ML4d/s1600/top1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LMogEMvSevQdkZ3PNik4Ty8ivvQRjaUVnreV5VAlCiBPrHj-yv2fCGLNd5eY12DXDa_xRAV5xxDuZsgojRcfPxRGbJAwld7eMfc3hZm6nBsbN3LToIpJXA9kMuCCphOSiPaXFjZ0ML4d/s1600/top1.PNG" height="592" width="640" /></a></div>
<br />
<br />
며칠전에 이메일을 받았습니다. <a href="http://www.slideshare.net/blindrendererkr">슬라이드쉐어에 슬라이드를 몇개 올려놨었는데</a> 매우 인기가 높았답니다. 전체 슬라이드쉐어 계정중에 뷰수로만은 탑1프로라더군요. 예측치 못했던 일이라 조금 얼떨떨 하면서도 참 보람차구요. 제가 슬라이드쉐어 영문 계정이 또 따로 있는데... 여기까지 합치면 대체 퍼센트가 몇프로 될지도 궁금하군요.<br />
<br />
일단 제 슬라이드 많이 봐주셔서 고맙고... 올해는 올릴 슬라이드가 없을거 같아 죄송스럽기까지 하군요 -_-a<br />
<br />Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5281384917275132568.post-47101936767624714252013-12-30T09:00:00.000+09:002013-12-30T09:00:06.896+09:00시스템 악용과 팀(team)사람들이 시스템을 악용하는 것을 고치려고 규제를 강화하는 경우가 있다. 하지만 그래도 어차피 악용할 놈들은 또 악용한다. 고로 시스템은 그대로 둔 채 그런 놈들을 제거하는 것이 팀을 파괴하지 않는 최선의 방법이다. - Pope Kim (2013.12.20)Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5281384917275132568.post-62438360892549506822013-12-24T08:45:00.000+09:002013-12-24T08:45:00.178+09:00창밖을 보라 흰눈이 내린다<div class="separator" style="clear: both; text-align: left;">
며칠 전에 찍은 사진인데 구글 형님이 알아서 눈 애니메이션을 넣어주셨습니다. 구글+ 사진은 참 괜찮은 서비스 같습니다 -_-a</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdICmb3jti2-KX2vCK-AUlqMVIol9vxbCKMCrF6LROrpuKXYGsferEhet5VQdzoN5dIReo61liRivrpiUm4Jl5tsmaKYim1mbfZo0MYw5ZZxlLK-3n4HLjiA6IA-uMhyhqPiLeUduVRlh/s1600/IMG_20131220_083140-SNOW.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdICmb3jti2-KX2vCK-AUlqMVIol9vxbCKMCrF6LROrpuKXYGsferEhet5VQdzoN5dIReo61liRivrpiUm4Jl5tsmaKYim1mbfZo0MYw5ZZxlLK-3n4HLjiA6IA-uMhyhqPiLeUduVRlh/s1600/IMG_20131220_083140-SNOW.gif" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-30228572750841200462013-12-23T14:00:00.000+09:002013-12-23T14:00:05.708+09:00만화그리는 프로그램육아만화 웹툰로 한때 명성을 날리시던 연두부(부드러운 두부가 아닙니다 -_-) 님께서 유투부 클립스튜디오 강좌를 시작하셨습니다. 이야길 들어보니 이 툴이 만화그리는데는 꽤 괜찮은 프로그램이라고 하네요..<br />
<br />
만화 그리시는 분중에 관심있으신 분들은 가서 살펴보세요. 아직도 강좌는 꾸준히 올라오고 있습니다.<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/bn1WnjPU29o?list=UU3bBwi5sVgO0JqACiqxen8g" width="640"></iframe><br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-90665132360417099412013-12-18T08:30:00.000+09:002013-12-18T08:30:01.396+09:00Visual C++ 리팩토링 익스텐션Visual C#에 비해 Visual C++ 리팩토링 기능이 구린건 누구나 아는 일.. 뭐 사실 이유야 C#이 언어 자체에서 지원하는 기능이 C++보다 나은거지만... 옛언어와 최신언어의 차이랄까..<br />
<br />
하지만 VC++ IDE 팀에서 익스텐션 형식으로 이걸 좀 보안할 수 있는 걸 내놨음..<br />
<br />
<a href="http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194?SRC=Home">http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194?SRC=Home</a><br />
<br />
참고로 설정에서 <br />
<br />
<strong>Tools->Options > Text Editor > C/C++ > Advanced > Disable Resolving</strong><br />
<br />
이걸 <strong>False</strong>로 해주라고 함<br />
<br />
<br />
<br />
<br />
아마 이게 반응이 괜찮으면 2014년엔 정식버전으로 들어가지 않을까?Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5281384917275132568.post-74995558615222140732013-12-17T14:00:00.000+09:002013-12-17T14:00:08.914+09:00프로그래밍은 자기 두뇌에 대한 도전<br />
프로그래밍은 자기 두뇌에 대한 도전. . 자기 성취감...<br />
<br />
- Pope Kim (2013/12/12)<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-30020652126809776882013-12-11T08:30:00.000+09:002013-12-11T08:30:00.975+09:00MS-SQL에선 datetime대신 datetime2를 쓸것그냥 다른 프로그래밍 하다가 알게된 사실.. 고로 퀵노트로 공유...<br />
<br />
MSDN을 자세히 읽어보지 않으면 당근 알수없는것.. MSSQL에 시간날짜 등을 저장할때는 datetime대신에 datetime2를 써야한다. datetime은 SQL 표준을 안따르게 때문...<br />
<br />
이에 대한 자세한 문서는 다음:<br />
<ul>
<li><strong>영문</strong>: <a href="http://msdn.microsoft.com/en-us/library/ms187819.aspx">http://msdn.microsoft.com/en-us/library/ms187819.aspx</a></li>
<li><strong>한글</strong>: <a href="http://msdn.microsoft.com/ko-kr/library/ms187819.aspx">http://msdn.microsoft.com/ko-kr/library/ms187819.aspx</a></li>
</ul>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-83065513310105262252013-12-10T04:13:00.000+09:002013-12-11T06:05:25.318+09:00캐나다 프로그래머는 얼마나 버나?캐나다 정부에서 발표한 자료가 있네요.. 각 지역별로 프로그래머가 시급을 얼마나 받는지 보여주는 자료입니다. 이 자료에서 연봉을 계산하시려면.. 다음 공식을 이용하시면 됩니다.<br />
<br />
<em><strong>시급 * 40(시간/주) * 52주</strong></em><br />
<br />
<br />
<a href="http://www.workingincanada.gc.ca/LMI_report_bynoc.do?&noc=2173&reportOption=wage">http://www.workingincanada.gc.ca/LMI_report_bynoc.do?&noc=2173&reportOption=wage</a><br />
<br />
<strong>업데이트:</strong> 링크에 안들어가진다는 분들이 많아서 스샷을 찍어왔습니다.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPRX5B8fYCwIxxLweYbnIj9ANO2P2TTElLGsclbakMzUCrCyyua3HcadG589bZl5CTe93S5GN4iWzIJwLFAjV_rrrYB3jJa4F6h61gBJzEGUWFcx2X5p57rTsCIfjrcyLCUJDZjEOGcgDT/s1600/s1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPRX5B8fYCwIxxLweYbnIj9ANO2P2TTElLGsclbakMzUCrCyyua3HcadG589bZl5CTe93S5GN4iWzIJwLFAjV_rrrYB3jJa4F6h61gBJzEGUWFcx2X5p57rTsCIfjrcyLCUJDZjEOGcgDT/s1600/s1.PNG" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB3_wvc3htlfYyG8G_Vi4N3KyfCUzV6LAvnuxe1ntKiEJ9Ayy-gaVB1b-E7K70Ug94fMcV3iND9YU5L6dgRPA5La3yh8NZfebbS8JGJu_QS9DPNbmeAbTWX7-lzPHa26TViFrXhir8Ky3k/s1600/s2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB3_wvc3htlfYyG8G_Vi4N3KyfCUzV6LAvnuxe1ntKiEJ9Ayy-gaVB1b-E7K70Ug94fMcV3iND9YU5L6dgRPA5La3yh8NZfebbS8JGJu_QS9DPNbmeAbTWX7-lzPHa26TViFrXhir8Ky3k/s1600/s2.PNG" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwxPmpRLFztpmRr5ealfeAvZV1CkT6yxu78YyJkSHy1_kwrs9S0c2CtmwIpFUSvJBXu-BlJHxSC_jfkS72kWk3jm5JuseLDj3tF6Aqt-shDpZsw0Denod0_MwgOgKc54v1nLnk2myFw2R4/s1600/s3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwxPmpRLFztpmRr5ealfeAvZV1CkT6yxu78YyJkSHy1_kwrs9S0c2CtmwIpFUSvJBXu-BlJHxSC_jfkS72kWk3jm5JuseLDj3tF6Aqt-shDpZsw0Denod0_MwgOgKc54v1nLnk2myFw2R4/s1600/s3.PNG" /></a></div>
<br />
<br />
<br />
제가 있는 BC주 Lower Mainland 지역은 연봉이 다음과 같군요.<br />
- 최저: $44,900<br />
- 평균: $77,997<br />
- 최고: $131,997<br />
<br />
<br />
가장 급여가 높은 곳은 기름이 철철나오는 알버타 주이고.. BC주가 2등입니다. <br />
<br />
<br />Unknownnoreply@blogger.com7tag:blogger.com,1999:blog-5281384917275132568.post-17657745846258243422013-12-03T08:30:00.000+09:002013-12-07T08:47:55.294+09:00복셀 에디팅 팁다신 안볼줄 알았는데.... -_- 요즘들어 다시 복셀(voxel) 에디팅에 대해 잠시 본 바.... 이 기회에 제가 이짓하면서 배운 교훈들을 짧게(정말?) 공유해볼까 합니다. 저번에 썼던 <a href="http://kblog.popekim.com/2013/11/blendable-rgbm.html">"혼합가능한 RGBM" 글</a> 과는 달리 여기에 나열한 모든 정보/fact 들은 이미 온라인에 다 널려있는 내용입니다. 그냥 그 모든 내용들을 모아 제 의견을 약간 곁들인게 전부입니다.<br />
<br />
<span style="font-size: large;"><b>1. isosurface부터 이해하세요</b></span><br />
복셀 데이터를 주무르는 가장 실용적인 방법은 각 복셀마다 iso 값을 대입하는 겁니다. 다른 방법도 시도해봤는데요(물론 제가 발명해낸 기괴한 방법도 한번 시도해봤죠 -_-) 대부분 별로더라구요. 단점들이 있어요. 결국엔 iso 값으로부터 메쉬를 다시 생성해내는게 가장 실용적이고 메모리 친화적인 방법인거 같습니다. iso surface extraction에 대해 설명하는 무수한 논문이 있으나 정작 isosurface가 뭔지를 쉽게 설명하는 자료는 흔치 않더라구요.<br />
<br />
<a href="http://www.econym.demon.co.uk/isotut/">여기 저기 뒤진 끝이 이 튜토리얼을 찾았습니다. 설명도 잘해놨구요. isosurface의 개념을 익히는데는 최고인듯 싶습니다.</a> (물론 영어입니다... 이 글도 영문 블로그에 썻다가 한글로 번역하는 놈이기 때문에.. 혹시라도 괜찮은 한글자료 가지고 계신분은 공유좀 부탁 -_-a)<br />
<br />
<a href="http://3d-coat.com/forum/index.php?showtopic=3227">또한 3D Coat의 개발자가 매우 친절하게도 3D Coat에서 사용하는 복셀 데이터의 포맷을 공개해놨습니다.</a> 이 데이터 구조를 들여다보는 것만으로도 복셀 에디팅에 대해 상당히 많은걸 배울 수 있습니다.<br />
<br />
복셀 편집에는 큰 관심이 없고 그대신 임시 복셀 데이터로부터 절차적(procedurally)으로 거대한 지형(terrain)을 만드는게 목적이시라면 <a href="http://procworld.blogspot.ca/">VoxelFarm inc의 블로그를</a> 읽어보세요. 이 분 정말 천재더라구요. (실제 한번 만나도 봤습니다. 몬트리올 살때 -_-)<br />
<br />
<span style="font-size: large;"><b>2. 복셀데이터는 "간접적" 으로만 변경할 수 있습니다</b></span><br />
볼륨 데이터를 표현하기 위해 iso 값을 사용하게 되면 복셀 데이터를 변경할 수 있는 유일한 방법은 iso 값을 변경하는 것입니다. 이 연산들은 간단한 수학인데요. 각 iso 값을 증감하거나 이웃간의 값을 평균내는 등입니다. 물론 distance 함수를 직접 계산해서 새로운 isosurface 모양을 꾸겨넣을 순 있지요. (이 distance 함수에 대해서는 위에 링크를 걸어둔 튜토리얼을 참고해 주세요.)<br />
<br />
iso 값과 최종 메쉬의 모양과는 1:1 관계가 없습니다. 즉 "이 edge를 0.2미터 오른쪽으로 늘리고 싶어. 그러니 복셀 값을 0.752로 바꿔야지!"라는 말을 할수가 없어요. 다시 말하면 최종 모양을 세밀하게 조절할 방법이 없습니다. 복셀의 밀도(density)를 아주 높이 올려도 (예: 1센치당 복셀 하나) 역시 마찬가지입니다. 이게 바로 제가 간접적으로만 복셀을 편집할 수 있다고 한 이유죠.<br />
<br />
매우 뾰쪽한 edge를 가진 메쉬를 생성하는 새로운 알고리듬들도 있긴 합니다. 하지만 이 방법들은 복셀 편집을 위해 만들어진게 아닙니다. (자세한건 다음 섹션에서....)<br />
<br />
<span style="font-size: large;"><b>3. 전통적인 마칭 큐브(marching cube)면 충분합니다</b></span><br />
방금 말씀드렸듯이 iso데이터에서 메쉬를 생성하는 새로운 리서치들이 있습니다. 특히 <a href="http://graphics.im.ntu.edu.tw/~robin/docs/eg05-final-prt.pdf">Cubical Marching Square와</a> <a href="http://www.nvidia.com/object/nvidia_research_pub_018.html">Efficient Voxel Octree</a>가 꽤 주목할만한 리서치들인데요.<br />
<br />
CMS는 매우 날카로운 edge를 생성할 수 있습니다. 단, 한가지 조건이 있습니다. 폴리곤 데이터로부터 iso값을 capture해야만 하지요. 이 방법은 큐브 표면에서 각 폴리곤 edge가 만나는 거리를 인코딩하는 방법으로 작동하거든요. 근데 실시간으로 이 데이터를 편집하려면(예: <a href="http://www.terathon.com/c4engine/index.php">C4 engine이</a>나 <a href="http://3d-coat.com/">3D Coat</a>에서 하는 것처럼) 꽤 힘들겠죠? 저도 edge의 교차점을 제대로 보존하면서 이 데이터를 편집할 실용적인 방법을 찾는데 실패했습니다.. ㅠ_ㅠ<br />
<br />
EVO는 폴리곤 생성을 하는 기법이 아닙니다. 이건 CUDA에서 레이트레이싱을 하면서 실시간으로 복셀을 화면에 그려주는 기법입니다. 실시간으로 돌리만큼 꽤 빨라요. (보고 꽤 감동받았습니다. 데모한번 실행해보세요 ^_^) 그리고 복셀 데이터를 볼륨이 아닌 표면(2D 비슷한) 데이터로 저장했다는게 꽤 주목할만 합니다. 하지만 똑같은 문제점이 있지요. 이 데이터를 편집할 수 있는 쉬운 방법이 없어요 -_-<br />
<br />
즉, 이 새로운 기법들은 모두 폴리곤 데이터를 복셀데이터로 캡춰한 뒤 아무런 수정없이 다시 보여주는데 유용한 방법이란 겁니다.<br />
<br />
물론 <a href="http://en.wikipedia.org/wiki/Marching_cubes">전통적인 MC</a>와 CMS를 사용해서 메쉬를 생성해내면 결과가 조금 달라집니다. 하지만 폴리곤 데이터를 완벽하게 재현해내는게 목적이 아니라 복셀 데이터 편집이 목적이라면 그 차이점은 무시해도 될 수준입니다. 편집툴에서 고치는 즉시 결과가 보이기만 하면(WYSIWYG) 어떤 방법을 써도 별 차인 없거든요. 하지만 MC가 CMS보다 최소 30% 이상은 빠릅니다. (둘다 최적화를 하지 않은 C# 프로그램에서 테스트해봤습니다. 물론 당연히 멀티쓰레딩은 했구요)<br />
<br />
<span style="font-size: large;"><b>4. 정점버퍼를 최적화하세요</b></span><br />
10 x 10 x 10 복셀에서 메쉬를 생성하면 삼각형이 1~2천개 정도 나오는건 예사입니다. 복셀 밀도가 높고 월드가 넓으면, 1500만개 삼각형도 금방 씁니다. 이 엄청난 정점 데이터를 GPU로 보내려면 느리더라구요. 고사양 그래픽 카드와 저사양 그래픽 카드에서 모두 테스트 해봤는데 둘 다 엄청 느렸습니다... -_-<br />
<br />
그러니 간단한 정점버퍼 최적화라도 해주세요. 삼각형들 끼리 정점을 공유하고 인접 표면들끼리의 법선을 평균내는 것 등이요. 이러면 정점버퍼의 크기를 30~50% 정도 줄일 수 있습니다.<br />
<br />
<span style="font-size: large;"><b>5. level-of-details을 쓰세요</b></span><br />
정점들을 공유하는것 만으론 충분치 않습니다. 1500만개에서 30~50% 세이브해도 여전히 삼각형 수가 800~1000만 정도거든요. LOD 메쉬도 생성해주세요. 복셀 공간에서 메쉬를 생성하려면(아마 그러셔야 할껄요?) 매 n번째 복셀을 샘플링 하는 방법으로 LOD 메쉬를 만들면 됩니다. (LOD1은 매 2번째, LOD2는 매 4번째 등으로요..)<br />
<br />
CMS를 사용하면 LOD를 만드는 게 그리 어렵지 않습니다. 이 알고리듬은 교차점 정보를 가지고 있으므로 LOD사이에서 끊김 현상이 없거든요. 하지만 제가 권해드린 것처럼 MC를 사용하신다면 틈이 벌어집니다. 이 틈을 메꾸는걸 아직 시도해보진 않았습니다만.. 만약 그런다면 <a href="http://www.terathon.com/voxels/">TransVoxel 알고리즘</a>을 먼저 시도해볼거 같습니다. <a href="http://donw.org/b/?d=2012-12-20-14-42-56">Don Williams 아저씨도 이 방법을 써서 성공했다더군요.</a><br />
<br />
높은 LOD 폴리곤으로부터 낮은 LOD들을 생성하는 방법도 있습니다. 이러면 복셀 데이터를 직접 사용하지 않아도 되지요. <a href="http://procworld.blogspot.ca/2012/01/trip-to-voxel-farm.html">Voxel Farm이 이 방법을 씁니다</a>. 이 방법의 장점이 하나 있는데요. 높은 LOD 메쉬를 재투영(reproject)해서 낮은 LOD 메쉬에 사용할 노말맵을 만들수 있습니다. 하지만 메쉬 단순화(simplification)는 제 입맛에 안맞더군요. 자세한 이유는 역시 다음 섹션에서... -_-<br />
<br />
<span style="font-size: large;"><b>6. 메쉬 단순화(simplication)이 입맛에 안맞을 수도 있습니다</b></span><br />
정점 데이터를 최적화 하는 다른 방법으로 메쉬 단순화 기법이 있습니다. <a href="http://procworld.blogspot.ca/2011/10/playing-dice-with-mesh-simplification.html">Voxel Farm이 이 방법을 사용하고 결과도 그닥 나쁘지 않습니다</a>. 하지만 전 별로 맘에 안들었습니다. 합쳐질 삼각형과 그러지 않을 삼각형들을 제 맘대로 선택할 수 있는 방법이 매우 제약적이기 때문입니다. 이 삼각형들 선택은 어떤 오차계산(error calculation) 알고리듬을 선택하느냐에 따라 다른데요. 모든 경우에 제대로 작동하는 함수를 도무지 찾을 수가 없더라구요.<br />
<br />
이 방법이 다른 분들의 용도에 안맞는다는 말은 아닙니다. 그냥 저에겐 안맞았습니다.<br />
<br />
<br />
자.. 그럼 이정도면 된듯 하니... 즐겁게 복셀을 주무르세요~ 하악x2~ <br />
<br />
포프Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5281384917275132568.post-89942348408472770942013-11-26T08:30:00.000+09:002013-11-26T08:30:02.816+09:00알파혼합 가능한 RGBM<div>
<b><span style="font-size: x-large;">RGBM이란?</span></b></div>
<div>
fat 버퍼(채널당 16비트)를 써서 HDR 렌더타겟을 저장하는게 가장 직관적인 방법입니다. 하지만 이러기엔 속도가 너무 느렸고 메모리도 많이 잡아먹었죠. 그래서 보통 HDR을 8비트/채널 버퍼에 인코딩(패킹)하곤 했었습니다. 다양한 패킹 방법들이 존재하는데 아마 그중에서 가장 널리 사용했던건 <a href="http://graphicrants.blogspot.ca/2009/04/rgbm-color-encoding.html">RGBM</a> 이었을겁니다. (이 링크에는 LogLUV 패킹 방법에 대해서도 잘 나와있으니 잘 모르시는 분은 읽어보세요...무.. 물론 영어 -_-)</div>
<div>
<br /></div>
패킹이라... 음.. 좋은 놈이지요... bandwidth하고 메모리 둘다 절약해 줬거든요...<br />
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>RGBM의 단점</b></span></div>
<div>
근데 문제가 있었습니다.. 아티스트분들이 엄청 좋아하는거 하나를 할 수 없거든요.. 넵. .알파 블렌딩 입니다.. -_-<br />
<br /></div>
<div>
RGBM버퍼를 사용하면 알파블렌딩을 할 수 없는게 현실입니다. 달리 말하면 투명한 물체들을 못쓴다는거지요... 왜냐구요? RGBM을 사용할때 블렌딩을 하려면 다음과 같은 공식을 돌려야 합니다.<br />
<br /></div>
<div>
<b><i>( DestColor * DestMultiplier * InvSrcAlpha + SrcColor * SrcAlpha ) / SrcMultiplier</i></b></div>
<div>
<br /></div>
<div>
여기서 몇몇 매개변수들을 좀 살펴보지요.</div>
<div>
<ul>
<li><b>DestMultiplier</b>: DestAlpha 채널에 저장되어있습니다. 블렌딩 유닛이 쉽게 사용할수 있지요</li>
<li><b>SrcMultiplier</b>: 셰이더에서 알파채널로 출력(output)합니다</li>
<li><b>SrcAlpha:</b> 투명값입니다. 근데.. 이걸 어디다 저장하죠? 보통 같으면 알파채널이죠.. 근데 RGBM을 사용하면 .... 이미 multiplier를 알파채널에 출력하니... 바.. 방법이..... 아.. 맞다.. "<i><b>premultiplied alpha.</b></i>" 라는게 있었죠? 셰이더 안에서 SrcColor에 알파값을 미리 곱해주면 됩니다. 대충 해결했군요.</li>
<li><b>InvSrcAlpha</b>: 하지만 바로 여기가 모든게 개판나는 곳입니다. 투명값을 더 이상 출력하지 않으니 InvSrcAlpha를 블렌딩 유닛에서도 쓸수 없고, 이걸 셰이더안에서 DestColor에 미리 곱해줄 방법도 없지요. 넵.. 망했습니다 -_-;</li>
</ul>
<div>
<br /></div>
</div>
<div>
<span style="font-size: large;"><b>기존의 해결방법</b></span></div>
<div>
그래서 이 문제를 해결하기 위해 먼 짓을 했냐구요?.... 아무짓도 안했습니다... -_- 그냥 렌더타겟을 하나 더 만들어서 문제를 피해갔지요. 모든 투명한 물체들을 HDR 인코딩 없이 이 새로운 버퍼에 그렸습니다. 그리고 나중에 그 결과를 신(scene) 버퍼에 합쳤지요.<br />
<br /></div>
<div>
간단히 말해 불투명(opaque)한 물체들은 HDR에 그리고 투명한 물체들은 LDR에 그리는 겁니다. 하지만 이러면 전체화면(fullscreen) 패스를 한 번 더 돌려서 버퍼들을 합쳐줘야 하므로 속도저하의 문제가 있었습니다. 그래서 속도저하를 좀 줄여보고자 투명버퍼의 크기를 절반 또는 1/4로 줄여주는 꼼수를 쓰기도 했지요.<br />
<br /></div>
<div>
뭐, 이래저래 여전히 RGBM 버퍼만 하나 쓰는것보단 메모리를 더 먹었습니다.</div>
<div>
<br /></div>
<div>
<b><span style="font-size: x-large;">혼합가능한(Blendable) RGBM</span></b></div>
<div>
자, 그럼 제가 최근에 고안해낸 꼼수를 알려드리겠습니다. 혼합가능한(Blendable) RGBM이라 이름을 붙였구요. 일단 간단히 요약부터 해보죠.</div>
<div>
<ul>
<li>투명한 물체들을 수학적으로 올바른 방법으로 혼합합니다</li>
<ul>
<li>따라서 별도의 메모리를 필요로 하지 않습니다.</li>
</ul>
<li>투명한 픽셀들은 이전에 HDR 버퍼에 그려졌던 불투명 픽셀의 multiplier를 그대로 사용합니다.</li>
<li>하지만 정밀도(precision)의 문제가 생길수 있는데요. 특히 불투명 픽셀과 투명 픽셀의 값이 크게 차이가 날 경우 그렇습니다.</li>
<ul>
<li>투명 물체가 픽셀값을 어둡게 만들경우 벤딩(bending) 효과가 나타날 수 있습니다.</li>
<li>또, 투명 물체가 픽셀을 어느정도 이상으로 밝게 만들수도 없습니다. (불투명 픽셀의 multiplier가 허용하는 것 이상으로 밝게 만드는게 불가능합니다)</li>
</ul>
</ul>
<div>
자..그럼 이제 좀 차근차근 대충대충 설명해보죠..</div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>일단 수학공식에 맞추기</b></span></div>
</div>
<div>
RGBM 혼합공식을 다시 봅시다:</div>
<div>
<br /></div>
<div>
<b><i>( DestColor * DestMultiplier * InvSrcAlpha + SrcColor * SrcAlpha ) / SrcMultiplier</i></b></div>
<div>
<br /></div>
<div>
InvSrcAlpha 때문에 망했다고 전에 말씀드렸죠? 이건 셰이더에서 알파채널 값에 SrcMultiplier를 넣기 때문이었습니다. 그럼 이걸 어떻게 해결할까요? 간단 합니다.. 그냥 SrcMultiplier를 버리면 됩니다.. -_-;;;;; 농담이 아닙니다.. -_-;;;; SrcMultiplier와 DestMultiplier를 같게 만들면 됩니다. 즉 DestMultiplier만 쓰면 되죠. 이따위 짓을 하고 나면 공식이 이렇게 변합니다:<br />
<br /></div>
<div>
<b><i>( DestColor * DestMultiplier * InvSrcAlpha + SrcColor * SrcAlpha ) / </i></b><b><i>DestMultiplier</i></b></div>
<div>
<br /></div>
<div>
이걸 풀면 이렇게 간단히 되죠.</div>
<div>
<br /></div>
<div>
<b><i>DestColor * InvSrcAlpha + SrcColor * SrcAlpha / </i></b><b><i>DestMultiplier</i></b></div>
<div>
<b><i><br /></i></b></div>
<div>
자, 이제 알파채널을 사용하지 않으니 SrcAlpha를 그냥 알파채널에 써주면 됩니다. 끝~<br />
<br /></div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>올바른 블렌딩 렌더스테이트 설정</b></span></div>
<div>
전 하드웨어 블렌딩 연산을 가지고 노는걸 좋아합니다. 가끔 기발한 짓을 할수 있거든요. <a href="http://kblog.popekim.com/2012/10/kgc-2012_12.html">예전에 스크린 스페이스 데칼 만들 때도 그런짓을 했지요</a>. 이번에도 또 사고쳤답니다 -_- ㅋㅋ</div>
<div>
<br /></div>
<div>
위에서 보여드렸던 블렌딩 공식에 껴 맞추려면 다음과 같이 렌더스테이트를 바꿔주면 됩니다:</div>
<div>
<ul>
<li><b>SrcBlend</b>: DestAlpha</li>
<li><b>DestBlend</b>: InvSrcAlpha</li>
</ul>
</div>
<div>
이렇게 하고나면 위의 혼합공식에 매우 가까워졌지요. 하지만 아직 한가지가 빠져있군요. SrcAlpha를 곱해주는 부분입니다. 이미 SrcBlend를 DestAlpha로 해줬으니 SrcAlpha를 블렌딩 하드웨어에 설정해줄 방법은 없군요. 해법이 뭐냐구요? 전에 했던것처럼 그냥 premultiplied alpha를 다시 쓰면 됩니다. ^_^ 셰이더에서 SrcColor에 SrcAlpha를 미리 곱해주세요.<br />
<br />
자, 그럼 모두 다 해결된건가요?.... 불행히도 아닙니다.. ( -_-) 위 블렌딩 스테이트 까지 설정해준 다음엔 공식이 이렇게 되거든요.</div>
<div>
<br /></div>
<div>
<b><i> DestColour * InvSrcAlpha + SrcColor * SrcAlpha * </i></b><b><i>DestMultiplier</i></b></div>
<div>
<br /></div>
<div>
퉤.. -_- DestMultiplier를 나눠줘야 하는데 곱해주고 있군요.... 이걸 고치려면 RGBM 인코딩/디코딩 하는 법을 좀 바꿔주면 됩니다.</div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>RGBM 인코딩/디코딩 방법 바꾸기</b></span></div>
<div>
RGBM 인코딩/디코딩을 하는 오리지날 방법은 다음과 같습니다.</div>
<div>
<ul>
<li><b>M</b>: max(RGB)</li>
<li><b>encoding</b>: RGB / M</li>
<li><b>decoding</b>: RGB * M</li>
<li><b>alpha encoding</b>: M / 6</li>
</ul>
<div>
이걸 제대로 돌게 만드려면 M을 역으로 뒤집어주면 됩니다. 그러면 인코딩시엔 곱하고 디코딩시엔 나눠줄 수 있습니다. M을 뒤집어주면 대충 이렇게 됩니다.</div>
</div>
<div>
<br /></div>
<div>
<ul>
<li><b>M</b>: 1 / clamp( length(RGB), 1, 6 )</li>
<li><b>encoding</b>: RGB * M</li>
<li><b>decoding</b>: RGB / M</li>
<li><b>alpha encoding</b>: M</li>
</ul>
</div>
<div>
max(RGB)대신에 length(RGB)를 사용한 이유는 나중에 투명한 물체가 픽셀을 더 밝게 만들 수 있도록 좀 마진(margin)을 준것입니다. 여기서 M을 계산하는 방법은 좀 핵(hack)이라 생각하는데요. 저 공식에 있는 1(두번 나옴)을 0.125같이 작은 수로 바꾸면 LDR에서 정밀도(precision)가 좀 더 나을겁니다. 그런데 이걸 1으로 두면 나중에 투명패스에서 사용할 수 있는 색상값의 범위가 최소한 0~1은 되니.. 그걸 보장하기 위해 저렇게 뒀습니다.. 뭐든간에... 이것보다 훨씬 괜찮은 M 계산법을 다른 분들이 찾아낼거라 믿습니다... :)<br />
<br /></div>
<div>
<span style="font-size: large;"><b>드디어 새로운 블렌딩 공식!</b></span></div>
<div>
이제 이리저리 다 뜯어 고쳤으니 드디어 공식이 완성되었습니다:</div>
<div>
<br /></div>
<div>
<b><i>( DestColor / DestMultiplier * InvSrcAlpha + SrcColor * SrcAlpha ) * </i></b><b><i>DestMultiplier</i></b></div>
<div>
<br /></div>
<div>
이걸 전개하면 다음과 같이 됩니다.</div>
<div>
<br /></div>
<div>
<b><i>DestColour * InvSrcAlpha + SrcColor * SrcAlpha * </i></b><b><i>DestMultiplier</i></b></div>
<div>
</div>
<div>
<br />
무하하하하 -_- 블렌딩 렌더스테이트에서 나온 계산하고 똑같죠? 드디어 완성되었습니다.. -_-v</div>
<div>
<br /></div>
<div>
<div>
<span style="font-size: large;"><b>Alpha 쓰기 끄기</b></span></div>
<div>
잠만요.. 근데 투명값을 알파채널로 출력(output)해주면 HDR 버퍼에 이미 적혀있던 multiplier를 덮어 쓰겠네요? 그럼 안되지요. 알파값은 블렌딩 유닛에서만 필요한거니, 이게 렌더타겟에 적히는 걸 막아야합니다.<br />
<br />
이것도 역시 렌더스테이트에서 alpha 쓰기를 마스킹해주는 것만으로 간단히 해결됩니다.</div>
<div>
<br /></div>
</div>
<div>
<span style="font-size: large;"><b>가산혼합(Additive Blending)</b></span></div>
<div>
제 방법은 가산혼합과도 잘 동작합니다. 블렌딩 스테이트를 다음과 같이 바꿔주세요</div>
<div>
<ul>
<li><b>SrcBlend</b>: DestAlpha</li>
<li><b>DestBlend</b>: One</li>
</ul>
</div>
<div>
<span style="font-size: large;"><b>주의점</b></span></div>
<div>
앞서 밝혔다 싶이, 이 방법에는 두가지 단점이 있습니다.</div>
<div>
<ul>
<li>투명한 물체가 픽셀을 너무 어둡게 만들면 벤딩효과가 보일겁니다. 정밀도가 모잘라서 인데요. 이건 이미 버퍼에 있던 픽셀들이 HDR 영역에 있었을때만 보이는 현상입니다.</li>
<li>투명한 물체가 픽셀값을 어느정도 이상으로 밝게 만들지 못합니다. 여기서 어느정도라 하면 불투명 픽셀들이 내뱉어낸 multiplier에서 허용하는 한도입니다.</li>
</ul>
<div>
<br /></div>
</div>
<div>
혼합가능한 RGBM을 어느상황에나 사용할 수 있는건 아닙니다. 특별한 상황에서만 사용가능한데요. 실제 게임 만들면서 그런 상황을 본적이 있습니다. 뭐든간에 성능 또는 메모리상의 이유로 버퍼를 따로 하나 만들수 없고 비주얼 퀄리티를 약간 희생시킬 수 있다면 사용하세요. 결국 비주얼 퀄리티와 메모리간의 밸런스 문제니까요.<br />
<br /></div>
<div>
<br /></div>
<div>
<b>p.s.</b></div>
<div>
새로운 콘솔용 게임을 만드시는 분들에게 HDR 패킹은 더이상 필요없을지도 모르겠습니다. 하지만 아직도 후진(?) 하드웨어 용으로 게임을 만드시는 분들이 계실테니, 그분들께 도움이 되었으면 하는 맘에서 오랜만에 동영상이 아닌 블로그 글을 썼습니다.. ^_^<br />
<br /></div>
<div>
<br /></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
<div style="margin: 0px;">
포프였습니다.</div>
<div style="margin: 0px;">
<br />
<br /></div>
</div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5281384917275132568.post-12750570030530491582013-11-22T14:00:00.000+09:002013-11-22T14:00:04.490+09:00VC++ 최적화된 코드 디버깅 하기사실 게임프로그래머들 중에 release 빌드, 즉 최적화된 코드, 에서 디버깅하는 사람들이 많습니다. 이유는 뭐.. 당연히 debug빌드가 졸라 느린 경우가 있기 때문이지요.<br />
<br />
근데 그럴때마다 watch 창에서 로컬변수들 보면 다 깨져나왔죠? ???? 로 나오거나 아니면 아예 잘못된 넘으로 나오던가요. 이걸 해결하려고 디스어셈블리보면서 register에 들어있는 메모리주소를 watch 창에서 casting해서 보는 경우도 있지요. 근데 디스어셈블리 보는게 꽤 귀찮은 짓인건 맞아요..<br />
<br />
근데 이게 Visual C++ 2012부터 지원해주더라구요. 사실 공식적인 지원은 아닙니다. 그냥 내부적으로 마이크로소프트사에서 만들어서 다른 용도로 쓰고 있던 걸 <a href="http://randomascii.wordpress.com/2013/09/11/debugging-optimized-codenew-in-visual-studio-2012/">누가 찾아낸 것 뿐이거든요.</a> <a href="http://msdn.microsoft.com/en-us/library/958x11bc.aspx">공식적으로 문서화 되어있는 스위치도 아닙니다</a>. 하지만 현재 VC2012하고 2013에서 다 돕니다. 잘 돕니다.<br />
<br />
자 그럼 어케 하냐.... 컴파일러에 이 스위치 하나 넣어주면 됩니다.<br />
<br />
<span style="font-size: large;"><b>/d2Zi+</b></span><br />
<br />
이 스위치 하나 넣어주시면 됩니다.<br />
<br />
실험결과 exe파일은 전혀 손대지 않습니다. pdb파일만 좀 바뀝니다. <b>고로 그냥 release빌드에서 켜주셔도 아무 문제가 없을것 같습니다.</b><br />
<br />
p.s. 귀찮아서 스샷 생략합니다.<a href="http://randomascii.wordpress.com/2013/09/11/debugging-optimized-codenew-in-visual-studio-2012/"> 이거 찾아내신 분의 블로그에서 그냥 보세요</a> ㅎㅎ<br />
<br />
끝.<br />
<br />
포프<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-8715638574862939032013-10-16T08:00:00.000+09:002013-10-16T08:00:04.784+09:00[KGC 2013] 컴오히의2의 겨울 렌더링 기법제 전 동료 다니엘이 KGC 2013에서 강연했던 컴오히2의 겨울 렌더링 테크 발표입니다. 다니엘의 부탁으로 제 블로그에 따로 올립니다..<br />
<br />
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="486" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/26765990" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;" width="597"> </iframe> </div>
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/proyZ/daniel-barrero-coh2renderingtech" target="_blank" title="Company of Heroes 2 (COH2) Rendering Technology: The cold facts of recreating the hardest winter conditions of World War 2">Company of Heroes 2 (COH2) Rendering Technology: The cold facts of recreating the hardest winter conditions of World War 2</a> </strong> from <strong><a href="http://www.slideshare.net/proyZ" target="_blank">Daniel Barrero</a></strong> </div>
Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-45517214750798307812013-10-02T08:30:00.000+09:002013-10-14T14:07:48.998+09:00아티스트에게 사랑받는 3DS Max 우버쉐이더약속 드린대로 올해 강연했던 pt자료 공유합니다. 강연장이 가득 차서 뒤에 서계신분들도 많았고 아티스트/프로그래머 비율이 반반이라 꽤 즐거웠던 강연이었습니다. ^_^<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="486" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/26700918" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;" width="597"> </iframe> </div>
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/blindrendererkr/3ds-max-26700918" target="_blank" title="아티스트에게 사랑받는 3DS Max 우버쉐이더">아티스트에게 사랑받는 3DS Max 우버쉐이더</a> </strong> from <strong><a href="http://www.slideshare.net/blindrendererkr" target="_blank">포프 김</a></strong> </div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-59227535576992826972013-09-13T08:00:00.000+09:002013-09-14T11:25:30.682+09:00[KGC2012] 최대로 효과적인 프로듀서 되기스티브가 KGC 2012에서 강연했던 The Producer란 강연입니다. 부제는" 최대로 효과적인 프로듀서 되기"이군요.<br />
<br />
스티브가 아직까지 안올렸기에 허락을 받고 제가 올리는 겁니다 ^_^<br />
<br />
스티브는 올해에도 KGC에 강연하러 옵니다 ^_^/<br />
<br />
<iframe frameborder="0" height="400" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/26119037" width="476"></iframe>
<br />
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-41468435033846136092013-09-09T08:30:00.000+09:002013-09-09T08:30:02.347+09:00한국인이 잘못쓰는 영어: No<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/ln6FqT8xnY0" width="640"></iframe>
</div>
<br />
한국인이 잘못쓰는 영어 두번째 시리즈는 "No" 입니다.Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-5281384917275132568.post-38978478084486758692013-09-05T14:21:00.002+09:002013-09-06T14:14:52.325+09:00제 이력위조에 대한 의혹...페북에서 강산아 님이 소환하셔서 이런글이 있단걸 알았네요. 여기가서 보시면 잘 나와있습니다. 제가 강산아님에게 페북으로 답 달아드린것도 있구요.<br />
뭐 여태까지 의혹이 있으셨다면 보고 판단하시기 바랍니다.<br />
<br />
<b><a href="http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&page=1&page_num=35&select_arrange=headnum&desc=asc&sn=off&ss=on&sc=on&keyword&no=2272&category"><span style="font-size: large;">"""게임임코디에 실린 제 이력위조에 대한 의혹글"""</span></a></b><br />
<br />
<br />
참고로 말씀드리면... <b>넵.. 저 제자랑 아주 잘합니다... 잘못된건가요?</b><br />
<br />
<b>업데이트 (2013/9/6): </b>게임코디에 싫어요 투표가 많아서 회원이 아니면 본문이 안보인다는군요.. 본문을 캡춰해서 놨습니다. 댓글은 다 볼수 있는데 본문만 못본다는게 좀 이상하군요 -_-a<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhskp_BiDUgpeZuX6V_kYllx2M9w29dv_r49tzKX4t-1ogrhfSvDLPBTeDdHKhH5T3H3KF-c7H4i_jUWkhHclMLqpzlIVTQZVLP4PPyRdz7BEDdsmoD9aTCx2HD0Lq_OV7w0aKG1JKrSDQx/s1600/K-20130906-034140.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhskp_BiDUgpeZuX6V_kYllx2M9w29dv_r49tzKX4t-1ogrhfSvDLPBTeDdHKhH5T3H3KF-c7H4i_jUWkhHclMLqpzlIVTQZVLP4PPyRdz7BEDdsmoD9aTCx2HD0Lq_OV7w0aKG1JKrSDQx/s640/K-20130906-034140.jpg" width="640" /></a></div>
<br />Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com21tag:blogger.com,1999:blog-5281384917275132568.post-90504153976362156332013-08-07T12:42:00.000+09:002013-08-07T12:42:00.954+09:00셰이더 프로그래밍 입문 틀린내용 업데이트(1쇄/2쇄)최근에 현정님이 셰이더 프로그래밍 입문 1쇄에서 오타를 하나 찾아주셨는데... 1쇄 2쇄 공통 적용됩니다. 찾아주신 <b>이쁜</b> 현정님께 감사의 말씀 드립니다.<br />
<br />
<br />
p.154<br />
<br />
행기준 행렬<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">| Tx Bx Nx | -> | Tx Bx Nx | </span><br />
<span style="font-family: Courier New, Courier, monospace;">| Ty By Ny | | Ty By Ny | </span><br />
<span style="font-family: Courier New, Courier, monospace;">| Tz <b>By</b> Nz | | Tz <b>Bz</b> Nz | </span><br />
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<br />
여태까지 찾은 모든 잘못된 내용은 아래 페이지에 있습니다.<br />
<a href="http://kblog.popekim.com/2012/10/1.html">셰이더 프로그래밍 입문 정오표</a>Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-29766956488588132932013-07-31T10:17:00.000+09:002013-07-31T10:17:00.617+09:00유니티 prefab에서도 enum은 int일뿐사실 C++ 에서 enum을 많이 쓰는 이유는 enum자체가 int값이랑 별 다르지 않기 때문입니다. 예를 들어<br />
<br />
enum eAnimal<br />{<br />
ANIMAL_DOG,<br />
ANIMAL_CAT<br />
};<br />
<br />
이 있으면 ANIMAL_DOG은 0, ANIMAL_CAT은 1에 불과할 뿐이죠.<br />
<br />
int dogIndex = ANIMAL_DOG;<br />
<br />
이런게 아무 문제 없이 되었으니까요. 이제는 C#부터 비롯한 다양한 언어에서(아마 C++ 차세세대 규격도 그랬던듯) enum을 strong type으로 다뤄서 저런게 쉽게 안되게 하긴 하는데 그래도..<br />
<br />
int dogIndex = (int)ANIMAL_DOG;<br />
<br />
하면 여전히 dogIndex는 0이 됩니다.<br />
<br />
근데 C#에서 재밌는게 enum으로 부터 스트링 값을 뽑아올수가 있지요. 즉 ANIMAL_DOG을 실행중에 "ANIMAL_DOG"이라 문자열로 가져올수도 있는겁니다. 그래서 유니티를 만지면서 함 실험을 해봤습니다. 유니티에서 prefab을 만들면 그 값을 기억하는데 이때 enum 형을 기억하면 과연 문자열을 기억하는지 아니면 int로 기억하는지 궁금했어요.<br />
<br />
사실 은근 string으로 저장되길 바랬습니다... string으로 저장하면 이런게 되거든요..<br />
만약 prefab에 ANIMAL_CAT을 저장해눴는데.. 그 후에 eAnimal에 새로운 놈을 추가하면..<br />
<br />
enum eAnimal<br />{<br />
ANIMAL_DOG,<br />
ANIMAL_MOO,<br />
ANIMAL_CAT<br />
};<br />
<br />
나중에 그 prefab을 읽어와도 숫자 1이 아닌 "ANIMAL_CAT"으로 읽히기에 중간에 다른 놈을 삽입해도 아무 문제가 없다는거죠...<br />
<br />
근데 실험해보니... ANIMAL_MOO가 읽히더군요 -_-;<br />
<br />
뭐 그래서 유니티에서 prefab저장할때 enum은 int 저장되는겁니다... 뭐 이거의 장점도 있어요.... 이름 바꾸긴 편하죠.. ANIMAL_CAT을 ANIMAL_MEOW로 바꿔도 아무 문제가 없거든요.<br />
<br />
그럼 이상 후다닥 -_-<br />
<br />Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com0tag:blogger.com,1999:blog-5281384917275132568.post-81145138417714702992013-07-24T12:35:00.000+09:002013-07-24T12:35:00.187+09:00셰이더 프로그래밍 입문 GLSL 소스코드(비공식)제가 출판했던 셰이더 입문 책의 샘플이 HLSL로 되어있는데 GLSL로 바꾸서 본인 블로그에 공개해주신 분이 계시더군요. 혹시라도 GL쪽을 더 많이 하시는 분들을 위해 여기에 링크를 걸어둡니다. 제목에 써놨듯이 비공식이며... 혹시라도 소스코드에 문제가 있더라도 전 모르는 일입니다.. 후후후 -_-<br />
<br />
자 그럼 링크입니다.. 꺄아~<br />
<br />
<br />
<a href="http://libsora.so/glsl_example/">http://libsora.so/glsl_example/</a>Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com5tag:blogger.com,1999:blog-5281384917275132568.post-17590256516639991122013-07-09T08:25:00.000+09:002013-07-09T08:25:00.280+09:00인생은 결국 놀이의 문제다.인생은 결국 놀이의 문제다. 젊어서 노느냐 아니면 늙어서 놀 수 있느냐...<br />
<br />
- 김포프 (2013년 7월 5일)<br />
<br />
<br />Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com2tag:blogger.com,1999:blog-5281384917275132568.post-65737458211696507502013-07-03T08:30:00.000+09:002013-07-03T08:30:00.332+09:00KGC 2011 열정적인 강의 모습 (응?)<div class="separator" style="clear: both; text-align: left;">
그냥 웃자고 올립니다.. ㅋㅋㅋ</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMpShPsFTPBqpZFGW-A85EY_Cgstkw-ZCNKvCzN148Q7kQ6E2hf2ovfpeFZwXlI9GAmqGVUmz-TZZo4OLAQJLBu0tzF2UebiE_r7EXla2f7HtGjBRp9oEpH6a2aPhBzXIy38n18YW3EKuv/s972/IMG_2509-MOTION.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMpShPsFTPBqpZFGW-A85EY_Cgstkw-ZCNKvCzN148Q7kQ6E2hf2ovfpeFZwXlI9GAmqGVUmz-TZZo4OLAQJLBu0tzF2UebiE_r7EXla2f7HtGjBRp9oEpH6a2aPhBzXIy38n18YW3EKuv/s640/IMG_2509-MOTION.gif" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Sv3RdRFPbLp3uR7EOfQj2FAyuUBVXGUcTVh-nV36uyaBacZvBM8vEYi74JkXtKDwjFUQoUK0v6h9MdZHyU5hRw-G6vBc0EZI6LN9O1fVz02NDnfy_ZJlUmyVqV3VLlVB030KusyuZyBD/s850/IMG_2646-MOTION.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Sv3RdRFPbLp3uR7EOfQj2FAyuUBVXGUcTVh-nV36uyaBacZvBM8vEYi74JkXtKDwjFUQoUK0v6h9MdZHyU5hRw-G6vBc0EZI6LN9O1fVz02NDnfy_ZJlUmyVqV3VLlVB030KusyuZyBD/s640/IMG_2646-MOTION.gif" width="640" /></a></div>
<br />Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com2Daegu, South Korea35.8714354 128.60144535.4593849 127.95599800000001 36.2834859 129.246892tag:blogger.com,1999:blog-5281384917275132568.post-71131059310603605502013-06-25T08:30:00.000+09:002013-06-25T08:30:00.994+09:00상처받는 이유"사람이 상처받는 이유는 자신이 컨트롤 할 수 없는 것을 바라기 때문이다."<br />
<br />
김포프(2013/6/19)Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com2tag:blogger.com,1999:blog-5281384917275132568.post-8692310171043597242013-06-22T18:07:00.001+09:002013-06-23T11:05:29.947+09:00잠을 제때 자지 않는 악순환<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<ul>
<li>잠을 제 때 자러 가지 않는다.</li>
<li>그러면 충분한(7~8시간?) 수면을 취하지 못한다.</li>
<li>그러면 다음날이 피곤하다.</li>
<li>그러면 일의 능률이 오르지 않는다.</li>
<li>그러면 뭔가 자신이 보잘것 없는거 같아 허무하다.</li>
<li>집에와도 피곤하다.</li>
<li>그러면 다른 일 할 맘이 안든다.</li>
<li>그대신 술을마신다, 웹서핑을 한다, 아니면 그냥 넋놓고 시간만 낭비한다</li>
<li>잘시간이 되도 잘 수 없다. 오늘을 알차게 보내지 못한거 같은 느낌에 내 자신이 쓸모없이 느껴진다.</li>
<li>허무하다.</li>
<li>그래서 또 악순환은 반복된다.</li>
</ul>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJHQ8k8tzMVYYv1KFgsZc6HVntAGjCiBsiF7joH8PxQ9rLsH7HjkBQ7ZTmexijIP2E7gID-sjas3zau5jGfDxWm5Ws2inGoidX_VnmbdF-A9sWlB5dbjfnG70sDWhx0g0YAdcQaH17QJY9/s1600/images.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJHQ8k8tzMVYYv1KFgsZc6HVntAGjCiBsiF7joH8PxQ9rLsH7HjkBQ7ZTmexijIP2E7gID-sjas3zau5jGfDxWm5Ws2inGoidX_VnmbdF-A9sWlB5dbjfnG70sDWhx0g0YAdcQaH17QJY9/s1600/images.jpg" /></a></div>
<br />
<br /></div>
<div>
이걸 너무나 잘 알고 있는데도 요 몇 주 이 따위로 보내는거 보면... 일이 그닥 재미가 없거나....먼가 기분이 다운인거다... 내 집이면 좋겠다. 그럼 피아노 치며 놀텐데...</div>
<div>
<br /></div>
<div style="text-align: center;">
<embed bgcolor="#ffffff" height="58" quality="high" src="http://api.v.daum.net/static/recombox2.swf?nid=46654278" type="application/x-shockwave-flash" width="400"></embed></div>
Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com4tag:blogger.com,1999:blog-5281384917275132568.post-75123549407524445732013-06-16T13:48:00.000+09:002013-06-16T13:48:00.272+09:00최고가 되는건 어렵지 않다."최고가 되는건 어렵지 않다. 하지만 본인이 최고라는 사실을 깨닫는게 되는 건 어렵다... 그 반대인 사람들은 그냥 자만할 뿐이다."<br />
<br />
김포프(2013/05/28)<br />
<br />Pope Kimhttp://www.blogger.com/profile/03943401839650233842noreply@blogger.com0