SlideShare a Scribd company logo
1 of 15
구본탁
1. 입자의 표현.
• ‘입자’ 는 수학적으로는 흔히 점으로 모형화하는 아주 작은 물체이다.
• 하지만 점 도형은 하나의 픽셀로 래스터화가 되므로, 다양한 크기의
입자를 표현하거나 입자에 텍스처를 통째로 입히는 등의 유연한 활용이
힘들다.
• 대신, 나무 빌보드에서 사용했던 것과 같은 방식을 사용한다.
입자를 점으로 저장하되 실제로 렌더링을 할 때에는 Geometry shader로
그 점을 카메라를 바라보는 방향으로 사각형으로 확장한다.
여기서, 나무 빌보드는 y축 방향으로 세워지지만 입자 빌보드는 카메라를
정면으로 바라본다는 것이다.
1. 입자의 표현.
• World Space의 Up Vector인 j의 좌표와 빌보드의 중심 위치 C, 시점의 위치 E를 알고 있다면
빌보드의 Local 좌표계를 World Space의 좌표로 나타낼 수 있으며, 그를 통해 다음과 같이
빌보드의 World Matrix를 만들어 낼 수 있다.
2. 입자의 운동.
• 입자들이 물리적으로 사실감 있게 움직이도록 한다.
• 단순함을 위해서, 입자의 최종가속도(net acceleration)가 고정되어 있다고
가정한다.
또한, 입자사이의 충돌은 고려하지 않는 것으로 한다.
• 곡선을 따라 움직이는 입자의 시간 t에서의 위치가 P(t)라고 한다면, 시간
t에서 입자의 순간 속도는 다음과 같다.
v(t) = p’(t)
• 그리고 시간 t에서의 입자의 순간 가속도는 다음과 같다.
A(t) = v’(t) = p”(t)
2. 입자의 운동.
• 미적분의 기본 사항 몇가지를 보면
1. 함수 f(t)의 부정적분 또는 역도함수 F(t)는 F(t)의 도함수가 f(t)임을
만족하는, 즉 F’(t) = f(t)를 만족하는 임의의 함수이다.
2. F(t)가 f(t)의 임의의 부정적분이고 c가 임의의 상수일 때, F(t)+c도 f(t)의 한
부정적분이다. 또한 f(t)의 모든 부정적분은 F(t) + c의 형태이다.
3. f(t)의 임의의 부정적분을 나타낼 때에는 적분 표기법 ∫ f(x) dt = F(t) +c를 사용한다.
2. 입자의 운동.
• 위에서 보았던 속도와 가속도의 정의를 보면, 속도 함수가 가속도 함수의
한 부정적분이며, 위치 함수가 속도 함수의 한 부정적분이 된다.
따라서, 다음이 성립하게 된다.
p(t) = ∫ ∫ v(t) dt
v(t) = ∫ a(t) dt
• 여기서 가속도를 상수(시간에 따른 변화x) 라고 가정하며, 시간 t=0에서의 입자의 초기
속도 v(0) = v0과 초기 위치 p(0) = p0 을 알고 있다면, 상수 가속도를 적분함으로써
속도함수를 구할 수 있다.
v(t) = ∫ a(t) dt = ta + c
이므로 상수 c는 초기속도로 구할 수 있다.
V(0) = 0 * a + c = c = v0
• 따라서 속도 함수는
v(t) = ta + v0 가 된다.
2. 입자의 운동.
• 위치함수 또한 비슷한 방식으로 구할 수 있다.
1. 우선, 속도함수를 적분한다.
p(t) = ∫ v(t) dt = ∫ (ta + v0) dt = ½ t2a + tv0 + k
2. 이제 상수 k를 초기위치를 이용하여 구할 수 있다.
p(0) = ½ * 0 * a + 0 * v0 + k = k = p0
3. 따라서 위치 함수는
p(t) = ½t2a + tv0 + p0 가 된다.
지금까지 본 식에 의하면 “입자의 궤적”(즉, 임의의 시간 t >= 에서의 입자의 위치) p(t)는 전적으로
초기 위치와 초기속도, 그리고 상수 가속도에 의해서 결정된다는 것을 알 수 있다.
3. 무작위성.
• 입자 시스템의 모든 입자가 비슷하게 움직여야 하지만 모두가 정확히 동일하게
움직인다면 원하는 효과를 얻기가 힘들기 때문에 시스템에 약간의 무작위성을
도입한다.
• 예를 들면 빗방울을 표현한다면 정확히 동일한 방식이 아닌 약간 다른 각도와 빠르기로
떨어지는 것이 더 자연스러운 표현이 된다.
• DX에서는 MathHelper.h/cpp 에 구현되어 있는 RandF 함수와 RandUnitVec3 함수를
사용한다.
4. 혼합과 입자 시스템.
• 입자 시스템에서는 입자들을 어떤 형태로든 혼합해서 그리는 경우가 많다.
예를 들어, 불이나 마법 주문 같은 효과의 경우 입자가 있는 곳은 밝아져야 한다.
• 이를 위해서 가산 혼합, 즉 원본 색상에 대상 색상을 더하는 방식의 혼합이 적합하다.
• 또한 입자들을 반투명하게 그리는 경우도 많다.
• 이러한 경우에는 원본 입자 색상을 그 불투명도에 맞게 비례할 필요가 있다.
즉, 다음과 같은 혼합 매개변수들을 사용해야 한다
SrcBlend = SRC_ALPHA;
DestBlend = ONE;
BlendOp = ADD;
• 이는 다음과 같은 혼합 공식에 해당한다.
C = asCsrc + Cdst
4. 혼합과 입자 시스템.
• 다른 말로 하면, 원본 입자의 색상이 색상들의 합에 기여하는 정도는 원본 입자의
불투명도에 의해 결정된다.
• 미리 텍스처에 불투명도(알파 채널)를 곱해서 텍스처 색상이 그 불투명도에 따라
희석되도록 할 수도 있다.
그렇게 하면 실행시점에서는 그냥 희석된 텍스처를 입자에 적용하면 된다.
• 연기와 같은 입자를 표현할 때에는 입자가 많이 몰릴수록 밝아지는 것을 원하지 않기
때문에, 대상 색상에서 원본 색상을 빼는 감산
연산자(D3D11_BLEND_OP_REV_SUBTRACT)를 사용하는 것이 낫다. 이렇게 하면
연기 입자가 많은 곳일수록 더 어두워지는 효과를 줄 수 있다.
• 예외 상황으로 밝은 회색 연기 같은 경우에는 연기 입자들을 반투명 물체라고 간주하여
투명도 혼합을 적용하는 것이다.
투명도 혼합에서는 혼합할 물체들을 시점 기준으로 뒤에서 앞의 순서로 정렬을 해야
하며, 입자들이 많으면 정렬 비용이 매우 커질 수 있다.
5. 스트림 출력
• GPU에서 텍스처에 자료를 기록할 수 있다.
예를 들어, GPU는 깊이, 스텐실 버퍼에 자료를 기록하며, 후면 버퍼에도 기록한다.
DX에는 스트림 출력 단계가 렌더링 파이프라인에 추가되어 있다.
스트림 출력 단계를 이용하면 GPU에서 스트림 출력 단계에 묶인 정점버퍼 V에
기하구조 자체(정점 목록 형태)를 직접 기록할 수 있다.
• Geometry Shader에서 출력한 정점들이 V에 기록되게 할 수 있다. 그리고 V에 저장된
기하구조를 나중에 렌더링 파이프라인에 입력하여 그리는 것이 가능하다.
5. 스트림 출력
• 스트림 출력을 사용하는 경우 특별한 설정이 없는 한 Geometry Shader가 출력한
정점은 스트림으로 출력될 뿐만 아니라 렌더링 파이프라인의 다음단계인
래스터화기로도 입력된다.
자료를 스트림으로 출력하기만 하고 렌더링하지는 않는 기법에서는 Pixel Shader와
깊이, 스텐실 버퍼를 비활성화해야 한다.
• 혹은 렌더링 파이프라인의 출력 병합기(Output Merge) 단계에 null값에 해당하는
Render Target과 깊이, 스텐실 버퍼를 묶어서 렌더링이 사실상 일어나지 않도록 하는
방법도 있다.
• 이 책에서는 스트림 출력 전용의 한 기법을 사용한다. 이 기법은 전적으로 입자를
생성하고 파괴하는 데에만 쓰인다. 매 프레임마다 아래와 같은 작업을 수행한다.
1. 현재 입자 목록을 스트림 출력 전용으로 그린다. 레스터화기가 비활성화
상태이므로 그어 떤 입자도 화면에는 렌더링되지 않는다.
2. Geometry Shader는 주어진 조건에 따라 입자들을 생성하거나 파괴한다.
3. 갱신된 입자 목록을 스트림 출력을 통해서 정점 버퍼에 기록한다.
6. GPU 기반 입자 시스템
• 일반적으로 입자 시스템은 시간이 흐름에 따라 새 입자들을 방출하거나 기존 입자들을
파괴한다.
이를 수행하는 자연스러운 방식은, 동적 정점 버퍼에 입자들을 담고 cpu에서 입자들을
생성하거나 파괴하는 것이다. 이 경우 동적 정점 버퍼는 항상 현재 활성화 되어있는,
그리고 렌더링 되는 입자들만 담는다, 그러나 스트림 출력 전용 패스를 이용하면 이러한
생성/파괴 갱신 주기를 전적으로 gpu에서 수행하는 것이 가능하다.
• 이러한 방식의 장점은 효율성에 있다.
CPU에서 GPU로 자료를 올리는 데 따르는 추가 부담이 없으며, CPU의 작업이 GPU에
전가 되므로 CPU는 물리나 AI같은 다른 작업을 수행할 수 있게 된다.
6. GPU 기반 입자 시스템
1. 입자 효과
• 한 특정한 입자 시스템의 구체적인 행동방식은 하나의 효과 파일로 구현된다.
다른 말로 하면, 각 입자 시스템(비, 불 연기)마다 서로 다른 효과 파일이 있는 것이다.
입자를 방출하고 파괴하고 그리는 구체적인 방법은 입자 시스템 마다 다르기 때문에,
이처럼 개별적인 효과 파일에서 그러한 세부사항을 구현하는 것이 바람직하다.
2. 방출기 입자
• 입자의 생성과 파괴를 기하 셰이더에서 책임지므로, 입자들을 방출하는 역할을 하는
특발한 종류의 입자인 ‘방출기 입자’(emitter particle)라는 것을 두기로 하면, 방출기
입자는 화면에 그릴 수도, 그리지 않을 수도 있다.
• 특정한 입자들만 다른 입자들을 생성할 수 있게 하는 것은 입자들의 방출 방식을
제어하는 데에 도움이 된다.
• 방출기 입자가 하나도 없다면 더 이상 새 입자가 생성되지 않으므로, 입자 시스템이
계속해서 유지되려면 스트림 출력 전용 Geometry Shader가 매 프레임마다 방출기
입자를 적어도 하나씩은 출력해야 한다.
감사합니다.

