Doyub Kim

Computer graphics, software development, web,
photography, and graphic design




Main     Research     Photography     Blog     About




Programming

Rendering for Fun by doyub 2009/09/28
Sony Pictures Imageworks Open Source by doyub 2009/08/23
SCons - Working with Windows by doyub 2009/08/13
SCons - Making Library by doyub 2009/07/30
SCons - Introduction by doyub (1) 2009/04/05
Keep it Simple, Stupid by doyub 2009/03/12



Pages

1  



Rendering for Fun



User image

바쁠 수록 코딩하자. 짠 코드도 다시 짜자. 알고리듬이 서말이어도 짜야 보물이다.

그냥 참고삼아 데이터를 남기자면, 맨 위 그림은 path tracing으로 5000 samples/pixel이고 토탈 52분 걸렸음.

이상적인 조명 상황에 specular도 별로 없고 지랄맞게 생긴 BRDF도 없으면 병렬화된 path tracing이 짱인듯.

아래 그림은 ray tracing에 single scattering이며 5~10초정도 걸렸던 것으로 기억-.-a

Volume caustic을 기대하셨다면..훗..-_-

아..왜 갑자기 잠이 안오지...
2009/09/28 02:44 2009/09/28 02:44


No Trackback |  No Comment

Comments

Have your say







Sony Pictures Imageworks Open Source


User image

Sony Pictures의 Imageworks에서 개발한 프로젝트의 일부가 오픈소스로 공개되고 있네요.

opensource.imageworks.com

지금 공개된 프로젝트는 총 5개로, 쉐이더 라이브러리인 Open Shading Language,

DB 매니져인 Scala Migrations, 유체나 볼륨렌더링을 위한 Field3D 자료구조 라이브러리,

Python의 스트링 함수들을 std::string으로 구현한 pystring, Maya에서의 카메라 가이드를 위한

Maya Reticle이 있습니다.

개별 프로젝트 이름부터 자극적(?)인데요, 특히 Field3D 나 pystring 같은건

내가 짜기는 귀찮고 있으면 좋겠고 싶은 기능들이 아닌가 합니다-.-a

Maya Reticle의 경우도 아직 다운받아보진  않았지만 꽤 재밌을 것 같네요.

그 중에서도 Open Shading Language가 정말 기대가 되는데,

아쉽게도 아직 svn 저장소만 만들어져있고 소스가 업데이트 된 것 같지는 않습니다.

그리고 물론 사실 핵심 기술적인 부분들은 공개되지 않았고, 일종의 유틸리티 성격의 프로젝트들만

공개된 것으로 보입니다. Field3D도 '자료구조' 라이브러리지, 실제 시뮬레이터는 공개되지 않았죠.

살짝 생색내기같긴 합니다만, 그래도 스튜디오에서 주도적으로 오픈소스 프로젝트를 열었다는 것은

꽤 고무적인 일이네요.
2009/08/23 12:52 2009/08/23 12:52


No Trackback |  No Comment

Comments

Have your say







SCons - Working with Windows


이번 글에서는 Windows에서 SCons와 MSVC를 사용한 컴파일을 해보도록 하겠습니다.


1. 설치 및 설정

우선 Windows에는 기본적으로 Python이 설치되어있지 않습니다. 당연히. 짜증나게도.
그래서 가장 먼저 해줄 일은 Python을 설치하는 것인데, 설치 파일을 그대로 실행하면
친절히 알아서 모든 작업을 다 해줍니다.
하지만 당연히 되어야 할 부분 같은데, 제가 설치할 시에는 Python의 bin폴더가 PATH에 등록되지 않아
cmd상에서 python이라고 치면 실행되지 않습니다. 이건 간단히 시스템 속성에서 환경 변수 PATH에
python의 설치 디렉토리를 추가해주면 되겠습니다.
그리고 SCons를 받아 설치하게 되면 이 역시 설치 자체는 매우 간단하나, PATH가 잡혀있지 않으므로
SCons가 설치되는 C:\Python 디렉토리\Scripts를 역시 PATH 변수에 추가해줍니다.
그리고 마지막으로 cmd를 띄워서 scons -v라고 입력해봅니다. 제대로 버전이 뜨면 성공입니다!


2. Windows에서 컴파일하기

