뭔가 웃기면서도 슬픈 사진.....
2012년 7월 5일 목요일
2012년 6월 27일 수요일
[2.5D & 서버 개인 포트폴리오] 네트워크 FPS
- 3D 과정 1개월차
빌보드 구현, 높이맵 적용, 스프라이트 애니메이션
- 서버 프로그래밍(독학)
TCP/IP 와 쓰레드를 이용한 동기화 PVP 구현
.
2012년 6월 22일 금요일
오늘의 글귀..
가르치되 무시하지 않도록
비판하되 비난하지 않도록
솔직하되 품위를 잃지 않도록
자신감을 잃지 않되 자만으로 빠지지 않도록
겸손하되 비굴하지 않도록
사랑하되 집착하지 않도록
2012년 6월 18일 월요일
[Direct3D] 렌더링 파이프라인
렌더링 파이프라인이란?
3D 공간 상에 기하학적으로 구성된 장면에 가상 카메라를 설정하고 모니터에 2D로 표현하기까지의 일련의 과정을 랜더링 파이프라인이라고 한다.
일반적으로 아래의 9 단계로 이루어진다.
1. 로컬 스페이스
2. 월드 스페이스
3. 뷰 스페이스
4. 후면 추려내기(컬링)
5. 조명
6. 클리핑
7. 투영
8. 뷰포트 변환
9. 래스터라이징
1. 로컬 스페이스
모델링 스페이스라고도 하며 물체를 구성하는 삼각형(폴리곤) 목록을 정의하는 좌표계이다. 3D 물체를 월드 스페이스에 직접 배치하는 것보다 각각의 로컬 스페이스에 정의하는 것이 훨씬 효율적이다.
2. 월드 스페이스
로컬 스페이스의 물체들은 이동, 회전, 크기변형 등을 포함하는 월드 변환 작업을 거쳐 월드 스페이스(전역좌표계)로 옮겨진다. 월드 변환은 각 물체간의 상대적 관계를 정의하여 하나의 장면(scene)을 구성하는 것이다.
3. 뷰 스페이스
카메라의 관점에 맞추어 월드 내의 모든 기하물체를 변환하는 것을 뷰 스페이스 변환이라고 한다. 이 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 표현한다.
즉, 월드 내의 어떤 위치에 존재하는 카메라를 원점으로 옮기고, 양의 z 축 방향으로 바라보도록(한마디로 컴퓨터 모니터가 카메라 위치가 되도록) 회전과 이동을 하며, 월드내의 모든 물체도 그에 따라 변환되는 것이다.
뷰 스페이스는 2D 모니터로 Scene을 찍기 위한 중간과정이라 보면 되고 게임에서 각 물체간의 위치관계나 충돌 처리 등은 주로 월드 스페이스에서 이루어진다.
4. 후면 추려내기(backface culling)
카메라에서 보이지 않는 폴리곤의 후면을 이후의 처리에서 제거(추려내기)하는 작업이다.
D3D에서 삼각형의 버텍스는 시계방향 순서로 배치하도록 약속되어 있다. 이 삼각형이 180도 회전하여 후면으로 가게되면 버텍스 순서가 시계반대방향으로 뒤집어지는데, 이러한 삼각형들이 바로 컬링의 대상이 되는 것이다.
※ D3DRS_CULLMODE 옵션을 이용하여 동작을 변경할 수 있다.
Device->SetRenderState(D3DRS_CULLMODE, Value);
Value 에는 다음의 세 가지 중 하나를 선택적으로 사용할 수 있다.
D3DCULL NONE - 후면 추려내기 기능을 사용하지 않는다.
D3DCULL CW - 시계 방향(ClockWise) 두르기를 가진 삼각형을 추려낸다
D3DCULL CCW - 시계 반대 방향(CounterClockWise) 두르기를 가진 삼각형을 추려낸다. 디폴트 상태이다.
5. 조명
월드에 광원을 배치하여 물체에 명암 효과를 준다.
6. 클리핑
시야 볼륨(절두체) 외부의 기하물체를 추려내는 과정이다.
절두체란 시야의 각도와 최소깊이, 최대깊이로 이루어진 피라미드 형태로서 이 안에 있는 물체가 카메라의 시야 내부에 있게되는 것이다.
7. 투영
3D 장면에서 2D 표현을 얻는 과정이다. 원근 투영(perspective projection)이나 직교 투영(orthogonal projecton) 등이 있다.
원근 투영은 원근법을 살려서 가까운 물체는 크게, 먼 물체는 작게 보이도록 변환하는것으로 위에서 설명한 절두체를 2D 윈도우에 투영하는 것이다.
직교 투영은 원근감없이 수직 위에서 내려다 보듯이 투영하는 방법이며 게임에서는 미니맵 등의 2D 효과에 사용된다.
8. 뷰포트 변환
투영된 삼각형들을 뷰포트라 불리는 윈도우 좌표계로 변환하는 과정이다.
이때 z축 버퍼의 개념이 사용되어 멀리 있는 물체가 가까운 물체에 가리는 등의 처리가 이루어진다.
D3D에서는 뷰포트 변환이 자동으로 이루어진다.
9. 래스터라이즈
뷰포트 변환을 통해 2D 삼각형들의 리스트를 가지게 되는데 이 삼각형들을 그리는데 필요한 픽셀 컬러를 계산하는 과정을 래스터라이즈라고 한다.
지금까지는 버텍스 단위로 작업이 이루어졌지만 래스터라이즈 단계는 픽셀 단위로 작업을 해야하므로 상당한 부하가 걸린다. 따라서 반드시 전용 그래픽 하드웨어에서 처리되어야한다.
래스터라이즈의 결과물은 모니터에 바로 디스플레이할 수 있는 2D 이미지가 된다.
※ 위 랜더링 파이프라인은 3D 장면을 2D 화면으로 전환하는 최소의 과정만을 나타낸 것이라고 볼 수 있으며 실제로는 버텍스 셰이딩(정점의 음영처리), 지오메트리 셰이딩(정점 증감 처리), 픽셀 셰이딩, 텍스쳐 적용, 렌더 백엔드 등의 과정이 추가될 수 있다.
3D 공간 상에 기하학적으로 구성된 장면에 가상 카메라를 설정하고 모니터에 2D로 표현하기까지의 일련의 과정을 랜더링 파이프라인이라고 한다.
일반적으로 아래의 9 단계로 이루어진다.
1. 로컬 스페이스
2. 월드 스페이스
3. 뷰 스페이스
4. 후면 추려내기(컬링)
5. 조명
6. 클리핑
7. 투영
8. 뷰포트 변환
9. 래스터라이징
1. 로컬 스페이스
모델링 스페이스라고도 하며 물체를 구성하는 삼각형(폴리곤) 목록을 정의하는 좌표계이다. 3D 물체를 월드 스페이스에 직접 배치하는 것보다 각각의 로컬 스페이스에 정의하는 것이 훨씬 효율적이다.
2. 월드 스페이스
로컬 스페이스의 물체들은 이동, 회전, 크기변형 등을 포함하는 월드 변환 작업을 거쳐 월드 스페이스(전역좌표계)로 옮겨진다. 월드 변환은 각 물체간의 상대적 관계를 정의하여 하나의 장면(scene)을 구성하는 것이다.
3. 뷰 스페이스
카메라의 관점에 맞추어 월드 내의 모든 기하물체를 변환하는 것을 뷰 스페이스 변환이라고 한다. 이 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 표현한다.
즉, 월드 내의 어떤 위치에 존재하는 카메라를 원점으로 옮기고, 양의 z 축 방향으로 바라보도록(한마디로 컴퓨터 모니터가 카메라 위치가 되도록) 회전과 이동을 하며, 월드내의 모든 물체도 그에 따라 변환되는 것이다.
뷰 스페이스는 2D 모니터로 Scene을 찍기 위한 중간과정이라 보면 되고 게임에서 각 물체간의 위치관계나 충돌 처리 등은 주로 월드 스페이스에서 이루어진다.
4. 후면 추려내기(backface culling)
카메라에서 보이지 않는 폴리곤의 후면을 이후의 처리에서 제거(추려내기)하는 작업이다.
D3D에서 삼각형의 버텍스는 시계방향 순서로 배치하도록 약속되어 있다. 이 삼각형이 180도 회전하여 후면으로 가게되면 버텍스 순서가 시계반대방향으로 뒤집어지는데, 이러한 삼각형들이 바로 컬링의 대상이 되는 것이다.
※ D3DRS_CULLMODE 옵션을 이용하여 동작을 변경할 수 있다.
Device->SetRenderState(D3DRS_CULLMODE, Value);
Value 에는 다음의 세 가지 중 하나를 선택적으로 사용할 수 있다.
D3DCULL NONE - 후면 추려내기 기능을 사용하지 않는다.
D3DCULL CW - 시계 방향(ClockWise) 두르기를 가진 삼각형을 추려낸다
D3DCULL CCW - 시계 반대 방향(CounterClockWise) 두르기를 가진 삼각형을 추려낸다. 디폴트 상태이다.
5. 조명
월드에 광원을 배치하여 물체에 명암 효과를 준다.
6. 클리핑
시야 볼륨(절두체) 외부의 기하물체를 추려내는 과정이다.
절두체란 시야의 각도와 최소깊이, 최대깊이로 이루어진 피라미드 형태로서 이 안에 있는 물체가 카메라의 시야 내부에 있게되는 것이다.
7. 투영
3D 장면에서 2D 표현을 얻는 과정이다. 원근 투영(perspective projection)이나 직교 투영(orthogonal projecton) 등이 있다.
원근 투영은 원근법을 살려서 가까운 물체는 크게, 먼 물체는 작게 보이도록 변환하는것으로 위에서 설명한 절두체를 2D 윈도우에 투영하는 것이다.
직교 투영은 원근감없이 수직 위에서 내려다 보듯이 투영하는 방법이며 게임에서는 미니맵 등의 2D 효과에 사용된다.
8. 뷰포트 변환
투영된 삼각형들을 뷰포트라 불리는 윈도우 좌표계로 변환하는 과정이다.
이때 z축 버퍼의 개념이 사용되어 멀리 있는 물체가 가까운 물체에 가리는 등의 처리가 이루어진다.
D3D에서는 뷰포트 변환이 자동으로 이루어진다.
9. 래스터라이즈
뷰포트 변환을 통해 2D 삼각형들의 리스트를 가지게 되는데 이 삼각형들을 그리는데 필요한 픽셀 컬러를 계산하는 과정을 래스터라이즈라고 한다.
지금까지는 버텍스 단위로 작업이 이루어졌지만 래스터라이즈 단계는 픽셀 단위로 작업을 해야하므로 상당한 부하가 걸린다. 따라서 반드시 전용 그래픽 하드웨어에서 처리되어야한다.
래스터라이즈의 결과물은 모니터에 바로 디스플레이할 수 있는 2D 이미지가 된다.
※ 위 랜더링 파이프라인은 3D 장면을 2D 화면으로 전환하는 최소의 과정만을 나타낸 것이라고 볼 수 있으며 실제로는 버텍스 셰이딩(정점의 음영처리), 지오메트리 셰이딩(정점 증감 처리), 픽셀 셰이딩, 텍스쳐 적용, 렌더 백엔드 등의 과정이 추가될 수 있다.
2012년 6월 15일 금요일
[STL] list iterator not dereferencable 오류 메시지
위 메시지에서 dereferencable 이라는 사전에도 잘 안나오는 단어는 역참조라는 뜻인데, 이걸 해석하느라 고심할 필요는 없고 한마디로 STL에서 이터레이터로 루프를 돌릴때 로직이 잘못되었다고 보면 된다.
흔히 범하는 실수로는 반복자 삭제시 무효화 현상, 루프를 돌릴때 조건을 잘못 주는 등 여러가지가 있다.
이런 오류는 컴파일러에서 발견하지 못하고 실행중에 발생하므로 찾기가 어려운 편이다.
이런 경우 디버그를 할 때 반복자 관련 구문을 잘 살펴보면 된다.
list 뿐 아니라 vector 나 map 도 마찬가지다.
흔히 범하는 실수로는 반복자 삭제시 무효화 현상, 루프를 돌릴때 조건을 잘못 주는 등 여러가지가 있다.
이런 오류는 컴파일러에서 발견하지 못하고 실행중에 발생하므로 찾기가 어려운 편이다.
이런 경우 디버그를 할 때 반복자 관련 구문을 잘 살펴보면 된다.
list 뿐 아니라 vector 나 map 도 마찬가지다.
2012년 5월 22일 화요일
[DirectX 3D] DirectX SDK 설치와 작업환경 설정하기
다운받은 다이렉트X SDK를 압축을 풀어서 실행합니다.
참고로 저는 2007 11월 버전을 설치했습니다.
두 개 옵션에 체크한 상태로 Unzip 클릭하면 압축이 풀리고
자동으로 셋업이 시작됩니다.
설치해주시고
설치가 완료되었으면 비주얼 스튜디오에서 도구 > 옵션 선택하세요.
그리고 아래 단계를 따라주세요.
(참고로 저의 설치환경은 VS 2008 버전입니다.)
1. 프로젝트 및 솔루션 선택
2. VC++ 디렉터리
3. 포함(인클루드) 파일
4. 그림 클릭하여 새 줄 삽입
5. SDK가 설치된 폴더의 include 경로로 설정해줌.
※그림 클릭하면 커집니다
같은 방식으로 라이브러리 파일 경로도 설정해준 뒤
(여기서는 32비트 개발환경이므로 x86 디렉토리를 선택했음)
확인을 클릭합니다.
이제 필요한 헤더와 라이브러리를 다음과 같이 포함시켜
프로젝트를 작성하면 됩니다.
2012년 5월 2일 수요일
사람을 다루는 기본적인 기술
1. 상대방에게 비판, 비난, 불평을 하지 마라.
무엇이 옳고 그른것과는 상관없이 자존심에 상처를 입은 상대는 그대의 적이 되거나 자기합리화로 자신의 자존감을 지키려 할 뿐이다. 이러한 방식으로는 궁극적으로 사람을 설득할 수 없다.
2. 솔직하고 진지하게 칭찬하라.
아첨과 칭찬을 구분할 줄 알아야한다. 현명한 사람에게 아첨은 먹히지 않는다.
3. 다른 사람들의 강한 욕구를 불러일으켜라.
누구나 자신의 욕구에만 관심이 있을뿐 타인의 욕구에는 관심이 없다. 만약 당신이 타인이 원하는 것에 신경을 쓰는 버릇을 들인다면 사람을 움직이고 설득할 수 있게 된다. "우선 무엇보다도 상대방의 강한 욕구를 불러일으켜라. 이대로 하는 자가 세상을 얻을 것이다. 그렇지 않은 자는 외로운 길을 걸을 것이다."
무엇이 옳고 그른것과는 상관없이 자존심에 상처를 입은 상대는 그대의 적이 되거나 자기합리화로 자신의 자존감을 지키려 할 뿐이다. 이러한 방식으로는 궁극적으로 사람을 설득할 수 없다.
2. 솔직하고 진지하게 칭찬하라.
아첨과 칭찬을 구분할 줄 알아야한다. 현명한 사람에게 아첨은 먹히지 않는다.
3. 다른 사람들의 강한 욕구를 불러일으켜라.
누구나 자신의 욕구에만 관심이 있을뿐 타인의 욕구에는 관심이 없다. 만약 당신이 타인이 원하는 것에 신경을 쓰는 버릇을 들인다면 사람을 움직이고 설득할 수 있게 된다. "우선 무엇보다도 상대방의 강한 욕구를 불러일으켜라. 이대로 하는 자가 세상을 얻을 것이다. 그렇지 않은 자는 외로운 길을 걸을 것이다."
피드 구독하기:
글 (Atom)








