2011년 4월 28일 목요일

[누락된 설명서] tex2Dlod()

얼마 전에 GPU상에서 텍스처의 밉맵을 만드느라 tex2Dlod() 함수를 사용할 일이 있었다. HLSL 함수인 tex2Dlod()는 텍스처좌표를 float4 변수를 받는데 이 float4의 네번째 성분이 텍스처 샘플링에 사용할 밉 레벨을 가리킨다고 한다.

여기서 날 다소 혼란스럽게 한 부분... "2번째 밉맵을 샘플링하려면 다음 둘 중에 정확히 어떤 값을 전달해줘야 하는거지?"

  1. texcoord = float4(u, v, 0, 1);

    또는
  2. texccord = float4(u, v, 0, 1 / 총 밉맵 수)

불행히도 이걸 제대로 설명해 놓은 문서를 찾지 못했다. MSDN에도 설명되어 있지 않고, 구글 검색에서도 실패....

괜히 쓸데없이 검색하느라 시간 낭비하는 사이 직장동료 바레로 박사님이 렌더 몽키를 사용해서 재빨리 테스트를 해봤더니 첫번째가 정답이란다. 즉, 두번째 밉맵을 읽어오려면 float4의 4번째 성분에 1을 대입해줘야 한다. 다시 한 번 생각해보니 D3D 샘플러 상태인 D3DSAMP_MAXMIPLEVEL을 살펴보면 제대로 유추할 수도 있었다. MSDN은 D3DSAMP_MAXMIPLEVEL을 다음과 같이 설명하고 있다:
D3DSAMP_MAXMIPLEVEL: level-of-detail index of largest map to use. Values range from 0 to (n - 1) where 0 is the largest. The default value is zero.
두번째 문장을 대충 번역하면 "0 부터 n-1 까지의 값을 사용할 것. 0이 가장 크기가 큰 밉맵(즉, 첫번째 밉맵)이다."

참고로 이렇게 정수로 밉맵 레벨을 가리키는 것은 OpenGL과 DirectX에서 동일하다.

2011년 1월 26일 수요일

윈도우 7에서 VirtualBox 설치/제거가 오래 걸릴 경우

VirtualBox 3.3과 4.0을 윈도우즈 7에 설치할 때 다음과 같은 문제점들을 겪었었다. 설치/제거 시간이 열라 오래 걸려서 취소하려고 했으나 취소조차 안되는 상태... 작업관리자(task manager)를 통해서도 프로세스를 강제종료도 안되고.... 결국엔 컴터 전원을 강제로 껏다 켜야만 회복되는 상태... 우어 -_-

좀 조사해본 결과 VirtualBox가 설치/제거시에 네트워크 연결을 가지고 좀 노는 것으로 판명... 뭔짓을 하는지는 정확히 알아내지 못했지만 이렇게 매우 쉽게 해결했다.

  1. 컴퓨터에서 인터넷 선을 뽑아버린다.
  2. VirtualBox를 설치(또는 제거)한다.
  3. 인터넷 선을 다시 꼽아준다.
끝 -_-;

2011년 1월 24일 월요일

PHP의 정수형에 대한 불만

몇년전에 PHP를 상당히 많이 썼었다. 물론 게임 렌더링 엔진의 코어에... 초당 120프레임까지 뽑아내려면 PHP가 최고다..... 는 농담이고.... ^^ 그냥 이런 저런 웹 사이트를 만드는데 많이 사용했었다.

최근에 PHP를 다시 접할 일이 있었다. 32비트 정수 값으로 표현하기엔 너무 큰 랜덤 수를 만들어 이것을 MySQL 데이터베이스에 저장하려고 했는데.. 아뿔사....

MySQL은 64비트 정수형인 BIGINT 변수형을 지원한다... 따라서 별 문제 없음... 진짜 문제는 PHP... PHP의 int는 32비트가 될 수도 있고, 64비트가 될수도 있다... 꺼억... 꼭 C같군 -_-; PHP가 설치된 컴퓨터의 비트수에 따라 달라진단다.. (또 64비트 정수를 사용하려면 64비트 PHP 버전을 따로 설치해야 할거라고 추측만 하고 있음)

이런 어이없는 짓은 C에서는 용납이 가능하다. 그냥 32비트/64비트 용으로 따로 실행파일을 만들어 배포하면 되니까.... 하지만 PHP는 웹기반이라서 이건 정말 개소리다 -_-;;; 이런 상황을 고려해보자.. PHP에서 64비트 정수를 사용하는 웹사이트를 만들어서 64비트 웹 서버에 호스팅했다고 치자.. 근데 이 호스팅 서비스가 맘에 안들어서 다른 웹호스팅 서비스로 옮기기로 맘을 먹었는데 새 호스팅 회사가 32비트 PHP를 쓴다면?..... 한마디로 왕짜증 -_-; 코드 전부다 리팩터하거나... 아예 64비트 정수를 지원하는 클래스를 스스로 짜는게 훨 낫다는 결론..... 써글 -_-?

PHP에서 64비트 정수를 사용하는 것의 또다른 문제 중 하나는 Random() 함수이다. 랜던 시드(seed)의 인자와 Random() 함수의 반환값이 모두 int이다. 따라서 64비트 정수 클래스를 커스텀하게 만든다면 이 함수를 그대로 쓸 수 있는 방법이 없다. 그 대신 이 64비트 클래스의 값을 2개의 32비트 정수값으로 바꿔서 이리저리 짜맞춰야 한다는 게지... -_-

뭐 PHP에서 정수대신에 부동소수점(floating-point) 수를 쓰면 32비트가 넘는 정수의 값을 표현할 수 있다... 하지만 정밀도(precision)의 문제가 또 있다는 게 문제.. 역시 내 입맛엔 별로 맞지 않음... -_-

오해는 하지 마시길... 난 사실 PHP를 매우 선호한다. 웹프로그래밍을 할 때 다른 언어 다 제쳐두고 언제나 찾게되는 언어가 PHP니까.. 하지만 MySQL처럼 PHP도 BIGINT형을 자체적으로 지원해야 한다고 생각한다...