More Related Content

Similar to 14장 입자 시스템과 스트림 출력.pptx

Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화QooJuice
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)Sukwoo Lee
 
Reflective Shadow Maps
Reflective Shadow MapsReflective Shadow Maps
Reflective Shadow MapsBongseok Cho
 
The fastalgorithmfordeepbeliefnets
The fastalgorithmfordeepbeliefnetsThe fastalgorithmfordeepbeliefnets
The fastalgorithmfordeepbeliefnetsLee Gyeong Hoon
 
Energy based models and boltzmann machines
Energy based models and boltzmann machinesEnergy based models and boltzmann machines
Energy based models and boltzmann machinesSoowan Lee
 
Direct Sparse Odometry (DSO) Review
Direct Sparse Odometry (DSO) ReviewDirect Sparse Odometry (DSO) Review
Direct Sparse Odometry (DSO) ReviewEdwardIm1
 
Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadowMoonLightMS
 
[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1MoonLightMS
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자MoonLightMS
 
면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례Soochan Park
 
Ray-triangle intersection
Ray-triangle intersectionRay-triangle intersection
Ray-triangle intersection동환 김
 
Convolutional neural networks
Convolutional neural networksConvolutional neural networks
Convolutional neural networksHyunjinBae3
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기Chris Ohk
 
[컴퓨터비전과 인공지능] 5. 신경망
[컴퓨터비전과 인공지능] 5. 신경망[컴퓨터비전과 인공지능] 5. 신경망
[컴퓨터비전과 인공지능] 5. 신경망jdo
 
Pose Graph based SLAM
Pose Graph based SLAMPose Graph based SLAM
Pose Graph based SLAMEdwardIm1
 
GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단Mark Choi
 

Similar to 14장 입자 시스템과 스트림 출력.pptx (20)

Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
Motion blur
Motion blurMotion blur
Motion blur
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
 
Reflective Shadow Maps
Reflective Shadow MapsReflective Shadow Maps
Reflective Shadow Maps
 
The fastalgorithmfordeepbeliefnets
The fastalgorithmfordeepbeliefnetsThe fastalgorithmfordeepbeliefnets
The fastalgorithmfordeepbeliefnets
 
Energy based models and boltzmann machines
Energy based models and boltzmann machinesEnergy based models and boltzmann machines
Energy based models and boltzmann machines
 
Direct Sparse Odometry (DSO) Review
Direct Sparse Odometry (DSO) ReviewDirect Sparse Odometry (DSO) Review
Direct Sparse Odometry (DSO) Review
 
Sw occlusion culling
Sw occlusion cullingSw occlusion culling
Sw occlusion culling
 
Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadow
 
[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자
 
7_조명.pptx
7_조명.pptx7_조명.pptx
7_조명.pptx
 
면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례면접 대비 벡터, CS 개념과 사례
면접 대비 벡터, CS 개념과 사례
 
Ray-triangle intersection
Ray-triangle intersectionRay-triangle intersection
Ray-triangle intersection
 
Convolutional neural networks
Convolutional neural networksConvolutional neural networks
Convolutional neural networks
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
 
[컴퓨터비전과 인공지능] 5. 신경망
[컴퓨터비전과 인공지능] 5. 신경망[컴퓨터비전과 인공지능] 5. 신경망
[컴퓨터비전과 인공지능] 5. 신경망
 
Pose Graph based SLAM
Pose Graph based SLAMPose Graph based SLAM
Pose Graph based SLAM
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단
 

More from HolyTak

Graphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptxGraphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptxHolyTak
 
Graphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptxGraphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptxHolyTak
 
Graphics 2장 행렬.pptx
Graphics 2장 행렬.pptxGraphics 2장 행렬.pptx
Graphics 2장 행렬.pptxHolyTak
 
Windosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptxWindosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptxHolyTak
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxHolyTak
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxHolyTak
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxHolyTak
 
Windosw via c 스터디17장
Windosw via c 스터디17장Windosw via c 스터디17장
Windosw via c 스터디17장HolyTak
 
Windosw via c 스터디12장
Windosw via c 스터디12장Windosw via c 스터디12장
Windosw via c 스터디12장HolyTak
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장HolyTak
 
Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장HolyTak
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장HolyTak
 

More from HolyTak (12)

Graphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptxGraphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptx
 
Graphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptxGraphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptx
 
Graphics 2장 행렬.pptx
Graphics 2장 행렬.pptxGraphics 2장 행렬.pptx
Graphics 2장 행렬.pptx
 
Windosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptxWindosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptx
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptx
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptx
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptx
 
Windosw via c 스터디17장
Windosw via c 스터디17장Windosw via c 스터디17장
Windosw via c 스터디17장
 
Windosw via c 스터디12장
Windosw via c 스터디12장Windosw via c 스터디12장
Windosw via c 스터디12장
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 
Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
 

Recently uploaded

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 

Recently uploaded (6)

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

14장 입자 시스템과 스트림 출력.pptx

  • 2. 1. 입자의 표현. • ‘입자’ 는 수학적으로는 흔히 점으로 모형화하는 아주 작은 물체이다. • 하지만 점 도형은 하나의 픽셀로 래스터화가 되므로, 다양한 크기의 입자를 표현하거나 입자에 텍스처를 통째로 입히는 등의 유연한 활용이 힘들다. • 대신, 나무 빌보드에서 사용했던 것과 같은 방식을 사용한다. 입자를 점으로 저장하되 실제로 렌더링을 할 때에는 Geometry shader로 그 점을 카메라를 바라보는 방향으로 사각형으로 확장한다. 여기서, 나무 빌보드는 y축 방향으로 세워지지만 입자 빌보드는 카메라를 정면으로 바라본다는 것이다.
  • 3. 1. 입자의 표현. • World Space의 Up Vector인 j의 좌표와 빌보드의 중심 위치 C, 시점의 위치 E를 알고 있다면 빌보드의 Local 좌표계를 World Space의 좌표로 나타낼 수 있으며, 그를 통해 다음과 같이 빌보드의 World Matrix를 만들어 낼 수 있다.
  • 4. 2. 입자의 운동. • 입자들이 물리적으로 사실감 있게 움직이도록 한다. • 단순함을 위해서, 입자의 최종가속도(net acceleration)가 고정되어 있다고 가정한다. 또한, 입자사이의 충돌은 고려하지 않는 것으로 한다. • 곡선을 따라 움직이는 입자의 시간 t에서의 위치가 P(t)라고 한다면, 시간 t에서 입자의 순간 속도는 다음과 같다. v(t) = p’(t) • 그리고 시간 t에서의 입자의 순간 가속도는 다음과 같다. A(t) = v’(t) = p”(t)
  • 5. 2. 입자의 운동. • 미적분의 기본 사항 몇가지를 보면 1. 함수 f(t)의 부정적분 또는 역도함수 F(t)는 F(t)의 도함수가 f(t)임을 만족하는, 즉 F’(t) = f(t)를 만족하는 임의의 함수이다. 2. F(t)가 f(t)의 임의의 부정적분이고 c가 임의의 상수일 때, F(t)+c도 f(t)의 한 부정적분이다. 또한 f(t)의 모든 부정적분은 F(t) + c의 형태이다. 3. f(t)의 임의의 부정적분을 나타낼 때에는 적분 표기법 ∫ f(x) dt = F(t) +c를 사용한다.
  • 6. 2. 입자의 운동. • 위에서 보았던 속도와 가속도의 정의를 보면, 속도 함수가 가속도 함수의 한 부정적분이며, 위치 함수가 속도 함수의 한 부정적분이 된다. 따라서, 다음이 성립하게 된다. p(t) = ∫ ∫ v(t) dt v(t) = ∫ a(t) dt • 여기서 가속도를 상수(시간에 따른 변화x) 라고 가정하며, 시간 t=0에서의 입자의 초기 속도 v(0) = v0과 초기 위치 p(0) = p0 을 알고 있다면, 상수 가속도를 적분함으로써 속도함수를 구할 수 있다. v(t) = ∫ a(t) dt = ta + c 이므로 상수 c는 초기속도로 구할 수 있다. V(0) = 0 * a + c = c = v0 • 따라서 속도 함수는 v(t) = ta + v0 가 된다.
  • 7. 2. 입자의 운동. • 위치함수 또한 비슷한 방식으로 구할 수 있다. 1. 우선, 속도함수를 적분한다. p(t) = ∫ v(t) dt = ∫ (ta + v0) dt = ½ t2a + tv0 + k 2. 이제 상수 k를 초기위치를 이용하여 구할 수 있다. p(0) = ½ * 0 * a + 0 * v0 + k = k = p0 3. 따라서 위치 함수는 p(t) = ½t2a + tv0 + p0 가 된다. 지금까지 본 식에 의하면 “입자의 궤적”(즉, 임의의 시간 t >= 에서의 입자의 위치) p(t)는 전적으로 초기 위치와 초기속도, 그리고 상수 가속도에 의해서 결정된다는 것을 알 수 있다.
  • 8. 3. 무작위성. • 입자 시스템의 모든 입자가 비슷하게 움직여야 하지만 모두가 정확히 동일하게 움직인다면 원하는 효과를 얻기가 힘들기 때문에 시스템에 약간의 무작위성을 도입한다. • 예를 들면 빗방울을 표현한다면 정확히 동일한 방식이 아닌 약간 다른 각도와 빠르기로 떨어지는 것이 더 자연스러운 표현이 된다. • DX에서는 MathHelper.h/cpp 에 구현되어 있는 RandF 함수와 RandUnitVec3 함수를 사용한다.
  • 9. 4. 혼합과 입자 시스템. • 입자 시스템에서는 입자들을 어떤 형태로든 혼합해서 그리는 경우가 많다. 예를 들어, 불이나 마법 주문 같은 효과의 경우 입자가 있는 곳은 밝아져야 한다. • 이를 위해서 가산 혼합, 즉 원본 색상에 대상 색상을 더하는 방식의 혼합이 적합하다. • 또한 입자들을 반투명하게 그리는 경우도 많다. • 이러한 경우에는 원본 입자 색상을 그 불투명도에 맞게 비례할 필요가 있다. 즉, 다음과 같은 혼합 매개변수들을 사용해야 한다 SrcBlend = SRC_ALPHA; DestBlend = ONE; BlendOp = ADD; • 이는 다음과 같은 혼합 공식에 해당한다. C = asCsrc + Cdst
  • 10. 4. 혼합과 입자 시스템. • 다른 말로 하면, 원본 입자의 색상이 색상들의 합에 기여하는 정도는 원본 입자의 불투명도에 의해 결정된다. • 미리 텍스처에 불투명도(알파 채널)를 곱해서 텍스처 색상이 그 불투명도에 따라 희석되도록 할 수도 있다. 그렇게 하면 실행시점에서는 그냥 희석된 텍스처를 입자에 적용하면 된다. • 연기와 같은 입자를 표현할 때에는 입자가 많이 몰릴수록 밝아지는 것을 원하지 않기 때문에, 대상 색상에서 원본 색상을 빼는 감산 연산자(D3D11_BLEND_OP_REV_SUBTRACT)를 사용하는 것이 낫다. 이렇게 하면 연기 입자가 많은 곳일수록 더 어두워지는 효과를 줄 수 있다. • 예외 상황으로 밝은 회색 연기 같은 경우에는 연기 입자들을 반투명 물체라고 간주하여 투명도 혼합을 적용하는 것이다. 투명도 혼합에서는 혼합할 물체들을 시점 기준으로 뒤에서 앞의 순서로 정렬을 해야 하며, 입자들이 많으면 정렬 비용이 매우 커질 수 있다.
  • 11. 5. 스트림 출력 • GPU에서 텍스처에 자료를 기록할 수 있다. 예를 들어, GPU는 깊이, 스텐실 버퍼에 자료를 기록하며, 후면 버퍼에도 기록한다. DX에는 스트림 출력 단계가 렌더링 파이프라인에 추가되어 있다. 스트림 출력 단계를 이용하면 GPU에서 스트림 출력 단계에 묶인 정점버퍼 V에 기하구조 자체(정점 목록 형태)를 직접 기록할 수 있다. • Geometry Shader에서 출력한 정점들이 V에 기록되게 할 수 있다. 그리고 V에 저장된 기하구조를 나중에 렌더링 파이프라인에 입력하여 그리는 것이 가능하다.
  • 12. 5. 스트림 출력 • 스트림 출력을 사용하는 경우 특별한 설정이 없는 한 Geometry Shader가 출력한 정점은 스트림으로 출력될 뿐만 아니라 렌더링 파이프라인의 다음단계인 래스터화기로도 입력된다. 자료를 스트림으로 출력하기만 하고 렌더링하지는 않는 기법에서는 Pixel Shader와 깊이, 스텐실 버퍼를 비활성화해야 한다. • 혹은 렌더링 파이프라인의 출력 병합기(Output Merge) 단계에 null값에 해당하는 Render Target과 깊이, 스텐실 버퍼를 묶어서 렌더링이 사실상 일어나지 않도록 하는 방법도 있다. • 이 책에서는 스트림 출력 전용의 한 기법을 사용한다. 이 기법은 전적으로 입자를 생성하고 파괴하는 데에만 쓰인다. 매 프레임마다 아래와 같은 작업을 수행한다. 1. 현재 입자 목록을 스트림 출력 전용으로 그린다. 레스터화기가 비활성화 상태이므로 그어 떤 입자도 화면에는 렌더링되지 않는다. 2. Geometry Shader는 주어진 조건에 따라 입자들을 생성하거나 파괴한다. 3. 갱신된 입자 목록을 스트림 출력을 통해서 정점 버퍼에 기록한다.
  • 13. 6. GPU 기반 입자 시스템 • 일반적으로 입자 시스템은 시간이 흐름에 따라 새 입자들을 방출하거나 기존 입자들을 파괴한다. 이를 수행하는 자연스러운 방식은, 동적 정점 버퍼에 입자들을 담고 cpu에서 입자들을 생성하거나 파괴하는 것이다. 이 경우 동적 정점 버퍼는 항상 현재 활성화 되어있는, 그리고 렌더링 되는 입자들만 담는다, 그러나 스트림 출력 전용 패스를 이용하면 이러한 생성/파괴 갱신 주기를 전적으로 gpu에서 수행하는 것이 가능하다. • 이러한 방식의 장점은 효율성에 있다. CPU에서 GPU로 자료를 올리는 데 따르는 추가 부담이 없으며, CPU의 작업이 GPU에 전가 되므로 CPU는 물리나 AI같은 다른 작업을 수행할 수 있게 된다.
  • 14. 6. GPU 기반 입자 시스템 1. 입자 효과 • 한 특정한 입자 시스템의 구체적인 행동방식은 하나의 효과 파일로 구현된다. 다른 말로 하면, 각 입자 시스템(비, 불 연기)마다 서로 다른 효과 파일이 있는 것이다. 입자를 방출하고 파괴하고 그리는 구체적인 방법은 입자 시스템 마다 다르기 때문에, 이처럼 개별적인 효과 파일에서 그러한 세부사항을 구현하는 것이 바람직하다. 2. 방출기 입자 • 입자의 생성과 파괴를 기하 셰이더에서 책임지므로, 입자들을 방출하는 역할을 하는 특발한 종류의 입자인 ‘방출기 입자’(emitter particle)라는 것을 두기로 하면, 방출기 입자는 화면에 그릴 수도, 그리지 않을 수도 있다. • 특정한 입자들만 다른 입자들을 생성할 수 있게 하는 것은 입자들의 방출 방식을 제어하는 데에 도움이 된다. • 방출기 입자가 하나도 없다면 더 이상 새 입자가 생성되지 않으므로, 입자 시스템이 계속해서 유지되려면 스트림 출력 전용 Geometry Shader가 매 프레임마다 방출기 입자를 적어도 하나씩은 출력해야 한다.

Editor's Notes

  1. 입자시스템에 대해 알아본다. 입자시스템은 풀, 비, 연기, 폭파, 스킬이펙트, 발사체 같은 다양한 현상과 사물을 나타내는데에 쓰인다.
  2. 오른쪽에는 DX에서 쓰는 particle 구조체 인데 크기와 위치 이외의 속성들을 가지고 있다.
  3. 부정적분은 어떤 함수를 도함수로 하는 모든 함수를 구하는 연산이다. Integral로 읽는다.
  4. 지금까지 본 식에 의하면 “입자의 궤적”(즉, 임의의 시간 t >= 에서의 입자의 위치) p(t)는 전적으로 초기 위치와 초기속도, 그리고 상수 가속도에 의해서 결정된다는 것을 알 수 있다.
  5. 스트림 출력을 위해서는 기하셰이더를 특별한 형태로 작성을 해야하는데, 함수를 이용해서 셰이더를 작성한다. 아래 이미지는 렌더링 파이프라인의 일부이며 이미지를 보면 기하셰이더 단계 직후 스트림 출력을 하는 것을 볼 수 있다.
  6. 이후 프로그램은 현재 프레임에서 갱신된 입자 목록을 다른 어떤 렌더링 기법을 이용해서 화면에 그린다. 이 방식은 Geometry Shader가 서로 다른 두종류의 일을 한다. 스트림 출력 전용 기법에서는 입자들을 입력받아서 갱신한 후 출력해애 하며 화면 렌더링 기법에서는 주어진 점을 카메라를 향한 사각형으로 확장해야 한다. 두 경우에서 이 셰이더가 출력하는 기본도형 종류 자체가 다르므로 geometry shader를 두종류로 만들어 둘 필요가 있다.
  7. 예를들면 비는 땅에 닿으면 파괴해야하는 반면 불은 방출 몇초 후에 파괴하는것이 자연스럽다. 연기는 시간이 흐르면 희미해지도록 한다.