Windows에서 간단하게 SConstruct를 다음과 같이 입력하고 실행시키면
env Environment()
env.Program('test', 'test.cpp')
다음과 같은 에러 메시지가 뜨게 됩니다.
LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
scons: *** [main.exe] Error 1104
scons: building terminated because of errors.
아... 짜증나죠.
분명히 Visual Studio command prompt로 실행하여 환경 변수를 설정해주었음에도 불구하고,
이런 기초적인 문제가 발생하는 이유는 환경 변수만 설정 되었을 뿐, 이러한 사항들을 SCons에서
전혀 인지하고 있지 못하기 때문입니다 (하여간 Windows만 오면 문제가 복잡해짐-.-).
Visual Studio 역시 옵션을 열어보면 기본 포함/라이브러리/실행 디렉토리에 각종 환경변수들이
자리잡고 있으며, 사용자가 지정해주지 않아도 프로젝트 링커 속성에서 명령줄을 살펴보면
다양한 기초 라이브러리들이 기본적으로 링킹되고 있음을 볼 수 있습니다.
이를 해결하기 위해서는 SConstruct를 아래와 같이 작성합니다.
import os

env = Environment()

env['ENV']['PATH'] = os.environ['PATH']
env['ENV']['INCLUDE'] = os.environ['INCLUDE']
env['ENV']['LIB'] = os.environ['LIB']
env['ENV']['LIBPATH'] = os.environ['LIBPATH']
env['ENV']['WindowsSdkDir'] = os.environ['WindowsSdkDir']
env['ENV']['VCINSTALLDIR'] = os.environ['VCINSTALLDIR']

env.Program('test', 'test.cpp')
os는 매우 유용한 자료를 많이 담고 있는데, 위에서 보듯이 environ을 통해 현재 플랫폼의 다양한
환경 변수들을 가져올 수 있습니다. SCons가 MSVC에 적절한 환경 변수를 전달해주기 위해서는
위와 같은 os.environ의 정보들을 사용자가 직접 넣어주어야 합니다.
이렇게 입력한 다음 scons를 실행시키면
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
link /nologo /OUT:main.exe main.obj
scons: done building targets.
아름답게 컴파일이 이루어집니다.
2009/08/13 23:27 2009/08/13 23:27


No Trackback |  No Comment

Comments

Have your say







SCons - Making Library


이전 글에 이어서 SCons로 정적 라이브러리를 만들고 빌드 결과물들을 디렉토리별로 관리하는 방법을
알아보도록 하겠습니다.


1. 라이브러리 생성하기

SCons에서 라이브러리를 만드는 것은 매우 간단합니다. 프로그램을 생성하는 함수가 Program(...)
이었다면 라이브러리는 Library(...)로 이름만 바꿔주면 됩니다.
Library('mylib', 'foo.cpp')
패스설정을 한다든지, 다른 라이브러리를 참조한다든지 하는 것은 Program(...)과 완전히 동일합니다.
프로젝트를 관리한다면 보통 라이브러리만 생성하지는 않겠죠? 테스트 프로그램들도 동봉되는 것이
일반적입니다.
Library('mylib', 'src/mylib/foo.cpp')
env = Environment(CPPPATH=['./include/mylib'], LIBPATH = ['./'])
env.Program('test', Glob('src/test/*.cpp'))
소스는 SConstruct가 있는 폴더 아래에 src폴더가 있다고 가정하였고, 인클루드 폴더 역시 마찬가지입니다.
scons를 입력하여 실행하면 SConstruct가 있는 폴더에 libmylib.a와 test가 생성됨을 알 수 있습니다.
물론 이는 UNIX계열인 경우이며, Windows에서 MSVC를 사용할 경우는 mylib.lib 및 test.exe가 생성되겠죠.
하지만 빌드 중간 생성물인 오브젝트 파일들이 해당 cpp파일이 있는 곳에 지저분하게 생성됨을 알 수 있습니다.
빌드 결과물도 일반적으로는 다른 폴더에 (bin이나 lib등에) 생성되도록 하는 것이 보다 깔끔하겠죠.
이 문제들을 아래에서 차근차근히 해결해보도록 합시다.



2. 빌드 생성물을 디렉토리별로 분류하기

빌드 중간 생성물 및 최종 결과물들을 분류하는 컨벤션은 개인마다 다른 것 같습니다. 마치 멤버 함수 이름이
대문자로 시작하냐 마느냐의 문제와도 같은 것 같습니다. 여기서는 각종 중간 결과물들은 build 디렉토리에,
최종 라이브러리 결과물은 lib에, 최종 실행 파일은 bin에 생성된다고 가정하겠습니다. 물론 debug냐, release냐,
아키텍쳐가 뭐냐에 따라서 세부 폴더는 더 나눌 수 있겠습니다만, 여기서는 간단한 상황만 생각해보겠습니다.
우선 위의 SConstruct에 다음과 같이 입력합니다.
BUILD_DIR = 'build/'
VariantDir(BUILD_DIR, '.', duplicate=0)
이 간단한 코드에서 당연히 주목할 만한 함수는 VariantDir(...)입니다. SCons wiki에 따르면

Use the VariantDir() function to establish that target files should be built in a separate directory from the source files.

라고 하네요. 말 그대로 우리가 원하는 장소에서 빌드를 진행하겠다는 것입니다.
이 함수의 첫번째 인자는 직관적으로 중간 생성물이 담겨질 장소입니다.
두번째 인자는 소스 파일이 존재하는 곳의 루트 경로인데, '.' 을 입력한 것은 소스를 찾아가는 경로의 시작을
말 그대로,  SConstruct가 있는 현재 디렉토리로 하겠다는 것입니다.
마지막 인자인 duplicate는 소스 파일을 빌드가 일어날 디렉토리로 복사를 하느냐 여부를 결정하는
플래그입니다. 이 인자를 생략하면 1이 기본 값입니다. 1이 의미하는 바는 소스파일 전체를 빌드 디렉토리로
복사한 뒤, 그대로 해당 디렉토리에 유지하겠다는 것입니다. 0은 물론 그러지 않겠다는 것이겠죠?
원래 VariantDir함수 대신 BuildDir이라는 좀 더 직관적인 함수가 있었으나, 좀 더 넒은 의미/기능으로 사용하기
위해 해당 함수는 deprecated 되었습니다.

마지막으로 해줄 작업은 Program 및 Library함수들의 인자를 고쳐주는 것입니다. 기존의
env.Program('test', Glob('src/test/*.cpp'))
대신
import os
...
env.Program('bin/test', source=map(lambda x: BUILD_DIR + x, glob.glob('src/test/*.cpp'))
를 입력하면 됩니다. Library도 똑같은 요령으로 바꿔주면 됩니다.
기존의 Glob함수 대신 map과 lambda, 그리고 glob.glob를 사용한 다는 것을 알 수 있는데, 전자가 map형태의
파일 리스트를 넘기는 대신 후자는 list형태로 파일들을 넘겨주게 됩니다.
(이 부분은 정확한 기술 필요. lambda함수의 사용에 대한 자세한 내용은 Python 자료를 참고하세요)
결국 위의 코드가 하는 역할은 소스 경로를 기존의 src/...에서 build/src/...로 전환시키겠다는 것입니다.
이렇게 한 뒤, scons를 입력하면 깔끔하게~ 빌드 생성물들이 디렉토리 별로 정리가 됩니다.
물론 프로젝트에서 생성된 라이브러리를 사용하기 위한 설정이었던
env = Environment(CPPPATH=['./include/mylib'], LIBPATH = ['./'])
와 같은 코드는
env = Environment(CPPPATH=['./include/mylib'], LIBPATH = ['./lib'])
와 같이 바뀌어야 겠지요. 다음 번 포스팅에서는 Windows에서 SCons를 사용하는 방법을 알아보겠습니다.
2009/07/30 23:49 2009/07/30 23:49


No Trackback |  No Comment

Comments

Have your say







SCons - Introduction


SCons는 Python기반의 빌드툴이며, 나름 Makefile의 대안으로 떠오르고 있는 오픈 툴킷입니다.
어느 정도 규모를 가지는 Unix 계열의 프로젝트의 경우, 일반적으로 사용되어왔던 방식은
Autoconfig를 통한 configure를 거친 뒤, Makefile을 통한 빌드, 그리고 설치였습니다.
./configure
make all
sudo make install
기존의 이런 방식의 문제는 Autoconfig나 Makefile을 완벽히 마스터하기에 꽤 시간이 걸린다는 것이고,
빌드 코드의 가독성 및 확장성/유연성이 현저히 떨어진다는 것입니다. 저 역시 이러한 방식의 여러가지
귀차니즘 때문에-.- Xcode와 같은 IDE방식을 선호하는 편이었습니다.
이와 다르게 SCons는 이미 널리 알려진 Python함수들로 이루어진 툴입니다.
어찌보면 독립적인 프로그램이라기 보다는 거대한 Python 모듈이라고도 할 수 있겠습니다.
또한 SCons의 소스파일 자체도 Python 스크립트이기 때문에 내부적으로 Python의 다양한 기능들을
그대로 사용할 수 있다는 것이 특징입니다. 세상에 등장한지는 꽤 되었는데, 사실 아주 대중화 된 것 같지는
않습니다. 부끄럽게도 제가 SCons를 접한 것도  Google Chrome의 JavaScript엔진인 V8을
컴파일 해보면서입니다-_-; 하지만 다양한 빌드 툴 중에서 비교적 배우기 쉽고 많은 기능들을 제공하며
확장성이 좋다는 점에서 공부해보는 것이 좋을 것 같아 글을 올려봅니다.



1. 설치하기

우선 SCons를 사용하기 위해서는 Python이 설치되어 있어야 합니다. 일반적인 Unix계열의 운영체제들은
Python이 기본으로 장착되어 있습니다. Windows계열의 경우는 Python 사이트에서 간단하게 다운로드하여
설치, 사용할 수 있습니다. SCons는 공식 홈페이지 (www.scons.org)에서 다운받아 사용할 수 있습니다.
자세한 설치법은 홈페이지에 나와있습니다. Python 이외에는 종속 라이브러리가 없으므로, 큰 어려움 없이
쉽게 설치 가능합니다.



2. Hello, SCons

설치가 끝났으면 SCons를 이용하여 아주 간단한 C++프로그램을 컴파일해 보겠습니다.
가장 먼저 할 일은 프로젝트 폴더에 SConstruct라는 파일을 하나 생성합니다.
가령 main.cpp를 컴파일한다고 하면, SConstruct에 다음과 같이 적습니다.
Program('main.cpp')
그리고 커맨드 상에서
scons
라고 입력한 뒤, 엔터를 누르면 아래와 같이 SCons가 실행됩니다.
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o main.o -c main.cpp
g++ -o main main.o
scons: done building targets.
참~쉽죠~?-_-/
Program은 SCons가 새로이 정의한 Python 함수입니다.
SCons의 메시지가 보기 싫다면,
scons -Q
라고 입력합니다. 그럼 scons: 어쩌고 하는 메시지는 나타나지 않습니다.
Makefile에서는 clean에 대한 동작을 직접 정의해주어야 했었죠.
SCons는 이 상태에서 단순히
scons -c
라고만 입력하면 clean에 해당하는 동작을 실행합니다 (각종 *.o들과 최종 빌드 결과물을 삭제).
만약 복수개의 소스코드를 컴파일 해야 한다고 생각해봅시다. 그리고 실행 파일 (target)의 이름을
원하는 이름으로 바꾼다고 해보죠. 가령 main.cpp뿐만 아니라, foo.cpp, bar.cpp가 있고,
실행파일의 이름이 test가 되어야 한다고 치면, SConstruct파일을 다음과 같이 고쳐줍니다.
Program('test', ['foo.cpp', 'bar.cpp', 'main.cpp'])
눈치 채셨겠지만, 소스파일의 리스트 (를 비롯한 다양한 옵션들의 리스트)는 Python 배열로 넘겨준다는 것을
알 수 있습니다. 만일 어떤 폴더 안에 있는 모든 .cpp파일을 컴파일 해야 한다면, Glob함수를 사용합니다.
Program('test', Glob('*.cpp'))



3. 환경 변수 설정

외부 라이브러리를 사용한다면, 헤더 파일과 라이브러리 파일을 지정해주어야 합니다. gcc라면
-I와 -L, -l 옵션들에 해당하는 동작들이죠. 이런 기본적인 설정들을 비롯하여
각종 플래그, 환경 변수 설정을 담당하는 함수가 바로 Environment입니다.
가령, /usr/local/include에 설치된 헤더 파일들을 사용하고 싶다면,
env = Environment(CPPPATH='/usr/local/include')
env.Program('test', 'main.cpp')
와 같이 작성하면 됩니다. 실행 결과는 아래와 같습니다.
g++ -o main.o -c -I/usr/local/include main.cpp
g++ -o test main.o
마찬가지 원리로, 추가 라이브러리 링크를 위해서는 다음과 같이 적습니다.
만일 /usr/local/lib에 설치된 freetype (libfreetype.a)를 사용하고 싶다면,
env = Environment(LIBPATH='/usr/local/lib', LIBS='freetype')
env.Program('test', 'main.cpp')
와 같이 적습니다. 이는 아래와 같이 실행됩니다.
g++ -o main.o -c main.cpp
g++ -o test main.o -L/usr/local/lib -lfreetype
지금까지 가장 기초적인 SCons 사용법을 살펴보았는데, 다음번엔 라이브러리 작성 법,
커스텀 커맨드 옵션, 다양한 사용자화 등등등에 대해서 알아보겠습니다.
SCons는 문서화가 비교적 친절하게 잘 되어있는 편이므로, 자세한 내용들은
SCons User GuideSCons man page를 참조하세요.
2009/04/05 15:51 2009/04/05 15:51


No Trackback |  1 Comment

Comments


창민짱

2009/06/23 21:50 edit / delete reply

잘 봤습니다.^^


Have your say







Keep it Simple, Stupid


The KISS principle ("Keep it Simple, Stupid") states that design simplicity should be a key goal and that unnecessary complexity should be avoided. - Wikipedia

API설계로 며칠간을 잠못이루다가 결국 내린 결론은 이것입니다.

네, 역시 단순한게 최고입니다.
2009/03/12 03:02 2009/03/12 03:02


No Trackback |  No Comment

Comments

Have your say




Pages

1  


Copyright ⓒ 2010 Doyub Kim. All rights reserved.
Powered by Textcube, Blueprint CSS Framework 0.8 and script.aculo.us 1.8.2

Entries RSS | Comments RSS